2011-04-20 106 views
3

我有立體相機系統。 在我的程序中,我在兩個線程中捕捉來自每個攝像頭的圖像。 (每個相機一個線程)。 當我收到來自每臺相機的圖像後,我想用OpenCV處理它們。我如何對我的程序說,這兩個相機線程得到的圖像,我可以去處理它們?攝像機同步OpenCV

我還有一個問題。每個從相機接收到的幀都有一個時間戳,由相機指定。我怎樣才能匹配時間戳,以便從兩臺攝像機獲取圖像,這些圖像是在同一時間捕獲的?

回答

1

您是否曾經使用OpenCV編寫過應用程序來顯示相機捕獲的幀?從那裏開始。下面的應用程序確實是和轉換每一幀到它的灰度版本:

CvCapture *capture = NULL; 
capture = cvCaptureFromCAM(-1); //-1 or 0 depending on your platform 
if (!capture) 
{ 
    printf("!!! ERROR: cvCaptureFromCAM\n"); 
    return -1; 
} 

cvNamedWindow("video", CV_WINDOW_AUTOSIZE); 

while (exit_key_press != 'q') 
{ 
    /* Capture a frame */ 
    color_frame = cvQueryFrame(capture); 
    if (color_frame == NULL) 
    { 
     printf("!!! ERROR: cvQueryFrame\n"); 
     break; 
    } 
    else 
    { 
     // WOW! We got a frame! 
     // This is the time to process it since we are not buffering 
     // the frames to use them later. It's now or never. 

     IplImage* gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); 
     if (gray_frame == NULL) 
     { 
      printf("!!! ERROR: cvCreateImage\n"); 
      continue; 
     } 

     cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY); 
     cvShowImage("Grayscale video", gray_frame); 
     cvReleaseImage(&gray_frame); 
    } 
     exit_key_press = cvWaitKey(1); 
} 

請記住,正在一個循環中獲取的圖像,如果你退出循環,你會停止從相機接收數據。這很有道理,對吧?這給你留下了兩種選擇:

  • 處理框架的方式。但是如果這個處理速度很慢,那麼在下一個cvQueryFrame()操作之前,你可能會錯過幾幀相機。

  • 使用某種緩衝機制存儲幀,以便您可以在另一個線程上執行處理。如果您的處理技術對CPU要求很高,並且您不想丟失任何幀,這是一個很好的方法。

關於你的第二個問題,其不清楚你的意思。請進一步闡述。

+0

@ 4eloveg已更新的回答。 – karlphillip 2011-04-20 18:44:02

+0

我不使用OpenCv捕獲圖像。我使用Camera API從相機中獲取圖像。 儘管如此,我還是看不到這個代碼使用立體相機。而且我不需要分開處理相機圖像。我需要兩個相機圖像,以便與OpenCV進行比較。 其實我的程序代碼和你的一樣。此刻我保存了每臺相機的圖像。但是我的問題是,我怎麼可以說要編程「嘿,從左右相機拍攝的圖像已準備就緒,現在就比較它們」。而不是暫停相機線程並去處理圖像。 – man 2011-04-20 18:48:04

+0

我想象你正在將內存中的幀存儲在某種陣列上。您將需要另一個線程,其工作將是掃描陣列以查找匹配的時間戳。當找到匹配的時候,將它們發送到處理/比較,並在處理未完成時暫停相機(這是你想要的嗎?)。當你完成它們的時候,如果你不再需要它們並且節省空間,那麼它可能是一個好主意。 – karlphillip 2011-04-20 18:59:16