在OpenCV中使用线程进行多标记检测

时间:2011-11-16 13:54:55

标签: visual-c++ opencv augmented-reality

我正在开发一个增强现实项目,我必须使用OpenCV进行“多标记检测+识别”。我在Windows上,Visual C ++ 2008.我已经完成了单线程部分。

我想知道OpenCV中是否有任何线程机制可以执行类似的任务。还有我可以考虑的其他方法是什么?

我还希望在覆盖3D模型时使用为每个标记生成的旋转和平移矩阵(使用OpenCV)。有没有更好的方法来组织/保存这些数据?

修改

这是一个学术项目,效率和其他事项并不重要。只要它是一个可行的解决方案,它就完美无缺。

1 个答案:

答案 0 :(得分:1)

您可以做的是将Boost库与并发队列结合使用。在这里,您可以找到我与boost线程和OpenCV一起工作的concurrent queue

要将并发队列与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);
 }