USB网络摄像头在树莓派上拍摄照片太慢了

问题描述 投票:1回答:2

我正在使用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相机初始化和拍照需要花费一些时间,这会大大增加时间。有什么办法可以保持相机初始化?还有其他解决方法可以改善此问题吗?

opencv raspberry-pi usb webcam node-red
2个回答
0
投票

[尝试分析您的代码(例如,使用cProfile),以确保问题不在python解释器启动时间或imwrite中。如果问题是相机初始化,那么我认为唯一的选择是编写一个守护程序,该守护程序将使相机保持联机状态,并根据您的要求为您提供图像]


0
投票

可能还有其他方法,但是一种方法是在需要更快响应的期间连续运行相机。不过,您将需要考虑一些事项:

  • 用于捕获图像的带宽
  • SD卡上的磨损
  • 在捕获过程中访问不完整的图像。

我将让您确定要使用的分辨率所需的USB带宽。


关于第二个-SD卡的磨损-我建议您捕获到/tmp,并通过成为root并向/etc/fstab添加这样的一行来确保它基于RAM文件系统:

tmpfs   /tmp    tmpfs   defaults,noatime,nosuid 0   0

然后重新启动。这样,数据永远不会靠近SD卡。


关于第三张-仍拍摄不完整的图像-您可以利用--execfswebcam选项解决此问题。基本上,您捕获到一个文件,然后完成该文件,然后使用--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
© www.soinside.com 2019 - 2024. All rights reserved.