使用OpENCV的2个相机的视频(用于立体声视觉),但其中一个是落后的

Video from 2 cameras (for Stereo Vision) using OpenCV, but one of them is lagging

本文关键字:一个 OpENCV 的视频 相机 用于 立体声 使用 视觉 2个      更新时间:2023-10-16

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

这是我使用VC 2010的OpenCV程序:

#include <opencvcv.h>
#include <opencvhighgui.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;
    }
}

如何避免滞后?

您可能会使USB总线饱和。

尝试将一个插入前面,另一个插入后部(希望登陆不同的公共汽车),

或减少框架尺寸/fps以减少流量。

我恐怕你不能这样做。OPENCV视频关注实际上仅用于测试,它使用最简单的基础操作系统功能,并且并没有真正尝试做任何聪明的事情。

此外,即使您可以找到较低级别的API来与它们交谈,简单的网络摄像头也不能很好地控制同步。

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

我知道这篇文章越来越老,但是我最近必须处理同样的问题,所以...

我认为您不饱和USB巴士。如果是,则应该在终端中有明确的消息。实际上,创建视频关注对象非常慢,我很确定这是您滞后的原因:您初始化了第一个视频关注对象CAP1,CAP1开始抓住帧,您初始化了第二个视频cap2,Cap2开始抓住帧,然后抓住框架,然后您开始从CAP1和CAP2获取帧,但是CAP1存储的第一帧比CAP2存储的框架更古老,因此...您有一个滞后。

如果您真的想使用openCV,该怎么办是添加一些线程:一个与左帧打交道,另一个用右帧进行处理,两者除了保存最后的帧外,什么都不做(所以您始终要处理仅使用最新框架)。如果您想获得框架,您只需要从这些线程中获取它们即可。

如果您需要在这里,我做了一些事情。