我正在使用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相机初始化和拍摄照片会花费一些时间,这会大大增加时间。有什么办法可以保持相机初始化? 还有其他解决方法可以改善此问题吗?
答案 0 :(得分:0)
尝试配置您的代码(例如,使用cProfile
),以确保问题不在python解释器启动时间或imwrite
中。
如果问题在于相机初始化,那么我想唯一的选择就是编写一个守护程序,该守护程序将使相机保持在线状态,并根据您的请求为您提供图像
答案 1 :(得分:0)
可能还有其他方法,但是一种方法是在需要更快响应的期间连续运行相机。不过,您将需要考虑一些事项:
我将让您确定要使用的分辨率所需的USB带宽。
关于第二个问题– SD卡磨损–我建议您捕获到/tmp
并通过成为root
并在{ {1}}:
/etc/fstab
然后重新启动。这样,数据永远不会靠近SD卡。
关于第三个-仍捕获不完整的图像-您可以利用tmpfs /tmp tmpfs defaults,noatime,nosuid 0 0
的{{1}}选项来解决此问题。基本上,您捕获到一个文件,然后将其捕获,然后使用--exec
将文件重命名为fswebcam
,然后在应用程序中使用它。
--exec
这依赖于以下事实:至少在Unix下,重命名文件不会影响打开该文件的任何进程,并且重命名是原子的。因此,您的应用程序将始终获得整个新文件或整个旧文件,而永远不会获得一半的文件。
我的相机产生大约160kB的图像,所以我在一个紧紧的循环中测试了文件大小,尽可能快地读取文件,并且仅在文件大小远远小于正常大小时才通知我,即被截断了:
/tmp/latest.jpg