approxPolyDP 和 epsilon 参数如何工作?

问题描述 投票:0回答:1

有人可以很好地解释 epsilon 的工作原理吗?

我就是这样使用的。

cv::approxPolyDP(contour, approx, cv::arcLength(contour, true) * precision, true);

默认

double precision=0.02

对我来说没有意义的是,

precision
越低,形状检测就越不严格?

例如,如果我正在图像中查找矩形轮廓,但并非检测到所有矩形轮廓,并且

precision
设置为
0.5
(更高),则更少的矩形轮廓被检测为矩形。但如果我将
precision
设置为
0.01
(较低),则会检测到更多矩形轮廓???

不应该反过来吗?更低的

precision
=更严格的形状检测?

c++ opencv
1个回答
3
投票

approxPolyDP
实现 Ramer–Douglas–Peucker 算法

该算法不会检测形状,而是简化轮廓。

它删除了对轮廓形状贡献很小(epsilon)的点。共线点是一个微不足道的情况,因为它们对轮廓的形状贡献“零”。最突出的角保持原状。结果是输入轮廓的近似值。 更紧/更小的 epsilon 会迫使更忠实的近似,留下更多的点,直至剩下

所有点

(无动作)。 更宽松/更大的 epsilon 可以更强烈地简化形状。

请注意,对于正方形/矩形/四边形,即使只有

圆角

,四边形的 的位置也 不会被保留圆角上的点仍然存在。然而,近似可以用来分割原始轮廓,丢弃“角”点,并使用边缘点。

© www.soinside.com 2019 - 2024. All rights reserved.