我正在尝试从 Minoru 立体网络摄像头中获取成对图像,目前通过 Linux 上的 opencv。 当我强制使用低分辨率时它工作正常:
left = cv2.VideoCapture(0)
left.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 320)
left.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 240)
right = cv2.VideoCapture(0)
right.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, 320)
right.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, 240)
while True:
_, left_img = left.read()
_, right_img = right.read()
...
但是,我正在使用图像来创建深度图,分辨率越大越好。但是,如果我尝试保留默认值,或将分辨率强制设置为 640x480,则会遇到错误:
libv4l2: error turning on stream: No space left on device
我已阅读有关 USB 带宽限制的内容,但是:
- 这发生在第一次迭代时(右起第一个 read())
- 我不需要接近 60 甚至 30 FPS,但无法通过 VideoCapture 参数降低“请求的 FPS”(如果这有意义的话)
- 增加 sleep 似乎没有帮助,即使是在左/右阅读之间
- 奇怪的是,如果我做了很多处理(在 while 循环中),我会开始注意到“滞后”:现实世界中发生的事情在读取图像时显示得晚得多。这表明实际上某处有一个缓冲区可以并且确实可以累积多个图像(很多)
我尝试了一种解决方法,即为每个图像读取创建和发布一个单独的 VideoCapture,但这总体上有点太慢(< 1FPS),更重要的是,图像在立体匹配方面过于不同步。
我试图了解为什么会失败,以便找到解决方案。看起来 v4l 正在分配一个全局太小的缓冲区,以某种方式被 2 个捕获对象使用。 任何帮助将不胜感激。
最佳答案
我遇到了同样的问题并找到了这个答案 - https://superuser.com/questions/431759/using-multiple-usb-webcams-in-linux
由于两个 minoru 相机都显示格式为“YUYV”,这可能是 USB 带宽问题。我将每秒帧数降低到 20(在 24 时不起作用),我可以看到两个 640x480 图像。
关于linux - Opencv 立体相机捕获和帧率限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820680/