使用 OpenCV 来自 2 个摄像头(用于立体视觉)的视频,但其中一个摄像头滞后

Posted

技术标签:

【中文标题】使用 OpenCV 来自 2 个摄像头(用于立体视觉)的视频,但其中一个摄像头滞后【英文标题】:Video from 2 cameras (for Stereo Vision) using OpenCV, but one of them is lagging 【发布时间】:2014-02-06 01:39:14 【问题描述】:

我正在尝试使用 2 个罗技 C310 网络摄像头创建立体视觉。 但结果还不够好。与另一个相比,其中一个视频滞后。

这是我使用 VC++ 2010 的 openCV 程序:

#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <iostream>

using namespace cv;
using namespace std;

int main()

    try
    
        VideoCapture cap1;
        VideoCapture cap2;

        cap1.open(0);
        cap1.set(CV_CAP_PROP_FRAME_WIDTH, 1040.0);
        cap1.set(CV_CAP_PROP_FRAME_HEIGHT, 920.0);

        cap2.open(1);  
        cap2.set(CV_CAP_PROP_FRAME_WIDTH, 1040.0);
        cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 920.0);
        Mat frame,frame1;

        for (;;)
        
            Mat frame;
            cap1 >> frame;

            Mat frame1;
            cap2 >> frame1;

            transpose(frame, frame);
            flip(frame, frame, 1);

            transpose(frame1, frame1);
            flip(frame1, frame1, 1);

            imshow("Img1", frame);
            imshow("Img2", frame1);

            if (waitKey(1) == 'q')
                break;
        

        cap1.release();
        return 0;
    
    catch (cv::Exception & e)
    
        cout << e.what() << endl;
    

如何避免滞后?

【问题讨论】:

【参考方案1】:

您可能正在使 USB 总线饱和。

尝试在前面插一个,在后面插一个(希望能降落在不同的公交车上),

或减小帧大小/FPS 以减少流量。

【讨论】:

Thx berak,延迟在减少,但有一点延迟,尤其是在检测到移动物体时。【参考方案2】:

恐怕你不能这样做。 opencv Videocapture 真的只是为了测试,它使用最简单的底层操作系统功能,并没有真正尝试做任何聪明的事情。

此外,即使您可以找到较低级别的 API 与它们对话,简单的网络摄像头也不是很容易同步控制。

如果您需要在项目中使用简单的 USB 网络摄像头,最简单的方法是让外部定时 LED 以几赫兹的频率闪烁,并检测每个摄像头中的光线并使用它来同步帧。

【讨论】:

谢谢,所以你建议改变每个相机的 fps 直到得到最小的滞后?【参考方案3】:

我知道这篇文章已经很老了,但我最近不得不处理同样的问题,所以......

我认为您没有使 USB 总线饱和。如果你是,你应该在终端中有一个明确的消息。实际上,VideoCapture 对象的创建非常慢,我很确定这是您滞后的原因:您初始化第一个 VideoCapture 对象 cap1,cap1 开始抓取帧,您初始化第二个 VideoCapture cap2,cap2 开始抓取帧然后您开始从 cap1 和 cap2 获取帧,但 cap1 存储的第一帧比 cap2 存储的第一帧旧,所以......你有一个滞后。

如果你真的想使用 opencv,你应该做的是添加一些线程:一个处理左帧,另一个处理右帧,除了保存收到的最后一帧之外什么都不做(所以你总是会处理仅使用最新的帧)。如果你想得到你的框架,你只需要从这些线程中获取它们。

如果你需要here,我已经做了一些事情。

【讨论】:

以上是关于使用 OpenCV 来自 2 个摄像头(用于立体视觉)的视频,但其中一个摄像头滞后的主要内容,如果未能解决你的问题,请参考以下文章

通过单端口多头(立体声)usb 摄像头使用 Opencv 捕获视频,提供单输出

具有立体 3D 重建的 OpenCV

OpenCV:使用 cv::triangulatepoints() 进行立体摄像机跟踪的问题

双目立体视觉摄像头的标定矫正世界坐标计算(opencv)

使用 opencv 进行立体图像校正不起作用

OpenCv 3d 拼接全景图