【发布时间】:2017-02-10 18:04:36
【问题描述】:
我正在尝试从 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 带宽限制的信息,但是:
- 这发生在第一次迭代中(从右边开始的第一个 read())
- 我不需要接近 60 甚至 30 FPS,但无法通过 VideoCapture 参数降低“请求的 FPS”(如果这有意义的话)
- 添加睡眠似乎没有帮助,即使在左/右读取之间也是如此
- 奇怪的是,如果我进行大量处理(在 while 循环中),我开始注意到“滞后”:现实世界中发生的事情在读取图像时显示得更晚。这表明实际上在某处有一个缓冲区可以并且确实会累积多张图像(很多)
我尝试了一种解决方法,即为每个读取的图像创建和发布一个单独的 VideoCapture,但这总体上有点太慢(
我试图了解为什么会失败,以便找到解决方案。看起来 v4l 正在分配一个全局太小的缓冲区,以某种方式被 2 个捕获对象使用。 任何帮助将不胜感激。
【问题讨论】: