opencv函数(基础简略版)

做考核任务的过程中,我感觉还是有必要写一些笔记-增加opencv的熟练度并且加深对函数的理解。

特在此总结一下opencv的常用函数(C++)

1.imread函数

读取图片文件,接收两个参数

第一个参数:图片的路径

第二个参数:读取图片的形式(有默认值)

  1. IMREAD_COLOR 加载彩色图片,这个是默认参数,可以直接写1
  2. IMREAD_GRAYSCALE 以灰度模式加载图片,可以直接写0
  3. IMREAD_UNCHANGED 包括alpha通道,可以直接写-1

2.imshow函数

显示图片,接收两个参数

第一个参数:图片的标题“字符串”

第二个参数:要显示的图像的矩阵Mat

3.cvtColor函数

void cv::cvtColor(InputArrat src,//输入图像
                 OutputArray dst,//输出图像
                 int code,//颜色的映射类型
                 int dstCn=0)

常用来将一张彩色图片,转换为一张灰度图

第三个参数:最常用COLOR_BGR2GRAY

COLOR_BGR2HSV

COLOR_BGR2HLS

4.threshole函数

void threshold(InputArray src,//输入图像
               OutputArray dst,//输出图像
               double thresh,//阈值
               double maxval,//最大值
               int type)//5种阈值化形式

第五个参数:

THRESH_BINARY:当点的值大于阈值时,取Maxval,反之设为0

THRESH_BINARY_INV:当前点值大于阈值时,设为0,反之设为Maxval

THRESH_TRUNC:当前点大于阈值时,设置为阈值,否则不改变

THRESH_TOZERO:当前点值大于阈值时不改变,否则设为0

THRESH_TOZERO_INV:当前点值大于阈值时,设置为0,反之不改变

5.findContours函数

void cv::findContours(InputOutputArray image,//输入图像
                      OutputArrayOfArrays contours,//输出轮廓
                      OutputArray hierarchy,
                      int mode,
                      int method,
                      Point offset=Point()
)

一般图像findContours()处理前需要进行二值化处理

第二、三个参数:

经常在和以下代码搭配

vector<vector<Point> >contours;
vector<Vec4i> hierarchy;

contours中的每一组Point点集就是一个轮廓

hierarchy内的元素和contours内的元素是一一对应的,hierarchy中的四个int型变量分别表示第i个轮廓的后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓

第四个参数:

轮廓的检索模式

RETR_EXTERNAL 只检测最外围轮廓

RETR_LIST 检测所有轮廓,并且轮廓间彼此独立

RETR_CCOMP 检测所有的轮廓,所有的轮廓之间里两个关系

RETR_TREE 检测所有轮廓,并建立一个等级树结构

第五个参数:

轮廓的近似方法

CHAIN_APPROX_NONE 保存物体边界上所有的轮廓点

CHAIN_APPROX_SIMPLE 仅保存轮廓的拐点信息

CHAIN_APPROX_TC89_L1,CHAIN_APPROX_TC89_KCOS使用teh-Chinlchain近似算法

第六个参数:

Point偏移量,所有轮廓信息相对于图像的偏移量

6、drawContours函数

void drawContours(OutputArray image,//输出图像
                 InputArrayOfArrays contours,//轮廓,findContours
                 int contourIdx,//轮廓的索引号
                 const Scalar& color,//线条的颜色
                 int thickness=1,//线条的宽度
                 int lineType=8,//线条的类型
                 InputArray hierarchy=noArray(),//轮廓的结构信息
                 int maxLevel=INT_MAX,
                 Point offset=Point() )

第三个参数:

如果该参数为负值,则画所有的轮廓

7、contourArea函数

double contourArea(InputArray contour, //输入的图像
                   bool oriented=false)//某一个方向

8、approxPolyDp函数

对指定的点集进行多边形逼近,其逼近的精度可通过参数设置。

void approxPloyDP(InputArray curve,//点集
                  OutputArray approxCurve,//输出的点集
                  double epsilon,//指定的精度
                  bool close//是否闭合
)

给出一个参数的例子

/* 对每个轮廓计算其凸包*/  
vector<vector<Point> >poly(contours.size());  
for (int i = 0; i < contours.size(); i++){  
    approxPolyDP(Mat(contours[i]), poly[i], 5,true);  
		//可以先转换成一个将轮廓转换成
}

9、canny函数

void Canny(InputArray src,//原图像
           OutputArray dst,//输出图像
           double threshold1,//阈值1
           double threshold2,//阈值2
           int aperture_size=3,//sobel算子的孔径大小,默认为3
           bool L2gradient=false
          )

10、addWeight函数

void addWeighted( const CvArr* src1,//第一张图片
                 double alpha,//第一个图片的权重
                 const CvArr* src2,//第二张图片
                 double beta,//第二张图片权重
                 double gamma, //求和后添加的数值
                 CvArr* dst//输出图片
                )

11、blur函数

均值滤波

void blur(InputArray src,//原图片
          OutputArray dst, //输出图片
          Size ksize, //内核的大小
          Point anchor=Point(-1,-1),//锚点
          int borderType=BORDER_DEFAULT //用于蕊短外部像素的边界形式
         )

12、GaussianBlur函数

高斯滤波

void GaussianBlur(InputArray src,//输入图像
                  OutputArray dst,//输出图像
                  Size ksize, //内核大小
                  double sigmaX,//x方向的方差
                  double sigmaY=0,//y方向的方差
                  int borderType=BORDER_DEFAULT//边界的处理方式 
                 )

13、medianBlur函数

中值滤波是一种基于排序的能有效抑制噪声的非线性信号处理技术,基本原理是把数字图像或者数字序列中的一点的值用该点的一个邻域中各点值的中值代替,让周围的像素接近真实值,从而消除孤立的噪声点。

void medianBlur(InputArray src,//输入图像
                OutputArray dst, //输出图像
                int ksize//滤波核大小
               )

14、convexHull函数

void convexHull(InputArray points,//得到的点集,一般是用图像轮廓得到的轮廓点
                OutputArray hull,//输出,用于输出凸包
                bool clockwise=false,//操作方向
                bool returnPoints =true//操作标识符
)

常常以下面的形式出现

vector<vector<Point> >hull( contours.size());
   for( int i = 0; i < contours.size(); i++ ){
     convexHull(Mat(contours[i]),hull[i],false);}

15、equalizeHist函数

直方图均衡化,提高图像的质量

直方图均衡化通过拉伸像素强度分布范围来增强图像对比度的一种方法

void equalizeHist(InputArray src,//输入图像
                  OutputArray dst)//输出图像

16、split函数

将一个彩色图像的通道分离

void split(const Mat& src,//输入图像
           Mat *mvBegin)//数组
void split(InputArray m, //输入图像
           OutputArrayOfArrays mv)//vector向量

17、calcHist函数

void calcHist(const Mat* images,//输入图像
              int nimages, //输入图像的个数
              const int* channels,//需要统计直方图的第几通道
              InputArray mask, //掩膜
              OutputArray hist, //输出的直方图数组
              int dims,//需要统计的直方图的通道数
              const int* histSize,//直方图分成多少个区间,bin的个数
              const float** ranges, //统计像素值的区间
              bool uniform=true,//是否对得到的直方图数组进行归一化处理
              bool accumulate=false//是否累计计算像素值的个数
             )

示例:

calcHist(&bgr_planes[0],//输入的图像
         1,//输入图像的个数
         0,//第几通道
         Mat(),//掩膜
         b_hist,//输出的直方图数组
         1,//需要统计的直方图的通道数
         &histSize,//直方图分成多少个区间
         &histRanges,//统计像素值的区间
         true,//归一化
         false);//不累计

18、floodfill函数

漫水填充

自动的选中与种子相连的区域,然后将该区域替换成指定的颜色

都必须在图像中选择一个种子点,然后把临近区域所有相似点填充上同样的颜色。

int floodFill(InputArray image,//输入图像
              Point seedPoint, //漫水填充算法的起始点
              Scalar newVal, //像素被染色的值
              Rect* rect=0,//
              Scalar ioDiff=Scalar(), 
              Scalar upDiff=Scalar(),
              int flags=4)//操作标识符
int floodFill(InputArray image,
              InputArray mask,//掩膜
              Point seedPoint, 
              Scalar newVal, 
              Rect* rect=0,
              Scalar ioDiff=Scalar(),
              Scalar upDiff=Scalar(),
              int flags=4)

漫水填充算法不会填充mask非零像素的区域

19、boundingRect函数

Rect boundingRect(InputArray points)//输入包含点的容器vector或者Mat

20、minAreaRect函数

RotatedRect minAreaRect(InputArray points)//输入包含点的vector或者Mat

21、HoughLines函数

霍夫变换主要实现直线检测以及圆检测

void HoughLines(InputArray image, //输入图像
                OutputArray lines,//存储了霍夫变换检测到的线条的输出矢量
                double rho,
                double theta, 
                int threshold,
                double srn=0, 
                double stn=0 )

22、getRotationMatrix2D函数

Mat getRotationMatrix2D(Point2f center,//旋转中心
                        double angle,//旋转角度
                        double scale);//缩放因子

23、getAffineTransform函数

得到仿射变换的的变换矩阵

Mat getAffineTransform(InputArray src,//输入三个点
                       InputArray dst)//变换后的三个点

24、warpAffine函数

void warpAffine(InputArray src, 
                OutputArray dst,
                InputArray M,//变换矩阵
                Size dsize,//输出图像的尺寸
                int flags = INTER_LINEAR,
                int borderMode = BORDER_CONSTANT,
                const Scalar& borderValue = Scalar());

25、getPerspectiveTransform函数

得到透视变换的变换矩阵

Mat getPerspectiveTransform(InputArray src,
                            InputArray dst )

26、warpPerspective函数

void warpPerspective(InputArray src, 
                     OutputArray dst,
                     InputArray M, //透视变换矩阵
                     Size dsize,//输出图像的尺寸
                     int flags = INTER_LINEAR,
                     int borderMode = BORDER_CONSTANT,
                     const Scalar& borderValue=Scalar());//透视变换

27、line函数

void line(Mat& img,//要绘制线段的图像
          Point pt1,//线段的起点
          Point pt2,//线段的重点
          const Scalar& color,//颜色
          int thickness=1,//宽度
          int lineType=8, //线型
          int shift=0)//坐标点小数点位数