Opencv立体相机捕获和帧限制

时间:2016-10-02 19:16:03

标签: linux opencv v4l2

我正试图从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:开启错误:设备上没有剩余空间

我已经阅读了有关USB带宽的限制,但是:

  • 这发生在第一次迭代(右起第一次读取())
  • 我不需要接近60甚至30 FPS,但无法通过VideoCapture参数减少“请求的FPS”(如果这样做有意义)
  • 添加睡眠似乎没有帮助,即使在左/右读取之间
  • 奇怪的是,如果我做了很多处理(在while循环中),我开始注意到“滞后”:现实世界中发生的事情会在稍后的图像上显示出来。这表明实际上有一个缓冲区可以并且确实累积了几个图像(很多)

我尝试了为每个图像读取创建和发布单独的VideoCapture的解决方法,但总体来说这有点太慢(< 1FPS),更重要的是,图像对于立体匹配工作太不同步了。

我试图理解为什么会失败,以便找到解决方案。看起来v4l正在分配一个全局太小的缓冲区,由2个捕获对象以某种方式使用。 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题并找到了答案 - https://superuser.com/questions/431759/using-multiple-usb-webcams-in-linux

由于两个minoru摄像机都显示格式为“YUYV'”,这可能是USB带宽问题。我将每秒的帧数降低到20(24小时没有工作),我可以看到640x480的图像。