【问题标题】:Using Threads for Multiple marker detection in OpenCV在 OpenCV 中使用线程进行多标记检测
【发布时间】:2011-11-16 13:54:55
【问题描述】:

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

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

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

编辑:

这是针对效率和其他问题不那么重要的学术项目。只要它是一个有效的解决方案,它就很好。

【问题讨论】:

  • 我不确定您要完成什么。你能进一步阐述吗?你用的是什么算法?至少尝试大致了解一下检测/识别标记的整体方法。您是想使用多线程检测多个标记还是并行运行输入图像以检测和合并结果?
  • 它与ARToolkit库非常相似。但我正在使用 OpenCV+OpenGL+Qt 完成同样的工作。要求: 1) 当标记数量增加时,检测时间应比单线程应用程序中的最小。 3) 标记检测+识别(使用的基本图像处理技术)完成后,必须立即绘制 3D 内容。

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


【解决方案1】:

您可以将 Boost 库与并发队列结合使用。在这里你可以找到一个concurrent queue,它是我与 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);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-28
    • 2015-04-09
    • 2011-05-30
    • 2012-04-02
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多