2014-02-06 53 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,我已經做了一些小事。

相關問題