Использование потоков для обнаружения нескольких маркеров в OpenCV - PullRequest
2 голосов
/ 16 ноября 2011

Я работаю над проектом дополненной реальности, в котором я должен выполнить «обнаружение нескольких маркеров + идентификация» с использованием OpenCV. Я на Windows, Visual C ++ 2008. Я дошел до однопоточной части.

Мне было интересно, существуют ли какие-либо механизмы Threading , уже доступные в OpenCV для выполнения аналогичной задачи. И еще, какие другие методы я могу рассмотреть?

Я также надеюсь использовать матрицы вращения и перемещения, сгенерированные для каждого маркера (используя OpenCV), при наложении 3D-моделей. Есть ли лучший способ организовать / сохранить эти данные?

EDIT:

Это для академического проекта, где эффективность и другие вопросы не так важны. Это прекрасно, если это рабочее решение.

1 Ответ

1 голос
/ 25 мая 2012

Что вы можете сделать, это использовать библиотеку Boost в сочетании с параллельной очередью. Здесь вы можете найти параллельную очередь , которую я сделал, работая вместе с Boost Threading и OpenCV.

Чтобы использовать параллельную очередь с OpenCV, вы можете сделать что-то вроде этого:

    boost::thread_group frame_workers;   
    concurrent_queue<IplImage* > frame_queue(&frame_workers);

    boost::thread * frame_thread = new boost::thread(frame_grabber, &frame_queue);
    boost::thread * marker_thread = new boost::thread(marker_handler, &frame_queue);

    frame_workers.add_thread(frame_thread);
    frame_workers.add_thread(marker_thread);

В функции frame_grabber вы можете захватывать кадры и вставлять их в frame_queue. При этом marker_thread уведомляется о том, что в очереди находится кадр (с wait_and_pop). Короткий пример для захватывающей части может быть примерно таким:

 void frame_grabber(concurrent_queue<IplImage* > * frame_queue) {
     frame = cvQueryFrame(input_video);
     frame_copy = cvCreateImage(cvGetSize(frame), 8, 3);
     cvCopy(frame, frame_copy);
     frame_queue->push(frame);
 }
...