欢迎光临散文网 会员登陆 & 注册

【第18节】OpenCV图片轮廓特征

2022-11-22 18:18 作者:海鸥之道  | 我要投稿

目标

  • 查找轮廓的不同特征,例如面积、周长、中心、边界框等

  • 你会学到很多轮廓相关函数

1、矩

        图像的矩可以帮助我们计算图像的质心、面积等。

函数CV2.moments()会将计算得到的矩以一个字典的形式返回。

根据这些矩的值,我们可以计算出对象的重心:Cx%20%3D%20%5Cfrac%7BM_%7B10%7D%20%7D%7BM_%7B00%7D%20%7D%20%2CCy%20%3D%20%5Cfrac%7BM_%7B01%7D%20%7D%7BM_%7B00%7D%20%7D%20%E3%80%82

2、轮廓面积

        轮廓的面积可以使用函数CV2.contourArea()计算得到,也可以使用矩(0阶矩),M[‘m00’]。

3、轮廓周长

        也被称为弧长。可以使用函数CV2.arcLength()计算得到。这个函数的第二参数可以用来指定对象的形状是闭合的(True),还是打开的(一条曲线)。

4、轮廓近似

        将轮廓形状近似到另外一种由更少点组成的轮廓形状,新轮廓的点的数目由我们设定的准确度来决定。为了帮助理解,假设我们要在一幅图像中查找一个矩形,但是由于图像的

种种原因,我们不能得到一个完美的矩形,而是一个“坏形状"(如下图所示)。现在你就可以使用这个函数来近似这个形状()了。这个函数的第二个参数叫epsilon,它是从原始轮廓到近似轮廓的最大距离。它是一个准确度参数。选择一个好的epsilon对于得到满意结果非常重要。

下边,第二幅图中的绿线是当 epsilon = 10% 时得到的近似轮廓,第三幅图是当 epsilon = 1% 时得到的近似轮廓。第三个参数设定弧线是否闭合。

5、凸包

        凸包与轮廓近似相似,但不同,虽然有些情况下它们给出的结果是一样的。函数CV2.convexHullO可以用来检测一个曲线是否具有凸性缺陷,并能纠正缺陷。一般来说,凸性曲线总是凸出来的,至少是平的。如果有地方凹进去了就被叫做凸性缺陷。例如下图中的手。红色曲线显示了手的凸包,凸性缺陷被双箭头标出来了。

函数原型:

参数:

  • points我们要传入的轮廓

  • hull输出,通常不需要

  • clockwise方向标志,如果设置为True,输出的凸包是顺时针方向的,否则为逆时针方向。

  • returnPoints默认值为True。它会返回凸包上点的坐标,如果设置为False,就会返回与凸包点对应的轮廓上的点。

        要获得上图的凸包,可以用下面命令:

        但是如果你想获得凸性缺陷,需要把returnPoints设置为False。以上面矩形为例,首先我们找到他的轮廓从cnt。现在把returnPoints设置为True查找凸包,得到的就是矩形的四个角点。把returnPoints设置为False,得到的是轮廓点的索引。

6、凸性检测

        函数CV2.isContourConvex()可以检测一个曲线是不是凸的。它只能返回True或者False。

7、边界矩形

直边界矩形,一个直矩形,没有旋转。不会考虑对象是否旋转。所以边界矩形的面积不是最小的。可以使用函数CV2.boundingRect()查找得到。

(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高

旋转的边界矩形,这个边界矩形是面积最小的,因为它考虑了对象的旋转。用函数CV2.minAreaRect()。返回的是一个Box2D结构,其中包含矩形最上角角点坐标(x,y)矩形的宽和高(w,h)以及旋转角度。但是要绘制这个矩形需要矩形的4个角点,可以通过函数CV2.boxPoints()获得。

其中绿色的为直矩形,红色为旋转矩形。








【第18节】OpenCV图片轮廓特征的评论 (共 条)

分享到微博请遵守国家法律