在处理图像时,会经常对像素进行操作,实时性要求较高的场所往往会使用并行处理,好在(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。
今天就写这么多了,未完待续。。。
原文:http://www.cnblogs.com/hutiann/p/5719471.html