2016-07-26 205 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