Синхронизация камеры 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);
}
Имейте в виду, что кадры извлекаются внутри цикла, и если вы выйдете из цикла, вы прекратите получать данные с камеры. Это имеет смысл, верно? Это оставляет вам 2 варианта:
Обработайте кадр правильно. Но если эта обработка медленная, вы, вероятно, пропустите несколько кадров с камеры до следующей операции cvQueryFrame().
Сохраните кадр, используя некоторый буферный механизм, чтобы вы могли выполнять обработку в другом потоке. Это хороший подход, если ваша технология требует от процессора и если вы не хотите терять кадры.
Что касается вашего второго вопроса, мне не ясно, что вы имеете в виду. Пожалуйста, уточните дальше.