我在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原始视频捕获管道)