Opencv USB网络摄像头在raspberry pi上拍照太慢

Opencv USB网络摄像头在raspberry pi上拍照太慢,opencv,raspberry-pi,usb,webcam,node-red,Opencv,Raspberry Pi,Usb,Webcam,Node Red,我使用fswebcam在raspberry pi上运行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

我使用fswebcam在raspberry pi上运行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
中。 如果问题出现在摄像头初始化中,那么我认为唯一的选择是编写一个守护进程,该守护进程将使摄像头保持在线,并根据您的请求提供一个图像

尝试分析您的代码(例如使用
cProfile
),以确保问题不在python解释器启动时间或
imwrite

如果摄像机初始化中存在问题,那么我认为唯一的选项是编写一个守护进程,使摄像机保持在线,并根据您的请求提供图像

可能还有其他方法,但其中一种方法是在需要更快响应的期间连续运行摄像机。你需要考虑一些事情:

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

我将留给您确定您使用的分辨率所需的USB带宽


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

tmpfs   /tmp    tmpfs   defaults,noatime,nosuid 0   0
然后重新启动。这样,数据就不会靠近SD卡


关于第三个-仍在拍摄的不完整图像-您可以利用
fswebcam
--exec
选项来解决此问题。基本上,捕获一个文件,然后在完成后,使用
--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
while:;do l=$(wc-c<最新.jpg);[[$l-lt 140000]]和&echo$l;完成

可能还有其他方法,但其中一种方法是在需要更快响应的时段连续运行相机。你需要考虑一些事情:

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

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


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

tmpfs   /tmp    tmpfs   defaults,noatime,nosuid 0   0
然后重新启动。这样,数据就不会靠近SD卡


关于第三个-仍在拍摄的不完整图像-您可以利用
fswebcam
--exec
选项来解决此问题。基本上,捕获一个文件,然后在完成后,使用
--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
while:;dol=$(wc-c
你是如何处理这件事的?运气好吗?你是怎么做到的?运气好吗?