OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
没有匹配项
轮廓:高级函数

上一教程: 轮廓的属性
下一教程: 轮廓层级

目标

  • 凸缺陷以及如何寻找这些缺陷
  • 在一点到多边形之间找到最短距离
  • 匹配不同的形状

理论和代码

1. 凸缺陷

我们在关于轮廓的第二章中看到了什么是凸包。对象对此凸包的任何偏差都可以视为凸缺陷。我们可以使用图像来形象化地表示它。我们绘制一根连接起点和终点的直线,然后在最远点处绘制一个圆圈。

注意
请记住,在寻找凸包时,我们必须传递 returnPoints = False,以便找到凸缺陷。

我们使用函数:cv.convexityDefects (轮廓,凸包,凸缺陷)

参数
轮廓输入轮廓。
凸包使用 convexHull 获得的凸包,其中应包含构成凸包的轮廓点的索引
凸缺陷凸缺陷的输出向量。每个凸缺陷都表示为 4 个元素 (start_index, end_index, farthest_pt_index, fixpt_depth),其中索引为凸缺陷起始、结束和最远点的原始轮廓中基于 0 的索引,而 fixpt_depth 为最远轮廓点与凸包之间的距离的定点数逼近(带有 8 个小数位)。也就是要获取深度的浮点数,公式为 fixpt_depth/256.0。

试试看

2. 点多边形测试

此函数查找图像中的一点到轮廓之间的最短距离。它返回的距离在点在轮廓外部时为负数,在点在轮廓内部时为正数,在点在轮廓上时为零。

我们使用函数:cv.pointPolygonTest (轮廓,点,measureDist)

参数
轮廓输入轮廓。
针对轮廓进行测试的点。
measureDist如果为 true,则此函数将估算点到最近轮廓边缘的有符号距离。否则,此函数只会检查点是否在轮廓内。
let dist = cv.pointPolygonTest(cnt, new cv.Point(50, 50), true);

3. 匹配形状

OpenCV 配备了函数 cv.matchShapes(),使用该函数我们可以比较两个形状或两个轮廓,并返回一个显示相似度的度量值。结果越低,匹配越好。它的计算基于 hu-矩值。文档中解释了不同的测量方法。

我们使用函数:cv.matchShapes (contour1, contour2, method, parameter)

参数
contour1第一个轮廓或灰度图像。
contour2第二个轮廓或灰度图像。
method比较方法,请参阅 cv::ShapeMatchModes
parameter特定方法的参数(当前不受支持)。

试用