Opencv学习

一、常用函数介绍

1. Mat imread(const string& filename,int flags=IMREAD_COLOR);

说明:加载图片

默认是加载RGB 3 Channel图片

2. void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0)

说明:图片转化

参数一:输入图片

参数二:输出图片

参数三:COLOR_BGR2GRAY:将RGB/BGR转成灰度图片

3. void calcHist(const Mat* images,int nimages,const int* channels,InputArray mask,OutputArray hist,int dims,const int* histSize,const float** ranges,bool uniform=true,bool accumulate=false)

说明:根据图片特征,计算出图片的直方图

参数:images:输入的图像或图像数组

nimages:输入数组个数,也就是images参数中图像的个数

channels:表示要统计的通道,第一个数组通道为0到images[0].channels()-1,第二个数组通道为images[0].channels()到images[0].channels()+images[1].channels()-1,依此类推。

mask:可选掩码,一般为Mat();

hist:输出目标一个二维数组

dims:需要计算直方图维度

histSize:每个维度直方图尺寸的数组,直方图中每个dims维度分成多少区间(如果把直方图看作一个一个竖条的话,就是竖条的个数)

ranges:每个维度中bin取值范围(x轴取值范围)

uniform:直方图是否均匀的标识符

accumulate:累计标识符,true:表示直方图再分配中不会清零

4. void inRange(InputArray src,InputArray lowerb,InputArray upperb,OutputArray dst)

 说明:通过阈值,将图像中符合阈值的部分设置为255,不符合的部分设置为0,输出图像到dst

 src:原图

 lowerb:设置的阈值下限

 upperb:设置的阈值上限

 dst:产生的新图

5. Mat getStructuringElement(int shape, Size ksize,Point anchor=Point(-1,-1))

说明:返回指定形状,尺寸的结构元素,多用在腐蚀,膨胀方法里

shape:有三柱形状选择,矩形,交叉形,椭圆形

ksize:尺寸大小

anchor:表示瞄点位置,默认-1,-1,表示中心瞄点

6.void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1),int iterations=1, int borderType=BORDER_CONSTANT,const Scalar&borderValue=morphologyDefaultBorderValue());
说明:腐蚀运算函数,使⽤ erode 函数,⼀般我们只需要填前⾯的三个参数,后⾯的四个参数都有默认值。⽽且往往结合 getStructuringElement ⼀起使⽤

第⼀个参数,InputArray 类型的 src,输⼊图像,即源图像,填 Mat 类的对象即可。图像通道的数量可以是任意的,但图像深度应为
CV_8U,CV_16U,CV_16S,CV_32F 或 CV_64F 其中之⼀。
     第⼆个参数,OutputArray 类型的 dst,即⽬标图像,需要和源图⽚有⼀样的尺⼨和类型。
     第三个参数,InputArray 类型的 kernel,腐蚀操作的内核。若为 NULL 时,表⽰的是使⽤参考点位于中⼼ 3x3 的核。我们⼀般使⽤
函数 getStructuringElement 配合这个参数的使⽤。getStructuringElement 函数会返回指定形状和尺⼨的结构元素(内
核矩阵)。(具体看上⽂中浅出部分 dilate 函数的第三个参数讲解部分)
      第四个参数,Point 类型的 anchor,锚的位置,其有默认值(-1,-1),表⽰锚位于单位(element)的中⼼,我们⼀般不⽤管它
第五个参数,int 类型的 iterations,迭代使⽤ erode()函数的次数,默认值为 1。
      第六个参数,int 类型的 borderType,⽤于推断图像外部像素的某种边界模式。注意它有默认值 BORDER_DEFAULT。
      第七个参数,const Scalar&类型的 borderValue,当边界为常数时的边界值,有默值 morphologyDefaultBorderValue(),⼀般我
们不⽤去管他。需要⽤到它时,可以看官⽅⽂档中的 createMorphologyFilter()函数得到更详细的解释

效果:卷积内核沿着图像滑动,如果原图中所有像素值都是1,那么中心元素保持1,否则为0
 

7..void dilate(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1),int iterations=1, int borderType=BORDER_CONSTANT,const Scalar&borderValue=morphologyDefaultBorderValue());

说明:膨胀运算函数与腐蚀相反,参数一样

效果:卷积内核沿着图像滑动,如果原图中只要有一个像素值是1,那么中心元素1,否则为0。

8.void findContours(InputArray image,OutputArrayOfArrays contours,OutputArray hierarchy,int mode,int method,Point offset=Point());

说明:查找轮廓

image:输入原图

contours:输出轮廓,实际数据结构是vector >

hierarchy:每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓的索引编号,如果没有对应项,该值设置为负数。

mode:表示轮廓的检索模式

    CV_RETR_EXTERNAL表示只检测外轮廓

    CV_RETR_LIST检测的轮廓不建立等级关系

    CV_RETR_CCOMP建立两个等级的轮廓

    CV_RETR_TREE建立一个等级树结构的轮廓

method:轮廓的近似办法

    CV_CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1

    CV_CHAIN_APPROX_SIMPLE,压缩水平,垂直,对角线元素,只保留该方向的终点坐标,例如一个矩形轮廓只需要4个点来保存轮廓信息

    CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh_Chinl chain近似算法

9.void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, intthickness=1, int lineType=LINE_8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )

说明:再图像上画轮廓

image – 目地图像,把轮廓画在这幅图像上,最好大小和原始图像相等。
contours – 通过findContours得到的所有轮廓,通常用vector >表示。
contourIdx – 要画的轮廓的索引,通常它的大小在0到contours.size之间,如果为-1,则会画出所有轮廓。
color – 轮廓的颜色.
thickness – 线的宽度,如果为-1,则为填充模式。
lineType – 线的类型,比如实线,虚线等待。
hierarchy – 就是findContours函数得到的轮廓层级信息,它和最后一个参数maxLevel相结合,用来指定画那些轮廓。如果maxLevel为0,则画指定的轮廓,如果为1,则会指定的轮廓和它的一级子轮廓,如果maxLevel为2,则会该轮廓和所有的嵌套子轮廓。
offset – 偏移选项,就是画轮廓时候从原始位置偏移一个距离来画轮廓。

10.void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)

说明:将轮廓转化成一个多边形曲线

curve – 轮廓点集表示的曲线。通常用vector表示。

approxCurve – 输出的近似多边形曲线。

epsilon – 近似精度,表示原始曲线和近似曲线之间的最大距离,越小越为。
closed – 曲线是否是闭合曲线。

11. double contourArea(InputArray contour,bool oriented=false)

说明:获取轮廓的面积

 contour: 输入轮廓

 oriented: 表示输出的面积是否带符号,(+-)

12.RotateRect minAreaRect(InputArray points)

说明:获取points点组成的最小外接矩形

points:point点数组vector

13.void fitLine( 
  InputArray points,    // 待输入点集(一般为二维数组或vector点集)
  OutputArray line,     // 输出点集(一个是方向向量,另一个是拟合直线上的点)(Vec4f(2d)或Vec6f(3d)的vector)
  int distType,         // 距离类型
  double param,         // 距离参数
  double reps,       // 径向的精度参数
  double aeps );       // 角度精度参数 
第一个参数是用于拟合直线的输入点集,可以是二维点的cv::Mat数组,也可以是二维点的STL vector。

第二个参数是输出的直线,对于二维直线而言类型为cv::Vec4f,对于三维直线类型则是cv::Vec6f,输出参数的前半部分给出的是直线的方向,而后半部分给出的是直线上的一点(即通常所说的点斜式直线)。

第三个参数是距离类型,拟合直线时,要使输入点到拟合直线的距离和最小化(即下面公式中的cost最小化),可供选的距离类型如下表所示,ri表示的是输入的点到直线的距离。

CV_DIST_USER =-1, /* User defined distance */
CV_DIST_L1 =1, /* distance = |x1-x2| + |y1-y2| */
CV_DIST_L2 =2, /* the simple euclidean distance */
CV_DIST_C =3, /* distance = max(|x1-x2|,|y1-y2|) */
CV_DIST_L12 =4, /* L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1)) */
CV_DIST_FAIR =5, /* distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998 */
CV_DIST_WELSCH =6, /* distance = c^2/2(1-exp(-(x/c)^2)), c = 2.9846 */
CV_DIST_HUBER =7 /* distance = |x| 第四个参数是距离参数,跟所选的距离类型有关,值可以设置为0,cv::fitLine()函数本身会自动选择最优化的值

第五、六两个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2

14.void filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kernel,Point anchor=Point(-1,-1),double delta=0,int borderType=BORDER_DEFAULT)

说明:函数需要给出卷积核即可实现各种滤波操作

参数1:输入图像;

参数2:输出图像;

参数3:图像深度(指存储每个像素所用的位数),如果没写将生成与原图像深度相同的图像。当ddepth输入值为-1时,目标图像和原图像深度保持一致。

参数4:Size类型的ksize,卷积核的大小。一般这样写Size( w,h )来表示卷积核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小;

参数5:卷积基准点(默认值为Point(-1,-1)表示取卷积中心即锚点)。

参数6:默认值为true,根据上面讲述的原理,也就是默认归一化。

参数7: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

15.void boxFilter( InputArray src, OutputArray dst, int ddepth,
                             Size ksize, Point anchor = Point(-1,-1),
                             bool normalize = true,
                             int borderType = BORDER_DEFAULT );

说明:方框滤波,方框滤波和均值滤波的原理是类似的,因为均值滤波是方框滤波的归一化表现,

Opencv学习_第1张图片

从方框滤波的模板可以看到,如果α = 1,那么就是方框滤波,不进行归一化;如果α != 1那么就进行归一化操作。

以5*5的卷积核为例,如果normalize == true,那么就是均值滤波,模板如下:

Opencv学习_第2张图片

如果normalize != true,那么就是计算邻域像素和,不平均,卷积核如下:

Opencv学习_第3张图片

参数1:输入图像;

参数2:输出图像;

参数3:图像深度(指存储每个像素所用的位数),如果没写将生成与原图像深度相同的图像。当ddepth输入值为-1时,目标图像和原图像深度保持一致。

参数4:Size类型的ksize,卷积核的大小。一般这样写Size( w,h )来表示卷积核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小;

参数5:卷积基准点(默认值为Point(-1,-1)表示取卷积中心即锚点)。

参数6:默认值为true,根据上面讲述的原理,也就是默认归一化。

参数7: 像素向外逼近的方法,默认值是BORDER_DEFAULT,即对全部边界进行计算。

二、类型介绍

InputArray:

    这个接口类可以是Mat,Mat_,Mat_,vector,vector>,vector,有时候InputArray想要输入空参数时,使用cv::noArray()作为参数,或者使用cv::Mat()。再内部InputArray提供getMat()方法,将传入的参数转为Mat类型。可以使用InputArray里的kind()方法,获取传入数据的数据结构。

OutputArray:

    是InputArray的派生类,需要注意的是,再使用getMat()时,之前一定要调用_OutputArray::create()方法为矩阵分配空间,可以使用_OutputArray::needed()来检测输出矩阵是否需要被计算,传进去的参数是空就需要被计算。

RotatedRect:

矩形,有角度,使用该对象的points()方法可以获取矩形4个顶点的坐标.

三、滤波和

均值率波和加权滤波模板分别为左右两图

Opencv学习_第4张图片

#include

using namespace cv;

int main()
{
    //使用boxFilter函数实现方框滤波
    Mat src1 = imread("C:/Users/zhou_/Desktop/1.jpg");
    Mat dst1(src1.size(), src1.type());
    if (!src1.data)
    {
        perror("load failed:");
        exit(-1);
    }
    imshow("src1", src1);

    boxFilter(src1, dst1, -1, Size(3, 3), Point(-1, -1));

    imshow("方框滤波", dst1);

    //同时,我们使用filter2D函数来实现模板是3*3的均值滤波
    Mat dst11;
    Mat kernel = (Mat_(3, 3) << \
        1, 1, 1, \
        1, 1, 1, \
        1, 1, 1);

    kernel /= 9;        //归一化变换核,保持图像亮度不变

    filter2D(src1, dst11, -1, kernel);
    imshow("使用filter2D实现均值滤波", dst11);

    //均值滤波是方框滤波归一化后的特殊情形
    Mat blurresult;
    blur(src1, blurresult, Size(3, 3));

    imshow("使用blur实现均值滤波", blurresult);

    //高斯滤波
    Mat dst2;
    GaussianBlur(src1, dst2, Size(3, 3), 0, 0);

    imshow("使用GaussianBlur实现高斯滤波", dst2);

    Mat dst22;
    kernel = (Mat_(3, 3) << \
        1, 2, 1, \
        2, 4, 2, \
        1, 2, 1);
    kernel /= 16;

    filter2D(src1, dst22, -1, kernel);
    imshow("使用filter2D实现高斯滤波", dst22);
    
    waitKey(0);
    return 0;
}

你可能感兴趣的:(c++,opencv,学习,计算机视觉)