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