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

上一教程: 轮廓属性
下一教程: 轮廓层次结构

目标

  • 凸缺陷及其查找方法。
  • 查找点到多边形的最短距离
  • 匹配不同的形状

理论与代码

1. 凸缺陷

我们在关于轮廓的第二章中了解了什么是凸包。物体偏离此凸包的任何偏差都可以视为凸缺陷。我们可以使用图像将其可视化。我们绘制一条连接起点和终点的线,然后在最远点绘制一个圆。

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

我们使用函数:cv.convexityDefects (contour, convexhull, convexityDefect)

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

试一试

2. 点多边形测试

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

我们使用函数:cv.pointPolygonTest (contour, pt, measureDist)

参数
contour输入轮廓。
pt针对轮廓测试的点。
measureDist如果为真,则函数估计点到最近轮廓边缘的有符号距离。否则,函数只检查点是否在轮廓内。
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特定于方法的参数(目前不支持)。

试一试