approxPolyDP 和 epsilon 参数如何工作?
How does approxPolyDP and epsilon parameter work?
有人可以很好地解释 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 algorithm
算法不检测形状,它简化轮廓。
它删除了对轮廓形状贡献很小 (epsilon) 的点。共线点是一个微不足道的情况,因为它们对轮廓的形状贡献 0。最突出的角保持不变。结果是输入轮廓的近似值。
更严格的 epsilon 迫使更忠实的近似,留下更多的点,下降到 所有点 剩余(无动作)。
请注意,在 square/rectangle/quad 甚至只有 圆角 的情况下, 边缘 的位置四边形 未维护 。 圆角 上的点保留。但是,近似值可用于 分割 原始轮廓,丢弃“角”点,并处理边缘点。
有人可以很好地解释 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 algorithm
算法不检测形状,它简化轮廓。
它删除了对轮廓形状贡献很小 (epsilon) 的点。共线点是一个微不足道的情况,因为它们对轮廓的形状贡献 0。最突出的角保持不变。结果是输入轮廓的近似值。
更严格的 epsilon 迫使更忠实的近似,留下更多的点,下降到 所有点 剩余(无动作)。
请注意,在 square/rectangle/quad 甚至只有 圆角 的情况下, 边缘 的位置四边形 未维护 。 圆角 上的点保留。但是,近似值可用于 分割 原始轮廓,丢弃“角”点,并处理边缘点。