一、常用函数介绍
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|
第五、六两个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为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 );
说明:方框滤波,方框滤波和均值滤波的原理是类似的,因为均值滤波是方框滤波的归一化表现,
从方框滤波的模板可以看到,如果α = 1,那么就是方框滤波,不进行归一化;如果α != 1那么就进行归一化操作。
以5*5的卷积核为例,如果normalize == true,那么就是均值滤波,模板如下:
如果normalize != true,那么就是计算邻域像素和,不平均,卷积核如下:
参数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_
OutputArray:
是InputArray的派生类,需要注意的是,再使用getMat()时,之前一定要调用_OutputArray::create()方法为矩阵分配空间,可以使用_OutputArray::needed()来检测输出矩阵是否需要被计算,传进去的参数是空就需要被计算。
RotatedRect:
矩形,有角度,使用该对象的points()方法可以获取矩形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_
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_
1, 2, 1, \
2, 4, 2, \
1, 2, 1);
kernel /= 16;
filter2D(src1, dst22, -1, kernel);
imshow("使用filter2D实现高斯滤波", dst22);
waitKey(0);
return 0;
}