linux - Opencv 立体相机捕获和帧率限制

标签 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: 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/

相关文章:

sql - 在 shell 中自动安装和创建 postgresql 数据库

python - 使用StereoBM测量绝对距离

c++ - OpenGL : Strange behaviour 中的 OpenCV 图像

c++ - 如何通过opencv计算图像中两个圆的距离

c++ - 如何将 MJPEG 解码为原始 RGB(或 YUV)数据

c++ - 我不明白的关于默认构造函数的一些事情

linux - 使.a对应.so

Linux 环境中 MS Windows 的 C++11 编译器

ubuntu - 使用 gstreamer-1.0 没有这样的元素 "v4l2src",但存在于 gstreamer-0.10 [UBUNTU 16.04.2 LTS]

c++ - Video4Linux 在开始捕获时崩溃