【问题标题】:Video from 2 cameras (for Stereo Vision) using OpenCV, but one of them is lagging使用 OpenCV 来自 2 个摄像头(用于立体视觉)的视频,但其中一个摄像头滞后
【发布时间】: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;
    }
}

如何避免滞后?

【问题讨论】:

    标签: c++ visual-studio-2010 opencv


    【解决方案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,我已经做了一些事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-28
      • 2022-01-07
      • 2015-06-22
      • 2021-11-05
      • 2019-12-19
      • 2020-01-12
      相关资源
      最近更新 更多