opencv常用函数

 
 

1.创建Mat

      Mat matSrc (Size(320,240),CV_8UC3) ;

2.读取Mat图像

     Mat matSrc = imread("C:\\Tmp.jpg");        
     if( matSrc.empty())
     {
          return FALSE;
     }

3.读取单通道图像

     Mat matSrc = imread("C:\\Tmp.jpg", 0);        
     if( matSrc.empty())
     {
          return FALSE;
     }

4.保存Mat图像

     if( matSrc.empty())
     {
          return FALSE;
     }
     imwirte("C:\\Tmp.jpg", matSrc);

5.Mat与Iplimage互转

Mat->Iplimag

     Mat matSrc(pSrcImg, false);//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据)

Iplimage-> Mat

     IplImage SrcImg(matSrc);//此方法为浅拷贝

6.复制Mat图像

此方法会额外的创建一个图像内存备份,而非引用。

   matImg = matSrc.clone();

7.灰度化

彩色图像RGB转灰度公式:gray = R 0.299 + G 0.587 + B * 0.114。CV_BGR2GRAY为彩色转灰度,CV_GRAY2BGR为灰度转彩色。

     Mat matGray;
     cvtColor( matSrc , matGray, CV_BGR2GRAY );

8.反转图像

     flip(matSrc , matSrc , -1);

9.判断输入图像的数据是否为空

    if (!matSrc.data)
    {
        return FALSE;
    }

10.判断输入图像的大小是否满足想关条件

    if (matSrc.cols < 100 || matSrc.rows < 100)
    {
        return FALSE;
    }

11.腐蚀算法

腐蚀算法使二值图像减小一圈 。原理:腐蚀替换当前像素位像素集合中找到的最小像素值。iErode参数为腐蚀次数

    for (int i = iErode; i > 0; i--)
    {
        erode(matSrc, matSrc, Mat());
    }

12.膨胀算法

膨胀算法使二值图像减小一圈。原理:膨胀是替换当前像素位像素集合中找到的最大像素值。 idilate参数为膨胀次数

    for (int i = iDilate; i > 0; i--)
    {
        dilate(matSrc, matSrc, Mat());
    }

13.高斯滤波算法

线性平滑滤波,适用于消除高斯噪声。(iSmooth必须为单数)

    if (iSmooth % 2 == 0)
    {
        iSmooth = 1;
    }    
    GaussianBlur(matSrc, matSrc, Size(iSmooth, iSmooth), 0);

14.中值滤波算法

非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值。(iSmooth必须为单数)

    if (iSmooth % 2 == 0)
    {
        iSmooth = 1;
    }    
    medianBlur (matSrc, matSrc, iSmooth );

15.二值化

就是将图像上的像素点的灰度值设置为0或255。iThreshold为二值化参数范围(0~255)

     threshold(matSrc, matSrc, iThreshold, iThreshold , THRESH_BINARY);

16.大律法自适应二值化

OTSU的中心思想是阈值T应使目标与背景两类的类间方差最大。iThreshold为二值化参数范围(0~255)

     threshold(matSrc, matSrc, iThreshold , iThreshold , CV_THRESH_OTSU);

  
  

17寻找轮廓

     //创建轮廓
    vector<Vec4i> vecHierarchy;
    vector<vector<Point>> vecContours;
    //寻找外轮廓
    findContours(matSrc, vecContours, vecHierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE ,Point(0, 0)); 
    if( vecContours.empty() == 0 || vecHierarchy.empty() == 0 )
    {
          return FALSE;
     }

18寻找轮廓的外切矩形

     RotatedRect box = minAreaRect(vecContours[1]); 
     Point2f Point[4];
     box.points(Point);

19.轮廓填充

CV_FILLED为全部填充,如果需要填充某一个轮廓填写那个轮廓的id。

     drawContours(matSrc, vecContours , 0, Scalar(255), CV_FILLED);

20.Canny检测图像边缘

经典的Canny边缘检测算法通常都是从高斯模糊开始,到基于双阈值实现边缘连接结束。但是在实际工程应用中,考虑到输入图像都是彩色图像,最终边缘连接之后的图像要二值化输出显示,所以完整的Canny边缘检测算法实现步骤如下:1. 彩色图像转换为灰度图像2. 对图像进行高斯模糊3. 计算图像梯度,根据梯度计算图像边缘幅值与角度4. 非最大信号压制处理(边缘细化)5. 双阈值边缘连接处理6. 二值化图像输出结果

     Canny(matSrc ,matDes ,125, 350);

21.灰度直方图均衡化

     equalizeHist(MatSrc, MatSrc);

22. 垂直投影

     void VerticalProjection(const Mat& src, Mat& dst) 
     { 
         // accept only char type matrices 
         CV_Assert(src.depth() != sizeof(uchar)); 

         dst.create(1, src.cols, CV_32F); 

         int i, j; 
         const uchar* p; 
         float* p_dst = dst.ptr<float>(0); 
         for(j = 0; j < src.cols; j++){ 
             p_dst[j] = 0; 
             for(i = 0; i < src.rows; i++){ 
                 p = src.ptr<uchar>(i); 
                 p_dst[j] += p[j]; 
             } 
         } 
     }

23. 水平投影

     void HorizonProjection(const Mat& src, Mat& dst) 
     { 
         // accept only char type matrices 
         CV_Assert(src.depth() != sizeof(uchar)); 

         dst.create(src.rows, 1, CV_32F); 

         int i, j; 
         const uchar* p; 
         float* p_dst; 
         for(i = 0; i < src.rows; i++){ 
             p = src.ptr<uchar>(i); 
             p_dst = dst.ptr<float>(i); 
             p_dst[0] = 0; 
             for(j = 0; j < src.cols; j++){ 
                 p_dst[0] += p[j]; 
             } 
         } 
     }

24.hough变换检测圆

     vector<Vec3f> circles; 
     HoughCircles(matSrc, circles, CV_HOUGH_GRADIENT, 
                                    1, //累加器的分辨率(图像的尺寸/2) 
                                    6, //两个圆之间的最小距离 
                                    100, //Canny高阈值 
                                    5, //最小投票数 
                                    3,
                                    7); //极小极大半径3 10 

     vector<Vec3f>::const_iterator itc = circles.begin();
     while(itc != circles.end())
     {
          ...
          i++;
     }

25. 调节对比度和亮度

dContrast为对比度参数,范围为10-100,iBright为亮度参数范围为0-255。

    matTmp.convertTo( matSrc, -1, dContrast, iBright);

26.画矩形

Point1,Point2为矩形对角的2个点。

rectangle(matSrc, Point1, Point2, Scalar( 0, 0, 0), CV_FILLED, 0);

27.画直线

Point1,Point2为直线上的2个点。

line( matSrc , Point1 , Point2 , Scalar( 0, 0, 0) );

28.画圆或者点

circle( matSrc, Point, 2, Scalar(255,0,0,0), CV_FILLED, CV_AA, 0);



转自:http://www.jianshu.com/p/dfef306d7a2a



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值