Синхронизация камеры OpenCV - PullRequest
       11

Синхронизация камеры OpenCV

3 голосов
/ 20 апреля 2011

У меня есть системы стереокамер.В моей программе я ловлю изображения с каждой камеры в два потока.(одна нить на камеру).После того как я получу изображения с каждой камеры, я хочу обработать их с помощью OpenCV.Как я могу сказать своей программе, что оба потока камеры получили изображения, и я могу перейти к их обработке?

У меня есть еще один вопрос.Каждый полученный кадр с камеры имеет метку времени, которая указывается камерой.Как я могу сопоставить отметку времени, чтобы получать изображения с двух камер, которые были сняты одновременно?

1 Ответ

1 голос
/ 20 апреля 2011

Вы когда-нибудь писали приложение, использующее 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 ().

  • Сохраните кадр, используя некоторый буферный механизм, чтобы вы могли сделатьобработка в другом потоке.Это хороший подход, если ваша технология требует от процессора и если вы не хотите терять кадры.

По поводу вашего второго вопроса, мне не ясно, что выимею в виду.Пожалуйста, уточните подробнее.

...