3
我有立體相機系統。 在我的程序中,我在兩個線程中捕捉來自每個攝像頭的圖像。 (每個相機一個線程)。 當我收到來自每臺相機的圖像後,我想用OpenCV處理它們。我如何對我的程序說,這兩個相機線程得到的圖像,我可以去處理它們?攝像機同步OpenCV
我還有一個問題。每個從相機接收到的幀都有一個時間戳,由相機指定。我怎樣才能匹配時間戳,以便從兩臺攝像機獲取圖像,這些圖像是在同一時間捕獲的?
我有立體相機系統。 在我的程序中,我在兩個線程中捕捉來自每個攝像頭的圖像。 (每個相機一個線程)。 當我收到來自每臺相機的圖像後,我想用OpenCV處理它們。我如何對我的程序說,這兩個相機線程得到的圖像,我可以去處理它們?攝像機同步OpenCV
我還有一個問題。每個從相機接收到的幀都有一個時間戳,由相機指定。我怎樣才能匹配時間戳,以便從兩臺攝像機獲取圖像,這些圖像是在同一時間捕獲的?
您是否曾經使用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要求很高,並且您不想丟失任何幀,這是一個很好的方法。
關於你的第二個問題,其不清楚你的意思。請進一步闡述。
@ 4eloveg已更新的回答。 – karlphillip 2011-04-20 18:44:02
我不使用OpenCv捕獲圖像。我使用Camera API從相機中獲取圖像。 儘管如此,我還是看不到這個代碼使用立體相機。而且我不需要分開處理相機圖像。我需要兩個相機圖像,以便與OpenCV進行比較。 其實我的程序代碼和你的一樣。此刻我保存了每臺相機的圖像。但是我的問題是,我怎麼可以說要編程「嘿,從左右相機拍攝的圖像已準備就緒,現在就比較它們」。而不是暫停相機線程並去處理圖像。 – man 2011-04-20 18:48:04
我想象你正在將內存中的幀存儲在某種陣列上。您將需要另一個線程,其工作將是掃描陣列以查找匹配的時間戳。當找到匹配的時候,將它們發送到處理/比較,並在處理未完成時暫停相機(這是你想要的嗎?)。當你完成它們的時候,如果你不再需要它們並且節省空間,那麼它可能是一個好主意。 – karlphillip 2011-04-20 18:59:16