在處理圖像時,會經常對像素進行操作,實時性要求較高的場所往往會使用並行處理,好在(C/C++ API)支持多種並行方式:mpi,openmp,intel ipp 等,今天記錄一種利用 openmp簡單的並行處理圖像方法:灰度圖像取反。
需要用到的頭文件:#include “omp.h”,作者是基於opencv3.0處理的圖片,cpu為賽揚E3200,雙核。
話不多說上代碼:
#include "opencv2/opencv.hpp" #include "omp.h" #include "time.h" #include <iostream> #pragma comment(lib,"opencv_world300.lib") using namespace cv; using namespace std; void normal(){ clock_t start,end; Mat img = imread("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);//讀一張圖(1920*1080),轉為灰度圖// Mat out(img.rows,img.cols,CV_8U);//初始化輸出圖像// unsigned char* p=out.data;//像素指針// //取反// start = clock(); for(int i = 0;i<img.rows*img.cols;i++){ *p++ =0xff-img.data[i]; } end = clock(); cout<<"norm_time"<<(end-start)<<endl; } void test_omp(){ clock_t start,end; Mat img = imread("test.jpg",CV_LOAD_IMAGE_GRAYSCALE);//讀一張圖,轉為灰度圖// Mat out(img.rows,img.cols,CV_8U);//初始化輸出圖像// unsigned char* p=out.data;//像素指針// //omp// int num = img.rows*img.cols;//openmp 限制循環格式// start =clock(); #pragma omp parallel for for (int i = 0;i<num;i++) { *p++ =0xff -img.data[i]; } end = clock(); cout<<"omp_time"<<(end-start)<<endl; } int main(){ normal(); test_omp(); return 0; }
release模式 結果如下:
時間單位為毫秒,雙核並行速度剛好是普通處理兩倍。
后記:
openmp主要用於循環級的並行程序,某些應用可能並不適合,當然由於圖像數據的特殊性正好合適;其次openmp編寫對for循環的格式要求比較多,具體細節可以參考http://www.cnblogs.com/yangyangcv/archive/2012/03/23/2413335.html。
今天就寫這么多了,未完待續。。。