微信公眾號:OpenCV學(xué)堂
關(guān)注獲取更多計算機視覺與深度學(xué)習(xí)知識
OpenCV支持的并行框架
1. Intel TBB (第三方庫,需顯式啟用)2. C=并行C/C++編程語言擴展 (第三方庫,需顯式啟用)3. OpenMP (編譯器集成, 需顯式啟用)4. APPLE GCD (蘋果系統(tǒng)自動使用)5. Windows RT并發(fā)(Windows RT自動使用)6. Windows并發(fā)(運行時部分, Windows,MSVC++ >= 10自動使用)7. Pthreads
在VS IDE中開啟OpenMP,只需要右鍵點擊項目,從屬性中

這樣就可以開啟并行加速。
卷積并行實現(xiàn)與時間比較
parallel_for_ParallelLoopBody
start = (double)cv::getTickCount();for (int row = 0; row < rows; row++) {for (int col = 1; col < cols - 1; col++){int sum = src.at(row, col) + src.at (row - 1, col) + src.at (row + 1, col) + src.at(row, col - 1) + src.at (row - 1, col - 1) + src.at (row + 1, col - 1) + src.at(row, col + 1) + src.at (row - 1, col + 1) + src.at (row + 1, col + 1); int pv = sum / 9;dst.at(row, col) = pv; }}
double start = (double)cv::getTickCount();parallel_for_(Range(0, rows * cols), [&](const Range &range){for (int r = range.start; r < range.end; r++){int i = r / cols, j = r % cols;double value = 0;for (int k = -sz; k <= sz; k++){uchar *sptr = src.ptr(i + sz + k);for (int l = -sz; l <= sz; l++){value += kernel.ptr<double>(k + sz)[l + sz] * sptr[j + sz + l];}}dst.ptr(i)[j] = saturate_cast(value); }});double time = (((double)cv::getTickCount() - start)) / cv::getTickFrequency();std::cout << "parallel_for_conv3x3 execute time: " << time * 1000 << " ms" << std::endl;
class parallelConvolution : public ParallelLoopBody{private:Mat m_src, &m_dst;Mat m_kernel;int sz;public:parallelConvolution(Mat src, Mat &dst, Mat kernel): m_src(src), m_dst(dst), m_kernel(kernel){sz = kernel.rows / 2;}virtual void operator()(const Range &range) const CV_OVERRIDE{for (int r = range.start; r < range.end; r++){int i = r / m_src.cols, j = r % m_src.cols;double value = 0;for (int k = -sz; k <= sz; k++){const uchar *sptr = m_src.ptr(i + sz + k);for (int l = -sz; l <= sz; l++){value += m_kernel.ptr<double>(k + sz)[l + sz] * sptr[j + sz + l];}}m_dst.ptr(i)[j] = saturate_cast(value); }}};
調(diào)用方式如下:
start = (double)cv::getTickCount();parallelConvolution obj(src, dst, kernel);parallel_for_(Range(0, rows * cols), obj);time = (((double)cv::getTickCount() - start)) / cv::getTickFrequency();std::cout << "parallelConvolution conv3x3 execute time: " << time * 1000 << " ms" << std::endl;
運行結(jié)果如下:

對此,我自己也有一些原因分析,但是更希望大家留言分析一下相關(guān)原因,為什么沒有加速效果??

推薦閱讀
OpenCV4.8+YOLOv8對象檢測C++推理演示
總結(jié) | OpenCV4 Mat操作全接觸
三行代碼實現(xiàn) TensorRT8.6 C++ 深度學(xué)習(xí)模型部署
實戰(zhàn) | YOLOv8+OpenCV 實現(xiàn)DM碼定位檢測與解析
對象檢測邊界框損失 – 從IOU到ProbIOU
YOLOv8 OBB實現(xiàn)自定義旋轉(zhuǎn)對象檢測
初學(xué)者必看 | 學(xué)習(xí)深度學(xué)習(xí)的五個誤區(qū)
YOLOv8自定義數(shù)據(jù)集訓(xùn)練實現(xiàn)安全帽檢測
