凸包

逼近多边形是轮廓的高度近似,但是有时候我们希望使用一个多边形的凸包来简化它。凸包跟逼近多边形很像,只不过它是物体最外层的凸多边形(轮廓在凸多边形内部;凸包仅有轮廓上的点组成;凸包上,任意连续的三个点的内角小于180度)。

轮廓和凸包之间的部分被称为凸缺陷(Converxity Defect),凸缺陷能够用来处理手势识别等问题。

1.获取凸包

式中返回值hull是凸包角点。式中参数如下:

points: 轮廓;

clockwise: 布尔类型。为True时,凸包角点按顺时针排列;

returnPoints:布尔类型。默认值是True,函数返回凸包角点的x/y轴坐标;当为False,函数返回凸包角点的索引。

例如:

代码
获取五角星的凸包

2.凸缺陷

凸包与轮廓之间的部分,称为凸缺陷。在OpenCV中使用函数cv2.convexityDefects()获取凸缺陷,雅阁时:

返回值是一个叔祖,每一行包含的值是【起点,终点,轮廓上距离凸包最远的点,最远点到凸包的近似距离】。contours是轮廓;要注意:在获取凸包convexhull时,函数v2.convexHull()的参数returnPoints必须是False,以获取角点索引。

例如:

代码
用点标出凸缺陷,位于五角星夹角处。

3.几何学测试

3.1测试轮廓是否是凸形

返回True表示是凸形,否则,不是凸形;

3.2点到轮廓的距离

在OpenCV中,函数cv2.pointPolygonTest()被用来计算点到多边形(轮廓的)最短距离(也就是垂线距离)。这个计算过程又称点和多边形的关系测试。

retval = cv2.pointPolygonTest(contour, pt, measureDist)

参数contour: 轮廓;

       pt: 待判定的点;

       measureDist:为布尔值,表示距离的判定方式。当为True时,表示点到轮廓的距离。若返回值retval是正值,表示在轮廓内部;为负值,表示在轮廓外部;为0,表示在轮廓上。当值为False, 表示不计算距离,只返回-1、0、1中的一个,返回1,表示在轮廓内部。

代码
运行结果,点A在五角星内部,距离为1

你可能感兴趣的:(凸包)