Opencv学习(四)——图像轮廓

一、查找绘制轮廓

1.1 寻找轮廓

一个轮廓一般对应一系列的点,也就是图像中的一条曲线。

void findContours(
inputArray,
outputArray,
outputArray hierarchy,
int mode,
int method,
Point offset=Point()
) ;

  • 第一个参数,输入图像,需为8位单通道图像,可以使用compare()、inrange()、threshold()、adaptivethreshold()、canny()等函数由灰度图或彩色图创建二进制图像创建二进制图像。此函数会提取图像轮廓的同时修改图像的内容。
  • 第二个参数,每个轮廓存储为一个点向量,即用point类型的vector表示。
  • 第三个参数,可选的输出向量,包含图像的拓扑信息。其作为轮廓数量的表示,包含了许多元素。每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果没有对应项,对应的hierarchy[i]值设置为负数。
  • 第四个参数,轮廓检索模式。
    (1)RETR_EXTERNAL:表示只检测最外层轮廓。对所有轮廓,设置hierarchy[i][2]=hierarchy[i][3]=-1。
    (2)RETR_LIST:提取所有轮廓,并且放置在list中。检测的轮廓不建立等级关系。
    (3)RETR_CCOMP:提取所有轮廓,并且将其组织为双层结构(two-level hierarchy:顶层为连通域的外围边界,次层为孔的内层边界)。
    (4)RETR_TREE:提取所有轮廓,并重新建立网状的轮廓结构。
  • 第五个参数,轮廓的近似办法。
    (1)CHAIN_APPROX_NONE:获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2)),abs(y2-y1)==1
    (2)CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
    (3)CHAIN_APPROX_TC89_L1,CHAIN_APPROX_TC89_KCOS:使用Teh_Chinl链逼近算法中的一个。
  • 第六个参数,每个轮廓点的可选偏移量,默认值Point()。对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数便可派上用场。

1.2 绘制轮廓

void drawContours(
inputoutputArray,
inputArrayOfArray,
int contourIdx,
const Scalar& color,
int thickness=1,
int lineType=8,
inputArray hierarchy=noArray(),
int maxLevel=INT_MAX,
Point offset=Point()
) ;

  • 第一个参数,目标图像。
  • 第二个参数,所有的输入轮廓,每个轮廓存储为一个点向量,即用point类型的vector表示。
  • 第三个参数,轮廓绘制的指示变量。如果其为负值,则绘制所有轮廓。
  • 第四个参数,轮廓的颜色。
  • 第五个参数,轮廓线条的粗细度,有默认值1.如果其为负值(如thickness=cv_filled),便会绘制在轮廓的内部。可选为CV_FILLED宏。
  • 第六个参数,线条的类型,默认值为8。
    (1)8:8连通型
    (2)4:4连通型
    (3)LINE_AA/CV_AA:抗锯齿线型
  • 第七个参数,可选的层次结构信息,默认值noArray()。
  • 第八个参数,表示用于绘制轮廓的最大等级,默认值INT_MAX。
  • 第九个参数,可选的轮廓偏移参数,用指定的偏移量offset=(dx,dy)偏移需要绘制的轮廓,有默认值Point()。

二、寻找凸包

​ 在二维欧几里得空间中,凸包可以想象为一条刚好包着所有点的橡皮圈,用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。

void convexHull ( InputArray points,
OutputArray hull,
bool clockwise = false,
bool returnPoints = true
)

  • points:输入的二维点集,Mat类型数据即可
  • hull:输出参数,用于输出函数调用后找到的凸包
  • clockwise:操作方向,当标识符为真时,输出凸包为顺时针方向,否则为逆时针方向。
  • returnPoints:操作标识符,默认值为true,此时返回各凸包的各个点,否则返回凸包各点的指数,当输出数组时std::vector时,此标识被忽略。

三、使用多边形包围轮廓

3.1 返回外部矩形边界-boundingRect函数

​ 此函数计算并返回指定点集最外面(up-right)的矩形边界。

Rect boundingRect(inputArray points)

其唯一的参数就是输入的二维点集。

3.2 寻找最小包围矩形–minAreaRect函数

​ 此函数用于对给定的2D点集,寻找可旋转的最小面积的包围矩形。

RotateRect minAreaRect(inputArray points)

其唯一的一个参数为输入的二维点集。

3.3 寻找最小包围圆形–minEnclosingCircle函数

​ 函数的功能是利用一种迭代算法,对给定的2D点集,去寻找面积最小的可包围它们的圆形。

void minEnclosingCircle(

inputArray points,
Point2f& center,
float& radius
) ;

  • 第一个参数,输入的二维点集。
  • 第二个参数,圆的输出圆心。
  • 第三个参数,圆的输出半径。

3.4 用椭圆拟合二维点集–fitEllipse函数

​ 此函数的作用是用椭圆拟合二维点集。

RotateRect fitEllipse(
inputArray points
) ;

其唯一的一个参数为输入的二维点集。

3.5 逼近多边形曲线–approxPolyDp函数

​ 函数的作用是用指定精度逼近多边形曲线

void approxPolyDp(

inputArray curve,

outputArray approxCurve,

double epsilon,

bool closed

) ;

  • 第一个参数,输入的二维点集。
  • 第二个参数,多边形逼近的结果其类型应该和输入的二维点集的类型一致。
  • 第三个参数,逼近的精度,为原始曲线和即近似曲线间的最大值。
  • 第四个参数,如果其为真,则近似的曲线为封闭曲线(第一个顶点和最后一个顶点相连),否则,近似的曲线不封闭。

四、图像的矩

4.1 矩的计算–moments函数

​ 函数用于计算多边形和光栅形状的最高达三阶的所有矩。矩用来计算形状的重心、面积,主轴和其他形状特征,如7Hu不变量等。

Moments moments(inputArray array, bool binaryImage=false)

  • 第一个参数,输入参数,可以是光栅图像(单通道,8位或浮点的二维数组)或二维数组(1N或N1)。

  • 第二个参数,默认值false,若此参数取true,则所有非零像素为1.此参数仅对图像使用。

4.2 计算轮廓面积–contourArea函数

​ 函数用于计算整个轮廓或部分轮廓的面积

double contourArea(inputArray contour, bool oriented=false)

  • 第一个参数,输入的向量,二维点(轮廓顶点)。
  • 第二个参数,面向区域标识符,若为true,该函数返回一个带符号的面积值,其正负取决于轮廓的方向(顺时针还是逆时针)。根据这个特性我们可以根据面积的符号来确定轮廓的位置。需要注意的是,这个参数有默认值false,表示以绝对值返回,不带符号。

4.3 计算轮廓长度–arcLength函数

​ 函数用于计算封闭轮廓的周长或曲线的长度。

double arcLength(inputArray curve,bool closed)

  • 第一个参数,输入的二维点集。
  • 第二个参数,一个用于指示曲线是否封闭的标识符,默认值closed,表示曲线封闭。

五、图像修补

void inpaint( InputArray src, InputArray inpaintMask,
OutputArray dst, double inpaintRadius, int flags );

  • 第一个参数src,输入的单通道或三通道图像;
  • 第二个参数inpaintMask,图像的掩码,单通道图像,大小跟原图像一致,-inpaintMask图像上除了需要修复的部分之外其他部分的像素值全部为0;
  • 第三个参数dst,输出的经过修复的图像;
  • 第四个参数inpaintRadius,修复算法取的邻域半径,用于计算当前像素点的差值;
  • 第五个参数flags,修复算法,有两种:INPAINT_NS 和I NPAINT_TELEA;

猜你喜欢

转载自blog.csdn.net/qq_41858784/article/details/82814899
今日推荐