opencv-c++

一、基础类型与图像视频读取

1、基础类型

1、接口类

类型 说明
InputArray 只读输入数组传递到 OpenCV 函数的代理类
OutputArray 这种类型与 InputArray 非常相似,只是它用于输入/输出和输出函数参数
InputOutputArray 继承了OutputArray,作为输入输出接口,增加了一些功能
InputArrayOfArrays typedef InputArrayInputArrayOfArrays
OutputArrayOfArrays typedef OutputArrayOutputArrayOfArrays
InputOutputArrayOfArrays typedef OutputArrayInputOutputArrayOfArrays

输入排列:InputArray
输出排列:OutputArray
输入输出排列:InputOutputArray

后三者是ArraysOfArrays,是前三者的排列,即排列的排列,定义使用了typedef。

2、Mat图像类

Mat本质是一个n维密集运算数组,是Matrix的简写。相似的有UMat,表示GPU Mat,GMat,表示G-API的Mat接口。

3、运算类

类型 说明
Matx 定阶矩阵类,即确定规模大小的矩阵类
Vec 向量类

4、定义类

类型 说明
Point 二维点类
Point3 三维点类
Rect 矩形类
RotatedRect 旋转矩形类
Range 范围类
Scalar 通道类
Size 规格类

2、图像视频io

1、函数

  • Mat cv::imread (const String&filename,int flags = IMREAD_COLOR)
  • //从指定文件加载图像,如果无法读取,那么函数会返回一个空矩阵(Mat::data==NULL)
  • bool cv::imwrite ( const String & filename,InputArray img,const std::vector> & params = std::vector< int >() )
  • //imwrite函数将图像保存到指定的文件中。根据文件扩展名选择图像格式(有关扩展名列表,请参阅cv::imread)。通常,使用此功能只能保存8位单通道或3通道(具有“BGR”通道顺序)图像

2、类

1、VideoCapture

常用函数

VideoCapture (const String &filename, int apiPreference=CAP_ANY)

VideoCapture (int index, int apiPreference=CAP_ANY)

virtual bool open (const String &filename, int apiPreference=CAP_ANY)

virtual bool open (int index, int apiPreference=CAP_ANY)

virtual bool isOpened () const

virtual double get (int propId) const

virtual bool set (int propId, double value)

virtual void read ()

virtual void release ()

virtual VideoCapture & operator>> (const Mat &image)

2、VideoWriter

常用函数

VideoWriter (const String &filename, int apiPreference, int fourcc, double fps, Size frameSize, bool isColor=true)

//VideoWriter进行了四次有参重载,一次无参重载

virtual bool isOpened () const

virtual bool open (const String &filename, int fourcc, double fps, Size frameSize, bool isColor=true)

//open进行了四次重载

virtual double get (int propId) const

virtual bool set (int propId, double value)

virtual VideoWriter & operator<< (const Mat &image)

二、图像显示与GUI

OpenCV是计算机视觉库,有了图像处理,当然不可或缺的有图像显示和相应的图形界面接口了。

  • 展示图象

void cv::imshow (const String & winname,InputArray mat )

imshow函数在指定窗口中显示图像。如果窗口是使用cv::window_AUTOSIZE标志创建的,则图像将以其原始大小显示,但仍受屏幕分辨率的限制。否则,将缩放图像以适应窗口。该功能可根据图像的深度缩放图像:

-如果图像是8位无符号的,它将按原样显示。

-如果图像是16位无符号或32位整数,则像素除以256。也就是说,值范围[0255*256]映射到[0255]。

-如果图像是32位或64位浮点,则像素值乘以255。也就是说,值范围[0,1]映射到[0255]。

若窗口是使用OpenGL支持创建的,那个么cv::imshow也支持ogl::Buffer、ogl::Texture2D和cuda::GpuMat作为输入。

如果该窗口不是在此函数之前创建的,则假定使用cv::window\u AUTOSIZE创建窗口。

如果需要显示大于屏幕分辨率的图像,则需要在imshow之前调用namedWindow(“,WINDOW_NORMAL”)

  • 键盘响应

int cv::waitKey (int delay = 0)

函数waitKey无限期地等待一个键事件(当延迟<=0时)或延迟毫秒(当它为正时)。由于操作系统在切换线程之间有一个最小的时间间隔,因此函数不会完全延迟ms,它将至少延迟ms,这取决于当时计算机上运行的其他内容。它返回按下的键的代码,如果在指定时间之前没有按下任何键,则返回-1。

三、图像色彩学

1、常用函数

1、二值化函数

  • double cv::threshold ( InputArray src,OutputArray dst,double thresh,double maxval,int type)
  • 将固定级别阈值应用于每个数组元素。此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可与上述值之一组合。在这些情况下,函数使用大津算法或三角形算法确定最佳阈值,并使用它代替指定的阈值。

2、色彩空间转换函数’

  • void cv::cvtColor (InputArray src,OutputArray dst,int code,int dstCn = 0 )
  • 将图像从一个颜色空间转换为另一个颜色空间。该函数用于将输入图像从一个颜色空间转换为另一个颜色空间。如果从RGB颜色空间转换为,则应明确指定通道的顺序(RGB或BGR)。请注意,OpenCV中的默认颜色格式通常称为RGB,但实际上是BGR(字节颠倒)。因此,标准(24位)彩色图像中的第一个字节将是8位蓝色分量,第二个字节将是绿色,第三个字节将是红色。第四、第五和第六个字节将是第二个像素(蓝色、绿色、红色),依此类推。

3、图像通道分割

  • void cv::split (const Mat & src,Mat * mvbegin )
  • 将多通道阵列划分为多个单通道阵列。如果需要提取单个通道或进行其他复杂的通道排列,则使用MixChannel。

4、通道合并

  • void cv::merge (const Mat* mv, size_t count, OutputArray dst)
  • 从多个单通道阵列中创建一个多通道阵列。将多个数组合并为一个多通道数组,也就是说,输出数组的每个元素都是输入数组元素的串联,其中第i个输入数组的元素被视为mv[i].channels()-元素向量。

5、通道混合

  • void cv::mixChannels(const Mat src,size_t nsrcs,Mat * dst,size_t ndsts,const int * fromTo,size_t npairs )
  • 将指定通道从输入阵列复制到输出阵列的指定通道。

四、图像几何学

1、常用函数

1、裁剪

在计算机视觉中,通常将处理得到有价值的区域称作ROI(region of interest),进行裁剪时,其实是将ROI的坐标作为索引提取出来。

裁剪没有独立的函数,图像裁剪通过直接使用原图像对象中的索引进行截取。

2、拼接

拼接分为横向拼接函数(hconcat),纵向拼接函数(vconcat)

横向拼接

  • void cv::hconcat (const Mat * src,size_t nsrc,OutputArray dst)
  • void cv::hconcat(InputArray src1,InputArray src2,OutputArray dst)
  • 将水平连接应用于给定矩阵

纵向拼接

  • void cv::vconcat(const Mat * src,size_t nsrc,OutputArray dst)
  • void cv::vconcat(InputArray src1,InputArray src2,OutputArray dst)
  • 对给定矩阵应用垂直连接

3、翻转

  • void cv::flip(InputArray src,OutputArray dst,int flipCode )
  • 围绕垂直、水平或两个轴翻转二维阵列

4、缩放

  • void cv::resize(InputArray src,OutputArray dst,Size dsize,double fx = 0,double fy = 0,int interpolation = INTER_LINEAR )
  • 调整图像的大小

5、旋转

这个旋转只可以旋转90°、180°、270°

  • void cv::rotate(InputArray src,OutputArray dst,int rotateCode)
  • 以90度的倍数旋转二维阵列

6、图像位运算

  • void cv::bitwise_and (InputArray src1,InputArray src2,OutputArray dst,InputArray mask = noArray() )
  • 计算两个数组(dst=src1&src2)的按位合取计算两个数组或一个数组和一个标量的每元素按位合取。

五、图像形态学

1、滤波

  • 图像滤波增强处理实质上就是运用滤波技术来增强图像的某些空间频率特征,以改善地物目标与领域或背景之间的灰度反差。遥感系统成像过程中可能产生的”模糊”作用,常使遥感图像上某些用户感兴趣的线性形迹、纹理与地物边界等信息显示得不够清晰,不易识别。需要通过采用领域处理方法来分析、比较和调整像元与其周围相邻像元间的对比度关系,图像才能得到增加,也就是说需要采用滤波增加技术处理。

2、常用函数

1、盒式滤波

  • void cv::boxFilter ( InputArray src,
    OutputArray dst,
    int ddepth,
    Size ksize,
    Point anchor = Point(-1,-1),
    bool normalize = true,
    int borderType = BORDER_DEFAULT
    )
  • 使用长方体过滤器使图像模糊。非正规化盒滤波器用于计算每个像素邻域上的各种积分特性,例如图像导数的协方差矩阵(用于密集光流算法等)。如果需要计算可变大小窗口上的像素和,请使用#积分。

2、均值滤波

  • void cv::blur (InputArray src,
    OutputArray dst,Size ksize,Point anchor = Point(-1,-1),int borderType = BORDER_DEFAULT )
  • 使用规格化长方体过滤器模糊图像

3、中值滤波

  • void cv::medianBlur(InputArray src,OutputArray dst,int ksize )
  • 使用中值滤波器使图像模糊。该函数使用带有ksize*ksize光圈的中值滤波器平滑图像。多通道图像的每个通道都是独立处理的。支持就地操作。

4、高斯滤波

  • void cv::GaussianBlur (InputArray src,OutputArray dst,Size ksize,double sigmaX,double sigmaY = 0,int borderType = BORDER_DEFAULT )
  • 使用高斯滤波器使图像模糊。该函数使用指定的高斯核卷积源图像。支持就地筛选。

5、双边滤波

  • void cv::bilateralFilter( InputArray src,OutputArray dst,int d,double sigmaColor,double sigmaSpace,int borderType = BORDER_DEFAULT )
  • 将双边过滤器应用于图像.该函数对输入图像应用双边滤波,如中所述.双边滤波器可以很好地减少不必要的噪音,同时保持边缘相当锐利。但是,与大多数过滤器相比,它的速度非常慢。

2、腐蚀膨胀处理

1、膨胀

  • void cv::dilate ( InputArray src,OutputArray dst,InputArray kernel,Point anchor = Point(-1,-1),int iterations = 1,int borderType =BORDER_CONSTANT,const Scalar & borderValue = morphologyDefaultBorderValue())
  • 通过使用特定的结构元素来扩展图像

2、腐蚀

  • void cv::erode(InputArray src,OutputArray dst,InputArray kernel,Point anchor = Point(-1,-1),int iterations = 1,int borderType = BORDER_CONSTANT,
    const Scalar & borderValue = morphologyDefaultBorderValue() )

3、形态学操作函数

  • void cv::morphologyEx ( InputArray src,OutputArray dst,int op,InputArray kernel,Point anchor = Point(-1,-1),int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar & borderValue =morphologyDefaultBorderValue() )

4、构建内核函数

  • Mat cv::getStructuringElement ( int shape,Size ksize,Point anchor = Point(-1,-1) )

3、霍夫运算

1、霍夫圆

  • void cv::HoughCircles (InputArray image,OutputArray circles,int method,double dp,double minDist,double param1 = 100,double param2 = 100,int minRadius = 0,int maxRadius = 0 )

2、霍夫线

  • void cv::HoughLines ( InputArray image,OutputArray lines,double rho,double theta,int threshold,double srn = 0,double stn = 0,double min_theta = 0,double max_theta = CV_PI )

六、图像轮廓处理

1、常用函数

1、寻找轮廓

  • void cv::findContours ( InputArray image,
    OutputArrayOfArrays contours,
    OutputArray hierarchy,
    int mode,
    int method,
    Point offset = Point()
    )
  • 在二值图像中查找轮廓。该函数使用@cite Suzuki85算法从二值图像检索轮廓。轮廓线是形状分析、目标检测和识别的有用工具。请参见OpenCV示例目录中的squares.cpp。

2、Canny 边缘检测

  • void cv::Canny ( InputArray image,
    OutputArray edges,
    double threshold1,
    double threshold2,
    int apertureSize = 3,
    bool L2gradient = false
    )
  • void cv::Canny ( InputArray dx,
    InputArray dy,
    OutputArray edges,
    double threshold1,
    double threshold2,
    bool L2gradient = false
    )
  • 使用Canny算法查找图像中的边缘。该函数在输入图像中查找边,并使用Canny算法在输出贴图边中标记它们。阈值1和阈值2之间的最小值用于边缘链接。最大值用于查找强边的初始分段。

3、Sobel算子

  • void cv::Sobel ( InputArray src,
    OutputArray dst,
    int ddepth,
    int dx,
    int dy,
    int ksize = 3,
    double scale = 1,
    double delta = 0,
    int borderType = BORDER_DEFAULT
    )

4、轮廓平滑,多边近似

  • void cv::approxPolyDP ( InputArray curve,
    OutputArray approxCurve,
    double epsilon,
    bool closed
    )

5、最小面积旋转矩形近似

  • RotatedRect cv::minAreaRect ( InputArray points )

6、边缘矩形近似

  • Rect cv::boundingRect ( InputArray array )

7、最小面积圆形近似

  • void cv::minEnclosingCircle ( InputArray points,
    Point2f & center,
    float & radius
    )

8、轮廓周长

  • double cv::arcLength ( InputArray curve,
    bool closed
    )

9、轮廓面积

  • double cv::contourArea ( InputArray contour,
    bool oriented = false
    )

七、映射变换

1、仿射变换

1、仿射变换

  • void cv::warpAffine ( InputArray src,
    OutputArray dst,
    InputArray M,
    Size dsize,
    int flags = INTER_LINEAR,
    int borderMode = BORDER_CONSTANT,
    const Scalar & borderValue = Scalar()
    )
  • 仿射变换的旋转矩阵可以用两种方式得到,一种是用点与点之间的对应关系得到矩阵对应函数,即为getAffineTransform函数,另一种即为构建旋转矩阵,使原图像变换,即为getRotationMatrix2D函数。

2、得到仿射变换核

  • Mat cv::getAffineTransform ( const Point2f src[],
    const Point2f dst[]
    )
  • Mat cv::getAffineTransform ( InputArray src,
    InputArray dst
    )

3、创建旋转矩阵

  • Mat cv::getRotationMatrix2D ( Point2f center,
    double angle,
    double scale
    )

2、透视变换

1、透视变换

  • void cv::warpPerspective ( InputArray src,
    OutputArray dst,
    InputArray M,
    Size dsize,
    int flags = INTER_LINEAR,
    int borderMode = BORDER_CONSTANT,
    const Scalar & borderValue = Scalar()
    )

2、获取透视变换矩阵

  • Mat cv::getPerspectiveTransform (InputArray src,InputArray dst,int solveMethod = DECOMP_LU)

八、绘图函数

1、常见函数

1、线标画函数

  • void cv::line ( InputOutputArray img,
    Point pt1,
    Point pt2,
    const Scalar & color,
    int thickness = 1,
    int lineType = LINE_8,
    int shift = 0
    )

2、矩形绘制

  • void cv::rectangle ( InputOutputArray img,
    Point pt1,
    Point pt2,
    const Scalar & color,
    int thickness = 1,
    int lineType = LINE_8,
    int shift = 0
    )

3、圆形绘制

  • void cv::circle ( InputOutputArray img,
    Point center,
    int radius,
    const Scalar & color,
    int thickness = 1,
    int lineType = LINE_8,
    int shift = 0
    )

4、标志绘制

  • void cv::drawMarker ( InputOutputArray img,
    Point position,
    const Scalar & color,
    int markerType = MARKER_CROSS,
    int markerSize = 20,
    int thickness = 1,
    int line_type = 8
    )

5、轮廓绘制

  • void cv::drawContours ( InputOutputArray image,
    InputArrayOfArrays contours,
    int contourIdx,
    const Scalar & color,
    int thickness = 1,
    int lineType = LINE_8,
    InputArray hierarchy = noArray(),
    int maxLevel = INT_MAX,
    Point offset = Point()
    )
  • 绘制轮廓或填充轮廓。如果厚度>=0,该函数在图像中绘制轮廓轮廓;如果厚度<0,则填充轮廓所限定的区域。下面的示例显示了如何从二进制图像检索连接的组件并为其添加标签

6、绘制文字

  • void cv::putText ( InputOutputArray img,
    const String & text,
    Point org,
    int fontFace,
    double fontScale,
    Scalar color,
    int thickness = 1,
    int lineType = LINE_8,
    bool bottomLeftOrigin = false
    )
  • 绘制文本字符串。函数cv::putText在图像中呈现指定的文本字符串。无法使用指定字体呈现的符号将替换为问号。

猜你喜欢

转载自blog.csdn.net/Morcool/article/details/130582753