使用SimpleCV运动检测捕获运动图像

时间:2017-06-17 08:59:50

标签: python raspberry-pi

我使用Raspberry Pi 3使用SimpleCV检测运动,然后在检测到运动时应拍摄图像。我正在使用USB相机。这是我使用的代码:

from SimpleCV import *
import os

cam = Camera()
threshold = 5.0 # if mean exceeds this amount do something

while True:
    previous = cam.getImage() #grab a frame
    time.sleep(0.5) #wait for half a second
    current = cam.getImage() #grab another frame
    diff = current - previous
    matrix = diff.getNumpy()
    mean = matrix.mean()



    if mean >= threshold:
        time.sleep(2)
        os.popen("fswebcam -d /dev/video0 -r 352x280 
        /home/pi/Desktop/image.jpg")
        print "Motion Detected"

当检测到动作时,它会打印"动态侦测",以便它可以正常工作,但不会拍摄任何图像。我试过运行fswebcam -d / dev / video0 -r 352x280             终端中的/home/pi/Desktop/image.jpg并且工作正常。另外,当我运行代码自己在python中获取图像时,它也有效,但在if语句中它不会起作用。我尝试从终端运行程序,再次运动检测工作,但我收到此错误: 选择输入0时出错 VIDEO_S_Input:设备或资源繁忙

这里的问题是什么?

1 个答案:

答案 0 :(得分:0)

文档中提到,一旦您拥有一个活动的Camera实例,资源就会被锁定。

SimpleCV Camera Class文档在这里:

class Camera(FrameSource):
    """
    **SUMMARY**
    The Camera class is the class for managing input from a basic camera.  Note
    that once the camera is initialized, it will be locked from being used
    by other processes.  You can check manually if you have compatible devices
    on linux by looking for /dev/video* devices.

当您的资源被锁定时,它不可用或仍然忙于fswebcam访问。

相反,因为您已经拥有了相机cam的实例,请使用它来捕获图像,如下所示:

img = cam.getImage()
img.save("motion.jpg")

替代解决方案

你可以在下面的行之前del cam.capture

os.popen("fswebcam -d /dev/video0 -r 352x280 /home/pi/Desktop/image.jpg")