我正在编写运动检测系统,使用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
似乎是一个分配问题,但我不知道如何处理它。我该怎么办?谢谢!
答案 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