union_cocircular_contours_xld(Contours : UnionContours : MaxArcAngleDiff, MaxArcOverlap, MaxTangentAngle, MaxDist, MaxRadiusDiff, MaxCenterDist, MergeSmallContours, Iterations : )
union_cocircular_contours_xld合并属于同一圆的所有轮廓。
结果得到同一圆上相互连接的轮廓,保存于UnionContours。
该算法首先对每个轮廓进行拟合,
然后通过圆弧上的半径、圆心和间隙对拟合结果进行检验。
轮廓列表按半径递增顺序处理。
没有圆可拟合的轮廓线可选择在第二遍中合并。
阈值参数用于定义轮廓是否属于同一圆。
要合并两个轮廓线,必须同时满足所有阈值。
参数介绍
MaxArcAngleDiff
参数MaxArcAngleDiff定义了一个轮廓的端点
到一个圆上的第二个轮廓的起点之间的最大角度距离(以弧度为单位)。
MaxArcOverlap
MaxArcOverlap表示轮廓可能重叠的最大角度。
MaxTangentAngle
MaxTangentAngle描述圆切线与两条等值线连接线之间的最大夹角。
MaxDist
MaxDist表示两条轮廓线的端点和起点的最大绝对距离(以像素为单位)。
MaxRadiusDiff
MaxRadiusDiff是拟合到轮廓上的圆的半径的最大绝对值差。
MaxCenterDist
MaxCenterDist是圆中心欧氏距离的极限。
MergeSmallContours
如果参数 MergeSmallContours 被设置为“true”,那么没有拟合圆的等值线也会被合并。
要匹配一个小轮廓,轮廓的每一点到圆心的距离与半径的差不超过MaxRadiusDiff。
轮廓线上两个相邻点与圆切线的夹角必须在MaxTangentAngle之内。
此外,要合并两个轮廓线,必须满足MaxDist的条件。
Iterations
轮廓线的合并产生了新的圆参数。
因此,迭代可以导致进一步的合并。
参数Iterations 控制迭代的数量。
很少需要两个以上的迭代。
对于两个轮廓线的每一次可能的合并,
通过对不同阈值对应的距离求和计算成本。
为了便于比较,将距离按阈值缩放到0.0到1.0之间。
如果两个或多个轮廓起点与另一个轮廓的同一端点匹配,
则合并成本较低的轮廓。
您应该确保输入轮廓可以用直线和圆弧来逼近,
例如使用split_contours_xld对它们进行预处理。
例程:
dev_set_colored (12)
read_image (Image, 'circular_barcode')
dev_display (Image)
* 提取图像xld轮廓边缘
edges_sub_pix (Image, Edges, 'canny', 0.9, 20, 40)
* 选择轮廓长度满足条件的
select_contours_xld (Edges, SelectedContours, 'contour_length', 200, 99999, -0.5, 0.5)
* 连接圆形轮廓
union_cocircular_contours_xld (SelectedContours, UnionContours, 1.6, 0.9, 0.9, 30, 10, 10, 'true', 1)
dev_display (UnionContours)
stop ()
* 显示结果
dev_clear_window ()
dev_display (UnionContours)
|