有人可以很好地解释 epsilon 的工作原理吗?
我就是这样使用的。
cv::approxPolyDP(contour, approx, cv::arcLength(contour, true) * precision, true);
默认
double precision=0.02
。
对我来说没有意义的是,
precision
越低,形状检测就越不严格?
例如,如果我正在图像中查找矩形轮廓,但并非检测到所有矩形轮廓,并且
precision
设置为 0.5
(更高),则更少的矩形轮廓被检测为矩形。但如果我将 precision
设置为 0.01
(较低),则会检测到更多矩形轮廓???
不应该反过来吗?更低的
precision
=更严格的形状检测?
approxPolyDP
实现 Ramer–Douglas–Peucker 算法
该算法不会检测形状,而是简化轮廓。
它删除了对轮廓形状贡献很小(epsilon)的点。共线点是一个微不足道的情况,因为它们对轮廓的形状贡献“零”。最突出的角保持原状。结果是输入轮廓的近似值。 更紧/更小的 epsilon 会迫使更忠实的近似,留下更多的点,直至剩下
所有点(无动作)。 更宽松/更大的 epsilon 可以更强烈地简化形状。
请注意,对于正方形/矩形/四边形,即使只有
圆角,四边形的 边 的位置也 不会被保留。 圆角上的点仍然存在。然而,近似可以用来分割原始轮廓,丢弃“角”点,并使用边缘点。