raspberry pi 摄像头移动侦测
raspberry pi camera motion detection
我正在使用 Raspberry Pi、官方 Raspberry Pi 相机和使用 Python 的 OpenCV 编写运动检测系统。当我使用 absdiff 和 bitwise_and 操作时,它得出以下结果:
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor,
file /home/pi/opencv-2.4.10/modules/imgproc/src/color.cpp, line 3739
Traceback (most recent call last): File "icanseeu-diff.py", line 18,
in
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: error:
(-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 或 4 个通道。这是失败的评估。
这是因为 camera.capture
函数没有 return 任何值 (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 和相机,但它应该可以解决问题。
我认为你没有关闭相机,所以python认为相机被另一个程序使用了。尝试重新启动你的 Pi。该程序应该在重新启动后工作。重启后第二次启动程序将不起作用。如果发生这种情况,请在最后一个 if 语句中关闭相机。
为了节省您的时间,我构建了一个完整的应用程序来检测运动并通知 iOS/Android。通知将包含文本、图像和视频。
Check this out
我正在使用 Raspberry Pi、官方 Raspberry Pi 相机和使用 Python 的 OpenCV 编写运动检测系统。当我使用 absdiff 和 bitwise_and 操作时,它得出以下结果:
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cvtColor, file /home/pi/opencv-2.4.10/modules/imgproc/src/color.cpp, line 3739 Traceback (most recent call last): File "icanseeu-diff.py", line 18, in 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: error: (-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 或 4 个通道。这是失败的评估。
这是因为 camera.capture
函数没有 return 任何值 (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 和相机,但它应该可以解决问题。
我认为你没有关闭相机,所以python认为相机被另一个程序使用了。尝试重新启动你的 Pi。该程序应该在重新启动后工作。重启后第二次启动程序将不起作用。如果发生这种情况,请在最后一个 if 语句中关闭相机。
为了节省您的时间,我构建了一个完整的应用程序来检测运动并通知 iOS/Android。通知将包含文本、图像和视频。 Check this out