2016-07-26 207 views
2

我有4个不同的Mat对象被称为4x opencv图像处理函数。OpenCV C++多线程

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(); 
+1

你描述的工作是一个管道。每个功能都采用前一阶段的输出。要实现并行性,您需要能够在工作流程的各个阶段之间移动较小的工作。换句话说,如果他们需要从其他任务输出,他们如何并行工作。复制Findcontours ...绘制轮廓.... –

+1

我不知道我明白。我想将processBinary()并行放置,因为它被称为4x,而不是方法内部的代码。每个processBinary()在不同的Mat对象上调用,因此它们不依赖于其他对象。 –

+1

啊...你应该添加调用'processBinary'的代码。我们不需要processBinary的内部部分来帮助你并行调用它。 –

回答

4

的光滑方式实现这一目标是不求线程看家自己,但使用提供微并行库。

OpenCV本身使用Intel Thread Building Blocks(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]); 
}); 

在这个例子中我把代码here

+0

我会试试这个。我实际上试图通过ndk在android上编译这个,并且它似乎不包含 include。我检查过sdk,libtbb.a在那里......也许我的Android.mk没有设置正确。你会碰巧知道这件事吗?可能需要另一个问题。 –

+0

不知道这件事。 – ypnos

+0

@SumeetBatra英特尔tbb是一个单独的库。 Opencv只使用它,如果你使用tbb支持来构建它。否则它使用你编译它的任何线程库。这可以是pthreads,gdb等 – nnrales