2014-02-06 101 views
4

我正尝试使用2个Logitech C310网络摄像机创建立体视觉。 但结果不够好。其中一个视频比另一个滞后。使用OpenCV的2台摄像机(用于立体视觉)的视频,但其中一台落后于

下面是一个使用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

恐怕你不能这样做。 opencv Videocapture实际上仅用于测试,它使用最简单的底层操作系统功能,并不真正尝试和做任何聪明的事情。

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

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

+0

谢谢,那么你是否建议改变每个相机的fps,直到获得最小的滞后? – Limavolt

2

你可能饱和了USB总线。

尝试插入一个在前面,另外在背面(在希望的土地上不同的总线),

或降低帧大小/ FPS来生成较少的流量。

+0

Thx berak,滞后在减少,但有一点滞后,尤其是当检测到运动物体时。 – Limavolt

0

我知道这个帖子是已经非常老了,但我不得不面对同样的问题,最近这样......

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

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

如果您需要here,我已经做了一些小事。

相关问题