2011-04-20 81 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