OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
轮廓:更多函数

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

目标

  • 凸缺陷以及如何找到它们。
  • 找到点到多边形的最短距离
  • 匹配不同的形状

理论和代码

1. 凸缺陷

我们在关于轮廓的第二章中看到了什么是凸包。对象与此凸包的任何偏差都可以被认为是凸缺陷。我们可以使用图像来可视化它。我们画一条连接起点和终点的线,然后在最远点画一个圆。

注意
记住,为了找到凸缺陷,在找到凸包时必须传递 returnPoints = False。

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

参数
contour输入轮廓。
凸包使用 convexHull 获得的凸包,应包含构成凸包的轮廓点的索引
凸缺陷凸缺陷的输出向量。每个凸缺陷表示为 4 个元素(start_index, end_index, farthest_pt_index, fixpt_depth),其中索引是原始轮廓中凸缺陷开始、结束和最远点的从 0 开始的索引,并且 fixpt_depth 是最远轮廓点和凸包之间距离的定点近似值(具有 8 个小数位)。也就是说,要获得深度的浮点值,将是 fixpt_depth/256.0。

尝试一下

2. 点多边形测试

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

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

参数
contour输入轮廓。
pt针对轮廓测试的点。
measureDist如果为 true,则该函数估计从点到最近轮廓边缘的有符号距离。否则,该函数仅检查该点是否在轮廓内。
let dist = cv.pointPolygonTest(cnt, new cv.Point(50, 50), true);

3. 匹配形状

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

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

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

尝试一下