c++ - OpenCV C++ 多线程

标签 c++ multithreading opencv

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

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 本身使用 Intel Thread Building Blocks (待定)正是针对此任务——并行运行循环。

在您的例子中,您的循环只有四次迭代。使用 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]); 
});

对于这个例子,我从 here 中获取了代码.

关于c++ - OpenCV C++ 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38595056/

相关文章:

c++ - OpenCV 视频处理帧率下降

c++ - 为 vector 的 vector 保留内存,C++

python - opencv SIFT特征匹配不准确

c++ - inputMask 用空格填充 QLineEdit

c# - 为什么一个基本的单线程 C# 控制台应用程序需要 3 个线程?

c++ - 从 std::thread 在主线程上执行回调函数

Java 线程 - 两个 while 循环

c++ - 将字符串数组传递给函数 C++

c++ - 使用boost的timed_wait?

c++ - 二叉树的中序遍历遍历后给出垃圾值和段错误