树莓派相机运动检测

时间:2015-05-23 18:12:06

标签: python opencv raspberry-pi

我正在编写运动检测系统,使用Raspberry Pi,官方Raspberry Pi Camera和OpenCV with Python。当我使用absdiff和bitwise_and操作时,它会出现这个:

  

OpenCV错误:cvtColor中的断言失败(scn == 3 || scn == 4),   文件/home/pi/opencv-2.4.10/modules/imgproc/src/color.cpp,第3739行   回溯(最近一次调用最后一次):文件“icanseeu-diff.py”,第18行,   在       t_minus = cv2.cvtColor(camera.capture(rawCapture,format =“bgr”,use_video_port = True),cv2.COLOR_RGB2GRAY)cv2.error:   /home/pi/opencv-2.4.10/modules/imgproc/src/color.cpp:3739:错误:   (-215)scn == 3 || scn == 4 in function cvtColor

以下是代码:

import cv2
from picamera.array import PiRGBArray
from picamera import PiCamera
import time

camera = PiCamera()
camera.resolution = (320, 240)
camera.framerate = 30
camera.rotation = 180 
rawCapture = PiRGBArray(camera, size = (320, 240))

def diffImg(t0, t1, t2):
    d1 = cv2.absdiff(t2, t1)
    d2 = cv2.absdiff(t1, t0)
    return cv2.bitwise_and(d1, d2)

# Read three images first
frame1 = cv2.cvtColor(camera.capture(rawCapture, format = "bgr", use_video_port = True), cv2.COLOR_RGB2GRAY)
frame2 = cv2.cvtColor(camera.capture(rawCapture, format = "bgr", use_video_port = True), cv2.COLOR_RGB2GRAY)
frame3 = cv2.cvtColor(camera.capture(rawCapture, format = "bgr", use_video_port = True), cv2.COLOR_RGB2GRAY)

while True:
    cv2.imshow( motions, diffImg(t_minus, t, t_plus) )

    # Read next image
    frame1 = frame2
    frame2 = frame3
    frame3 = cv2.cvtColor(camera.capture(rawCapture, format = "bgr", use_video_port = True), cv2.COLOR_RGB2GRAY)

    key = cv2.waitKey(10)
    if key == 27:
        cv2.destroyWindow(motions)
        break

似乎是一个分配问题,但我不知道如何处理它。我该怎么办?谢谢!

3 个答案:

答案 0 :(得分:0)

您收到的错误消息是通知您正在传递的图像没有3或4个通道。这是失败的评估。

这是因为camera.capture函数不返回任何值(API Documentation)。相反,rawCapture会更新,您应该将其传递给cvtColor

而不是

frame1 = cv2.cvtColor(camera.capture(rawCapture, format = "bgr", use_video_port = True), cv2.COLOR_RGB2GRAY)

使用

rawCapture.truncate()
camera.capture(rawCapture, format = "bgr", use_video_port = True)
frame1 = cv2.cvtColor(rawCapture.array, cv2.COLOR_BGR2GRAY)

每次拍摄图像时都是如此。

我还没有能够测试这个,因为我现在没有Raspberry Pi和相机,但它应该解决问题。

答案 1 :(得分:0)

我认为你没有关闭你的相机,所以python认为相机是由另一个程序使用的。尝试重新启动你的Pi。程序应该在重启后工作。重启后程序的第二次启动不起作用。如果发生这种情况,请在最后一个if语句中关闭相机。

答案 2 :(得分:0)

为了节省您的时间,我构建了一个完整的应用程序来检测动作并通知iOS / Android。通知将包含文本,图像和视频。 Check this out