【问题标题】:Camera Synchronization OpenCV相机同步 OpenCV
【发布时间】:2011-08-09 17:53:59
【问题描述】:

我有立体摄像头系统。 在我的程序中,我在两个线程中捕获来自每个相机的图像。 (每个相机一个线程)。 在收到来自每个相机的图像后,我想用 OpenCV 处理它们。我怎么能对我的程序说,两个相机线程都有图像,我可以去处理它们?

我还有一个问题。从摄像头接收到的每个帧都有一个时间戳,由摄像头指定。如何匹配时间戳,以便从两个摄像头获取同时捕获的图像?

【问题讨论】:

    标签: opencv camera timestamp synchronisation


    【解决方案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);
    }
    

    请记住,帧是在循环中检索的,如果退出循环,您将停止从相机接收数据。这是有道理的,对吧?这为您提供了 2 个选择:

    • 以正确的方式处理框架。但如果这个处理速度很慢,你可能会错过相机的几帧,直到下一次 cvQueryFrame() 操作。

    • 使用某种缓冲机制存储帧,以便您可以在另一个线程上进行处理。如果您的处理技术对 CPU 要求很高,并且您不想丢失任何帧,那么这是一个很好的方法。

    关于你的第二个问题,我不清楚你的意思。请详细说明。

    【讨论】:

    • 我不使用 OpenCv 来捕获图像。我使用 Camera API 从相机中获取图像。我在这里仍然看不到代码使用立体相机。而且我不需要单独处理相机图像。我同时需要两个相机图像,以将它们与 OpenCV 进行比较。实际上我的程序的代码和你的一样。目前我保存每个相机的图像。但我的问题是,我怎么能说编程“嘿,左右相机的图像已经准备好,现在比较它们”。然后暂停相机线程并去处理图像。
    • 我想您将帧存储在内存中的某种数组上。您将需要另一个线程,其工作是扫描数组以查找匹配的时间戳。找到匹配项后,将它们发送到处理/比较并在处理未完成时暂停相机(这是您想要的吗?)。使用完它们后,如果不再需要它们并节省空间,将它们从阵列中弹出是个好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    相关资源
    最近更新 更多