我正在使用fswebcam通过在树莓派上运行的node-red exec块来捕获图像。捕获图像所需的时间为3+秒。
fswebcam -r 1280x720 image.jpg
我使用OpenCV尝试了相同的结果,结果略好但相似。
from cv2 import *
cam = VideoCapture(1)
s, img = cam.read()
if s:
imwrite("/home/pi/pythontest/tt.jpg",img) #save image
cam.release()
我猜想USB相机初始化和拍照需要花费一些时间,这会大大增加时间。有什么办法可以保持相机初始化?还有其他解决方法可以改善此问题吗?
[尝试分析您的代码(例如,使用cProfile
),以确保问题不在python解释器启动时间或imwrite
中。如果问题是相机初始化,那么我认为唯一的选择是编写一个守护程序,该守护程序将使相机保持联机状态,并根据您的要求为您提供图像]
可能还有其他方法,但是一种方法是在需要更快响应的期间连续运行相机。不过,您将需要考虑一些事项:
我将让您确定要使用的分辨率所需的USB带宽。
关于第二个-SD卡的磨损-我建议您捕获到/tmp
,并通过成为root
并向/etc/fstab
添加这样的一行来确保它基于RAM文件系统:
tmpfs /tmp tmpfs defaults,noatime,nosuid 0 0
然后重新启动。这样,数据永远不会靠近SD卡。
关于第三张-仍拍摄不完整的图像-您可以利用--exec
的fswebcam
选项解决此问题。基本上,您捕获到一个文件,然后完成该文件,然后使用--exec
将文件重命名为/tmp/latest.jpg
,然后在应用程序中使用它。
fswebcam -r 640x480 --loop 1 --exec 'mv /tmp/inprogress.jpg /tmp/latest.jpg' /tmp/inprogress.jpg
这取决于以下事实:至少在Unix下,重命名文件不会影响打开该文件的任何进程,并且重命名是原子的。因此,您的应用程序将始终获得完整的新文件或完整的旧文件,并且永远不会再写入一半文件。
我的相机产生的图像约为160kB,所以我在一个紧紧的循环中测试了文件大小,尽可能快地读取文件,并且仅在文件大小小于正常大小时才通知我,即被截断:
while : ; do l=$(wc -c < latest.jpg); [[ $l -lt 140000 ]] && echo $l; done