算子 segment_contours_xld
segment_contours_xld
功能:将 XLD 轮廓分割为线段、圆弧或椭圆弧。
签名
segment_contours_xld(Contours : ContoursSplit : Mode, SmoothCont, MaxLineDist1, MaxLineDist2)
参数详解
输入参数
-
Contours (输入对象)
-
类型:XLD 轮廓数组
-
描述:待分割的输入轮廓。
-
-
Mode (输入控制)
-
类型:字符串
-
可选值:
-
'lines'
:仅分割为线段。 -
'lines_circles'
:分割为线段和圆弧。 -
'lines_ellipses'
:分割为线段和椭圆弧。
-
-
默认值:
'lines_circles'
-
作用:选择分割模式。
-
-
SmoothCont (输入控制)
-
类型:整数
-
默认值:5
-
建议值:0, 3, 5, 7, 9
-
限制:
SmoothCont == 0
或SmoothCont >= 3
且为奇数。 -
作用:平滑轮廓的采样点数。
-
设为
0
表示不进行平滑。 -
值越大,轮廓越平滑(抑制噪声,但可能丢失细节)。
-
-
-
MaxLineDist1 (输入控制)
-
类型:实数
-
默认值:4.0
-
建议值:1.0, 1.5, 2.0, 2.5, 3.0, 3.5
-
作用:
-
第一阶段的线段近似最大距离。
-
控制初始多边形近似的精度(值越大,线段越少,但可能忽略细节)。
-
-
-
MaxLineDist2 (输入控制)
-
类型:实数
-
默认值:2.0
-
建议值:1.0, 1.5, 2.0, 2.5, 3.0, 3.5
-
作用:
-
第二阶段的线段近似最大距离(仅对
'lines_circles'
和'lines_ellipses'
有效)。 -
用于细化第一阶段未处理的区域(通常设为比
MaxLineDist1
更小的值)。
-
-
输出参数
-
ContoursSplit (输出对象)
-
类型:XLD 轮廓数组
-
描述:分割后的轮廓,每个子轮廓的全局属性
'cont_approx'
标识其类型:-
-1
:线段 -
0
:圆弧('lines_circles'
模式) -
1
:椭圆弧('lines_ellipses'
模式)
-
-
算法原理
-
预处理:
-
若
SmoothCont > 0
,先对输入轮廓进行平滑(类似smooth_contours_xld
),抑制噪声。 -
使用 Ramer 算法(
gen_polygons_xld
)进行初始多边形近似,最大距离为MaxLineDist1
。
-
-
分割逻辑:
-
模式
'lines'
:直接输出多边形近似结果。 -
模式
'lines_circles'
或'lines_ellipses'
:-
第一阶段:用
MaxLineDist1
生成初始线段。 -
合并圆弧:若相邻线段可替换为圆弧(误差更小),则合并为圆弧。
-
第二阶段:用
MaxLineDist2
对剩余线段重新分割,进一步合并短弧。
-
优势:两步法比单步法更高效,尤其适合长弧检测。
-
-
-
输出限制:
-
输出轮廓长度 ≥ 3 像素,且包含 ≥ 6 个连续点。
-
过短的输入轮廓直接复制到输出,不做处理。
-
参数调试指南
1. Mode 选择
-
'lines'
:适用于简单直线检测(如 PCB 板边缘)。 -
'lines_circles'
:适合工业零件中的圆孔、轴承检测。 -
'lines_ellipses'
:用于椭圆目标(如倾斜的圆形标记)。
2. SmoothCont
-
噪声较多时:增大值(如 5 或 7),但需权衡细节丢失。
-
高精度场景:设为 0 或 3,保留原始轮廓特征。
3. MaxLineDist1 和 MaxLineDist2
-
调试步骤:
-
初始设置:
MaxLineDist1=4.0
,MaxLineDist2=2.0
。 -
若圆弧漏检:减小
MaxLineDist1
(如 3.0)。 -
若线段过多:增大
MaxLineDist1
或MaxLineDist2
。 -
平衡速度与精度:
-
MaxLineDist1
大 → 计算快,但可能漏细节。 -
MaxLineDist2
小 → 精度高,但计算量增加。
-
-
4. 示例调试场景
-
场景 1:金属零件圆孔检测
# 参数设置 Mode = 'lines_circles' SmoothCont = 5 # 抑制加工毛刺 MaxLineDist1 = 3.0 # 初始近似保留大圆弧 MaxLineDist2 = 1.5 # 细化小圆弧
-
场景 2:实时机器人抓取
Mode = 'lines' # 仅需线段信息 SmoothCont = 0 # 禁用平滑以降低延迟 MaxLineDist1 = 5.0 # 快速生成粗略轮廓
示例代码
read_image (Image, 'pumpe')
edges_sub_pix (Image, Edges, 'canny', 1.5, 15, 40)
segment_contours_xld (Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
count_obj (ContoursSplit, Number)
gen_empty_obj (Lines)
gen_empty_obj (Circles)
for I := 1 to Number by 1
select_obj (ContoursSplit, Contour, I)
get_contour_global_attrib_xld (Contour, 'cont_approx', Type)
if (Type == -1)
concat_obj (Lines, Contour, Lines)
else
concat_obj (Circles, Contour, Circles)
endif
endfor
fit_line_contour_xld (Lines, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
fit_circle_contour_xld (Circles, 'atukey', -1, 2, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
调试技巧
-
可视化验证:
-
使用
dev_display
显示分割后的轮廓,检查线段和圆弧是否符合预期。 -
对比不同参数下
ContoursSplit
的差异。
-
-
性能监控:
-
在实时系统中,监控算子执行时间,调整
MaxLineDist1
和SmoothCont
以优化速度。
-
-
鲁棒性测试:
-
在不同光照、噪声水平的图像上测试参数,确保泛化能力。
-
通过合理调整参数,segment_contours_xld