凸包

作者: 长歌行夜一 | 来源:发表于2020-09-06 12:15 被阅读0次

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

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

    1.获取凸包

    hull = cv2.convexHull(points[,clockwise[, returnPoints]])

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

    points: 轮廓;

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

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

    例如:

    代码 获取五角星的凸包

    2.凸缺陷

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

    convexityDefects = cv2.convexityDefects(contours, convexhull)

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

    例如:

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

    3.几何学测试

    3.1测试轮廓是否是凸形

    retval = cv2.isContourConvex(contours)

    返回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

    相关文章

      网友评论

          本文标题:凸包

          本文链接:https://www.haomeiwen.com/subject/dhcwjktx.html