OpenCV C++ Multithreading



我在4个不同的Mat对象上调用了这个opencv图像处理函数4x。

void processBinary(Mat& binaryMat) {
    //image processing
}

我想对它进行多线程处理,以便所有4个方法调用同时完成,但让主线程等待每个线程完成。

例如:

int main() {
    Mat m1, m2, m3, m4;
    //perform each of these methods simultaneously, but have main thread wait for all processBinary() calls to finish
    processBinary(m1);
    processBinary(m2);
    processBinary(m3);
    processsBinary(m4);
}

我希望实现的是能够根据需要多次调用processBinary(),并且具有与只调用一次方法相同的效率。我查过多线程,但对调用线程然后连接/分离线程有点困惑。我认为我需要实例化每个线程,然后在每个线程上调用join(),以便主线程等待每个线程执行,但执行时间似乎没有显著增加。有人能解释一下我应该如何对程序进行多线程处理吗?谢谢

编辑:我尝试过的内容:

//this does not significantly increase execution time. However, calling processBinary() only once does.4
    thread p1(&Detector::processBinary, *this, std::ref(m1));
    thread p2(&Detector::processBinary, *this, std::ref(m2));
    thread p3(&Detector::processBinary, *this, std::ref(m3));
    thread p4(&Detector::processBinary, *this, std::ref(m4));
    p1.join();
    p2.join();
    p3.join();
    p4.join();

实现这一点的巧妙方法不是自己进行线程内务管理,而是使用提供微并行化的库。

OpenCV本身使用"英特尔线程构建块"(TBB)来完成这项任务——并行运行循环。

在您的情况下,您的循环只有四次迭代。使用C++11,您可以使用lambda表达式非常容易地将其写下来。在您的示例中:

std::vector<cv::Mat> input = { m1, m2, m3, m4; }
tbb::parallel_for(size_t(0), input.size(), size_t(1), [=](size_t i) {
    processBinary(input[i]); 
});

对于这个例子,我从这里获取代码。

如果你使用的是python语言,那么你可以使用我强大的开源内置多线程vidgearOpenCV的包装python库,该库可在GitHub和PyPI上获得,以实现更高的FPS。

项目洞察力:

VidGear是一个围绕OpenCV视频I/O模块的轻量级python包装器,该模块包含强大的多线程模块(齿轮),可在各种设备和平台上实现高速视频帧捕获功能。

特点:

它与其他现有的多线程开源解决方案的主要区别在于:

  • 多线程高速OpenCV视频帧捕获(导致高FPS

  • 灵活的直接控制视频流,具有简单的操作能力

  • 轻量级

  • 内置鲁棒错误和帧同步处理

  • 多平台兼容性(也与树莓派相机兼容。

  • 完全支持网络视频流(包括Gstreamer原始视频捕获管道)

相关内容

  • 没有找到相关文章

最新更新