相机同步 OpenCV

3
我有一套立体相机系统。 在我的程序中,我使用两个线程分别捕获每个相机的图像。(每个相机一个线程) 当我从每个相机接收到图像后,我想用OpenCV处理它们。如何告诉我的程序,两个相机的线程都已经获取了图像,可以开始处理它们了?
我还有一个问题。每个从相机接收到的帧都有一个时间戳,由相机指定。如何匹配时间戳,以便我可以获取在同一时间捕获的两个相机的图像?
1个回答

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要求高,并且不想丢失任何帧,则这是一个不错的方法。

关于您的第二个问题,我不清楚您的意思。请进一步阐述。

我不使用OpenCv来捕获图像。我使用Camera API从相机获取图像。 但是我在这里看不到代码使用立体摄像头。我也不需要分别处理相机图像。我需要同时获取两个相机的图像,以便用OpenCV进行比较。 实际上,我的程序代码与您的相同。目前我正在保存每个相机的图像。但我的问题是,如何告诉程序“嘿,右侧和左侧相机的图像已准备好,请现在进行比较”。然后暂停相机线程并开始处理图像。 - man
我想你正在将帧存储在内存中,使用某种类型的数组。你需要另一个线程来扫描该数组以查找匹配的时间戳。当找到匹配项时,将它们发送到处理/比较并暂停相机,直到处理完成(这是你想要的吗?)。当你完成它们后,如果不再需要它们,也许将它们从数组中弹出并保存空间是个好主意。 - karlphillip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接