OpenCV 常用函数(一)

来源:互联网 发布:学java的学校地址 编辑:程序博客网 时间:2024/06/06 08:23

本文主要介绍:Opencv常用函数,如均值、最大最小、归一化、滤波、旋转、求连通域等函数。


一、基本函数

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //初始化  
  2. Mat img = Mat::zeros(Height, Width, CV_8UC1);  
  3. Mat img = Mat::ones(Height, Width, CV_8UC1);  
  4. Mat img(Height, Width,CV_32FC1, Scalar(5));  
  5. img.create(Height, Width, CV8UC1);  
  6.   
  7. //数据类型转化  
  8. img.convertTo(dstImg, dataType);  
  9.   
  10. //读写图像  
  11. imwrite(pathm, img);  
  12. imread(path,  flag); // 0 灰度图 1 原图  
  13.   
  14. //显示图像  
  15. namedWindow("name",1); //1 大小和图像相同,窗口不可拉伸  0 窗口可拉伸  
  16. imshow("name", img); //可以直接用imshow  
  17. waitKey(0); //图像上点击Enter退出程序  
  18.   
  19. //矩阵元素访问  
  20. img.at<类型>(i,j) //类型一定和img相同  
  21. CV_8UC1     unsigned char  
  22. CV_32FC1    float  
  23. CV_64FC1    double  
  24.   
  25. // Mat* 元素访问方式  
  26. bins为Mat *bins  
  27. bins->ptr<float>(i)  
  28.   
  29. //判断读取数据为空  
  30. IplImage* dst1 =  cvLoadImage(path.c_str(), 1 );  //rgb图  
  31. if(!src1)  
  32. {  
  33.     printf("读取图像 %s 失败\n", path.c_str());  
  34.     return false;  
  35. }  
  36.   
  37. img = imread(tempPath, 1);   
  38. if(!img.data)  
  39. {  
  40.     printf("序列图模板匹配时,读取 %s 模板失败!\n", tempPath.c_str());  
  41.     return false;  
  42. }  
  43.   
  44.   
  45. //求最大最小值  
  46. double maxval, minval;   
  47. minMaxIdx(inImg,&minval,&maxval);  
  48.   
  49. //求均值方差  
  50. Mat avg1, std1;  
  51. meanStdDev(inImg, avg1, std1);  
  52. double mean = avg1.at<double>(0,0); //多波段,依次为(0,1),(0,2)...  
  53. double std = std1.at<double>(0,0);  
  54.   
  55. //Mat矩阵求和  
  56. Mat I;  
  57. Scalar s = sum(I);   
  58. Sum = s.val[0]; //多波段,则每个波段依次为 s.val[1]、s.val[2]...  
  59.   
  60. //Mat其他操作  
  61. exp(I,I); //矩阵自然指数  
  62. cartToPolar(X, Y, Grad, Angle); //由x y 方向变化量求梯度和角度  
  63. normalize(img, img, 1.0, 0.0, CV_MINMAX);//归一化到0-1  
  64. sqrt(img, img); //开矩阵平方 数据类型不变  
  65. double fro = norm(img, NORM_L2); //F范数  
  66.   
  67. //卷积运算  BORDER_REFLECT_101对称扩展  图像大小不变  
  68. float se[3] = {-1 ,0 ,1};  
  69. Mat Kernel(1,3,CV_32FC1, se);  
  70. filter2D(srcImg, dstImg, -1, Kernel,  Point(-1,-1), 0, BORDER_REFLECT_101);  
  71.   
  72. //形态学运算  
  73. int dilaw = 2;  
  74. Mat  element = getStructuringElement(MORPH_ELLIPSE, Size(2*dilaw+1,2*dilaw+1), Point(dilaw,dilaw)); //结构元素  
  75. dilate(srcImg, dstImg, element); //膨胀  
  76. morphologyEx(srcImg, dstImg, MORPH_OPEN, element ,Point(-1,-1),1);  
  77.   
  78.   
  79. //计算主轴方向  
  80. Moments centmom = moments(img, 1);  
  81. double axis = atan2(2*centmom.mu11, centmom.mu20-centmom.mu02)/2;  
  82.   
  83.   
  84. //图像归一化   
  85. normalize(img,img,0,1, CV_MINMAX);  
  86. //归一化方法  
  87.     CV_C - 归一化数组的C-范数(绝对值的最大值)  
  88.     CV_L1 - 归一化数组的L1-范数(绝对值的和)  
  89.     CV_L2 - 归一化数组的(欧几里德)L2-范数  
  90.     CV_MINMAX - 数组的数值被平移或缩放到一个指定的范围  


二、从矩阵中截取一部分

1.利用Rect数据类型

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Rect(左上x, 左上y, 宽度, 高度)  
  2. Rect rect(begx,begy,width,height); // (左上x, 左上y, 宽度, 高度)  
  3. img(rect).copyTo(Img2) //拷贝矩形区域  

2.利用Range

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. img.copyTo(dstImg(Range(y1,y2),Range(x1,x2)));//起点从0开始,Range(y1,y2) 包含y1不包含y2 [y1,y2)  
  2. //上式等价于:  
  3. Rect rect(x1, y1, x2-x1, y2-y1);  
  4. img.copyTo(dstImg(rect));  
  5. Range::all() //所有行或列  

三、连通域与图像填充

1.封闭区域填充

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //封闭区域填充  
  2. Mat maskImg =Mat::zeros(img.rows,img.cols, CV_8UC1);  
  3. circle(maskImg, pt, cvRound(radius), Scalar(1), 1, 8, 0);  
  4. vector<vector<Point>> contours;  
  5. vector<Vec4i>hierarchy;  
  6. findContours(maskImg,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE);  
  7. drawContours(maskImg,contours,0, Scalar(1),CV_FILLED, 8 ); //填充  
2.获取连通域信息

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. Mat usctemp;  
  2. img.convertTo(usctemp, CV_8UC1);  
  3. int roiH = usctemp.rows;  
  4. int roiW = usctemp.cols;  
  5. Mat src = Mat::zeros(roiH+2, roiW+2,CV_8UC1 ); //寻找连通域  
  6. usctemp.copyTo(src(Range(1,roiH+1),Range(1,roiW+1))); //对边界扩展  
  7.   
  8. vector<vector<Point>> contours; //求连通域边界坐标  
  9. vector<Vec4i>hierarchy;  
  10. findContours(src, contours, hierarchy, CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);  
  11. Rect bound = boundingRect(contours[0]);   
  12.   //连通域相关特征提取函数  
  13. boundingRect //外接矩形 Rect boundingRect(InputArray points)  
  14. minAreaRect //旋转的外包络矩形 RotatedRect minAreaRect(InputArray points)  
  15. contourArea // double contourArea(InputArray contour, bool oriented=false )  
  16. convexHull // void convexHull(InputArray points, OutputArray hull, bool clockwise=false,   
  17.               //bool returnPoints=true)  
  18. convexityDefects //void convexityDefects(InputArray contour, InputArray convexhull, OutputArray convexityDefects)  
  19. ...  
四、常用函数

1.获取运行时间

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. //获取运行时间  
  2. double t = (double)getTickCount();    
  3. t = ((double)getTickCount() - t)/cvGetTickFrequency() * 1e-6;  //单位为s  
  4. cout << "the time is :" << t << endl;    
2.采样

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*********************************************************************** 
  2.     函数名称:MatImgSample 
  3.     函数功能:对IplImage类型的图像进行采样 
  4.     函数参数: 
  5.         src     :原图像 
  6.         dRatioX :列采样比率,0.5为2采样 
  7.         dRatioY :行采样比率,0.5为2采样 
  8.         nType   :采样类型, 1  resize, 2 pyrDown, 3 pyrUp  
  9.     返回值:采样后的图像 
  10.     创建人 :pzh 
  11.     创建时间:2016.3.1 
  12.     备注: 
  13. ***********************************************************************/  
  14. bool MatImgSample(Mat &src, Mat &dst, double dRatioX, double dRatioY, int nType)  
  15. {  
  16.   
  17.     if(nType == 1) //直接降采样或上采样  上、下采样由dRatioX、dRatioY决定  
  18.         resize(src, dst, Size(), dRatioX, dRatioY);   
  19.     else if(nType == 2) //高斯降采样,即先高斯平滑,后采样  
  20.         pyrDown(src, dst, Size(src.cols*dRatioX, src.rows*dRatioX)); //2采样正确 4采样会出现错误  
  21.     else if(nType == 3)  
  22.         pyrUp(src, dst, Size(src.cols*dRatioX, src.rows*dRatioX));  
  23.     else  
  24.     {  
  25.         printf("没有该采样类型。\n");  
  26.         return false;  
  27.     }  
  28.   
  29.     return true;  
  30. }  
  31.   
  32.   
  33. /*********************************************************************** 
  34.     函数名称:IplImageSample 
  35.     函数功能:对IplImage类型的图像进行采样 
  36.     函数参数: 
  37.         src     :原图像 
  38.         dRatioX :列采样比率,0.5为2采样 
  39.         dRatioY :行采样比率,0.5为2采样 
  40.         nType   :采样类型, 1  cvResize, 2 cvPyrDown, 3 cvPyrUp  
  41.     返回值:采样后的图像 
  42.     创建人 :pzh 
  43.     创建时间:2016.3.1 
  44.     备注: 
  45. ***********************************************************************/  
  46. IplImage* IplImageSample(IplImage *src, double dRatioX, double dRatioY, int nType)  
  47. {  
  48.   
  49.     CvSize dstSize ;  
  50.     dstSize.width = src->width*dRatioX;    
  51.     dstSize.height = src->height*dRatioY;    
  52.     IplImage* dst = cvCreateImage(dstSize,src->depth,src->nChannels);  
  53.   
  54.   
  55.     if(nType == 1) //直接降采样或上采样  上、下采样由dRatioX、dRatioY决定  
  56.         cvResize(src,dst,CV_INTER_CUBIC);    
  57.     else if(nType == 2) //高斯降采样,即先高斯平滑,后采样  
  58.         cvPyrDown( src, dst, CV_GAUSSIAN_5x5 );   
  59.     else if(nType == 3)  
  60.         cvPyrUp( src, dst, CV_GAUSSIAN_5x5 );   
  61.     else  
  62.     {  
  63.         printf("没有该采样类型。\n");  
  64.         return NULL;  
  65.     }  
  66.   
  67.     return dst;  
  68. }  
3.旋转

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /*********************************************************************** 
  2.     函数名称:ImgRotate 
  3.     函数功能:图像旋转 
  4.     函数参数: 
  5.         inImg       :输入图像矩阵   
  6.         rotateImg   :旋转后图像   
  7.         theta       :角度单位 度  大于0向逆时针 小于0向顺时针 
  8.          
  9.     创建人 :pzh 
  10.     创建时间:2015.12.11 
  11.     备注: 
  12. ***********************************************************************/  
  13. bool  ImgRotate(const Mat &inImg, Mat &rotateImg, double theta )  
  14. {  
  15.   
  16.     int Height = inImg.rows;  
  17.     int Width = inImg.cols;  
  18.   
  19.   
  20.     //图像扩展,计算旋转中心和旋转矩阵  
  21.     int maxLength = int(sqrt(double(Height*Height + Width*Width)));  
  22.     Mat extImg = Mat::zeros(maxLength, maxLength, inImg.type());  
  23.     int roiX = maxLength/2 - Width/2;//ROI矩形左上角的x坐标  
  24.     int roiY = maxLength/2 - Height/2;//ROI矩形左上角的y坐标  
  25.     inImg.copyTo(extImg(Range(roiY, roiY+Height), Range(roiX, roiX+Width)));  
  26.   
  27.     //旋转中心  
  28.     Point rotaCent;  
  29.     rotaCent.y = maxLength/2;  
  30.     rotaCent.x = maxLength/2;  
  31.   
  32.     Mat rotaMat = getRotationMatrix2D(rotaCent, theta, 1); //  
  33.     //得到的旋转矩阵 [cos  sin (1-cos)*c.x  
  34.     //                -sin cos  (1-sin)*c.y  
  35.       
  36.     warpAffine(extImg, rotateImg, rotaMat,Size(maxLength,maxLength));//,1,0,0);  
  37.   
  38.     return true;  
  39.   
  40. }
0 0