HALCON XLD 轮廓筛选分段 , 局部直线拟合

一、整体流程

1. 图像亚像素边缘提取 → 生成原始 XLD 边缘轮廓
2. 按长度筛选轮廓 → 剔除短小杂线、噪声毛刺
3. 轮廓几何分段 → 将连续轮廓切分为直线 / 圆弧小段
4. 形状筛选 → 仅保留直线段轮廓
5. 直线局部拟合 → 单段轮廓精准拟合直线
6. 直线求交 → 获取两条拟合直线交点坐标

二、核心算子

1. edges_sub_pix 亚像素边缘提取

text
edges_sub_pix (Image, Edges, Filter, Alpha, Low, High)
- 作用:从输入的灰度图像中提取亚像素级别的高精度边缘,相比普通像素级边缘提取,能精准定位边缘的实际位置(精度可达像素的十分之一甚至百分之一),最终生成包含所有边缘信息的原始 XLD 轮廓集合,是后续轮廓处理的基础。
- 输入参数:
  - Image:输入的待提取边缘的灰度图像,是算子处理的原始图像数据;
  - Filter:边缘提取使用的滤波算法类型,决定边缘检测的核心逻辑;
  - Alpha:滤波算法的平滑系数,控制边缘检测时的图像平滑程度;
  - Low:边缘检测的低阈值,用于筛选边缘梯度值的下限;
  - High:边缘检测的高阈值,用于筛选边缘梯度值的上限。
- 输出参数:
  - Edges:输出的原始杂乱边缘 XLD 轮廓集合,包含图像中所有符合阈值条件的亚像素边缘。
- 常用参数:Filter='canny',选用 canny 滤波是因为它能有效抑制图像噪声,同时精准定位边缘位置,是工业场景中边缘提取的首选算法,兼顾抗噪性和边缘定位精度;Alpha=1,该值设置为 1 时能在平滑图像和保留边缘细节间取得平衡,避免过度平滑导致边缘丢失,也不会因平滑不足保留过多噪声;Low=20,设置 20 作为低阈值,能过滤掉梯度值过小的微弱噪声边缘;High=40,设置 40 作为高阈值,确保只有梯度值足够大的真实边缘被提取出来。

2. select_contours_xld 按长度剔除杂线

text
select_contours_xld (Contours, SelectedContours, Feature, Min, Max, Order1, Order2)
- 输入参数:
  - Contours:输入的待筛选的 XLD 轮廓集合,是前期边缘提取得到的原始轮廓数据;
  - Feature:筛选依据的轮廓特征类型,比如 'length' 代表按长度筛选;
  - Min:筛选特征的最小值阈值,比如按长度筛选时就是轮廓的最小长度;
  - Max:筛选特征的最大值阈值,比如按长度筛选时就是轮廓的最大长度;
  - Order1:辅助排序参数,一般默认 0 即可,无实际筛选作用;
  - Order2:辅助排序参数,一般默认 0 即可,无实际筛选作用。
- 输出参数:
  - SelectedContours:输出的筛选后符合条件的 XLD 轮廓集合,仅保留长度在 Min 到 Max 之间的轮廓。
- 常用参数:Feature='length',选用 length 作为筛选特征,是因为短杂线、毛刺的核心特征就是轮廓长度短,通过长度阈值能快速区分有效轮廓和干扰轮廓;Min 可根据实际场景设置,比如设为 50,代表剔除长度小于 50 像素的轮廓,Max 设为 1000,代表保留长度不超过 1000 像素的轮廓,这样能精准过滤掉微小噪声,同时避免保留过长的无关轮廓。

- 作用:根据轮廓的指定特征对输入的 XLD 轮廓集合进行筛选,最常用的是按长度过滤,能快速删除图像中因噪声、工件毛刺等产生的短碎线条,只保留长度符合要求的有效长轮廓,减少后续处理的干扰,提升轮廓分析的准确性。

- Filter 参数选择(现场最实用)

-

text
    canny:高斯模糊 + 双阈值,抗噪强、边缘干净,适用于边缘清晰、亮度对比明显的图像。
deriche1(deriche2边缘更模糊的弱边缘):递归滤波,灵敏度高、保留弱边缘,适用于边缘淡、暗、对比度低的图像。
``

- 适用:快速去除画面干扰线、工件边缘毛刺

3. segment_contours_xld 轮廓自动分段

segment_contours_xld (Contours, ContourSegments, Mode, Smooth, MaxDist) - 输入参数: - Contours:输入的待分段的长 XLD 轮廓集合,是筛选后保留的有效长轮廓; - Mode:分段模式,决定轮廓拆分的类型,比如 'lines' 代表仅拆分出直线类轮廓; - Smooth:轮廓平滑系数,值越大轮廓越平滑,能减少分段时的局部波动干扰; - MaxDist:轮廓分段的最大距离阈值,代表拆分后的小段轮廓与原轮廓的最大允许偏差,值越小分段越精细。 - 输出参数: - ContourSegments:输出的拆分后的小段 XLD 轮廓集合,每一段都是单一的直线或圆弧轮廓。
text

- 作用:将输入的长连续 XLD 轮廓按照指定模式自动拆分成多个小段轮廓,核心是区分直线段和圆弧段,实现轮廓的局部拆分,避免整段长轮廓因局部弯曲、拐点导致后续拟合偏差,让每一段轮廓都能精准贴合单一的几何形状(直线或圆弧)。
- 常用参数:Mode='lines',选用 'lines' 模式是因为工业场景中大多需要提取直线轮廓(如工件的直边、设备的边框等),该模式能只拆分出直线类的小段轮廓,过滤掉圆弧部分,贴合实际检测需求;Smooth 设为 5,能适度平滑轮廓的微小波动,避免因轮廓局部抖动导致错误分段;MaxDist 设为 1.5,控制拆分后的直线段与原轮廓的偏差不超过 1.5 像素,保证分段后的轮廓既贴合原轮廓,又能精准体现直线特征。
- 核心用途:实现局部区域单独拟合,避免整段轮廓拟合偏差

4. select_shape_xld 筛选纯直线轮廓

select_shape_xld (Segments, LineSegments, Feature, Operation, Min, Max) - Segments:输入的待筛选的分段后 XLD 轮廓小段集合; - Feature:筛选依据的形状特征,'cont_approx' 代表轮廓的近似直线度; - Operation:筛选逻辑操作符,默认 'and' 即可,代表同时满足 Min 和 Max 阈值; - Min:形状特征的最小值阈值; - Max:形状特征的最大值阈值。 - LineSegments:输出的筛选后纯直线 XLD 轮廓集合,仅保留直线度符合要求的轮廓。
text

- 作用:对分段后的 XLD 轮廓小段集合进行形状特征筛选,过滤掉圆弧、拐点等非直线轮廓,只保留符合直线特征的标准直线 XLD 轮廓,为后续直线拟合提供纯净的轮廓数据。
- 常用参数:Feature='cont_approx',选用 'cont_approx' 特征是因为该特征能量化轮廓与理想直线的贴合程度,值越小代表轮廓越接近直线;Min 设为 0,Max 设为 0.5,代表只保留直线度在 0~0.5 之间的轮廓,这个范围能有效区分直线和圆弧 / 拐点,保证筛选后都是纯直线轮廓。

5. fit_line_contour_xld XLD 轮廓拟合直线

fit_line_contour_xld (Contour, Algorithm, MaxNumPoints, ClippingEndPoints, Iterations, ClipLength, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist) - 输入参数: - Contour:输入的单段纯直线 XLD 轮廓,是筛选后得到的待拟合轮廓; - Algorithm:拟合算法类型,决定拟合的计算逻辑; - MaxNumPoints:参与拟合的最大点数,默认设为 - 1 代表使用轮廓所有点; - ClippingEndPoints:端点裁剪比例,默认设为 0 代表不裁剪端点; - Iterations:迭代计算次数,默认设为 5 代表通过 5 次迭代优化拟合结果; - ClipLength:裁剪长度阈值,默认设为 0 代表不裁剪; - 输出参数: - RowBegin:拟合直线起点的行坐标; - ColBegin:拟合直线起点的列坐标; - RowEnd:拟合直线终点的行坐标; - ColEnd:拟合直线终点的列坐标; - Nr:直线法向量的行分量; - Nc:直线法向量的列分量; - Dist:轮廓点到拟合直线的平均距离,用于评估拟合精度。
text

- 作用:对单段纯直线 XLD 轮廓进行局部精准直线拟合,通过指定的算法计算出最贴合该轮廓的直线参数,输出直线的首尾端点坐标,为后续计算直线交点、测量直线尺寸等操作提供精准的直线数据。
- 常用参数:Algorithm='tukey',选用 tukey 算法是因为它具有抗噪性,能忽略轮廓中少量异常点(如噪声点、轮廓毛刺)的影响,拟合出更贴合真实直线的结果,特别适配工业工件边缘存在少量干扰的场景;MaxNumPoints=-1,使用轮廓所有点参与拟合,能最大程度保证拟合的准确性;Iterations=5,通过 5 次迭代计算,能逐步优化拟合参数,提升直线拟合的精准度。
- 输出:直线起点、终点行列坐标,用于后续求交点

6. intersection_lines 求取直线交点

intersection_lines (Row1, Col1, Row2, Col2, Row3, Col3, Row4, Col4, RowInter, ColInter, IsIntersection) - 输入参数: - Row1:第一条直线起点的行坐标; - Col1:第一条直线起点的列坐标; - Row2:第一条直线终点的行坐标; - Col2:第一条直线终点的列坐标; - Row3:第二条直线起点的行坐标; - Col3:第二条直线起点的列坐标; - Row4:第二条直线终点的行坐标; - Col4:第二条直线终点的列坐标。 - 输出参数: - RowInter:交点的行坐标,若直线不相交则为 0; - ColInter:交点的列坐标,若直线不相交则为 0; - IsIntersection:相交判定标识,1 代表两条直线正常相交,0 代表两条直线平行无交点。 - 返回值:
IsIntersection=1 正常相交,0 为平行无交点

7. 无 XLD 备选算子(纯点集拟合)

text

- 作用:传入两条直线的首尾端点坐标,通过几何计算得出两条直线在像素坐标系中的交点坐标,同时判断两条直线是否相交,是工业场景中定位交点、测量夹角、标定位置的核心算子。
- 
fit_line (Rows, Cols, Algorithm, MaxNumPoints, ClippingEndPoints, Iterations, ClipLength, Row1, Col1, Row2, Col2) - 输入参数: - Rows:输入的离散点集的行坐标数组,比如 [10,20,30] 代表 3 个点的行坐标; - Cols:输入的离散点集的列坐标数组,比如 [15,25,35] 代表 3 个点的列坐标; - Algorithm:拟合算法类型,常用 'tukey' 或 'least_squares'; - MaxNumPoints:参与拟合的最大点数,-1 代表使用所有点; - ClippingEndPoints:端点裁剪比例,0 代表不裁剪; - Iterations:迭代次数,5 代表迭代 5 次优化结果; - ClipLength:裁剪长度阈值,0 代表不裁剪。 - 输出参数: - Row1:拟合直线起点的行坐标; - Col1:拟合直线起点的列坐标; - Row2:拟合直线终点的行坐标; - Col2:拟合直线终点的列坐标。
text

- 作用:针对没有图像边缘、只有自定义离散坐标点的场景,直接对输入的行、列坐标点集进行直线拟合,计算出最贴合这些点集的直线,输出直线的首尾端点坐标,无需生成 XLD 轮廓,简化拟合流程。
- 
- 常用参数:Algorithm='least_squares',选用最小二乘法是因为离散点集无过多噪声时,该算法计算速度快、拟合结果稳定,能精准贴合点集的整体趋势;MaxNumPoints=-1,使用所有离散点参与拟合,保证拟合结果的全面性。
- 适用场景:无图像边缘,仅自定义离散坐标点拟合直线
- 优势:无需生成 XLD,代码简洁,标定点位拟合首选

三、标准完整执行流程

1. 读取目标图像,预处理降噪(可选)

mean_image (mA2, ImageMean, 9, 9)
scale_image (mA2, ImageScaled, 0.01, 0)
`

2. 调用edges_sub_pix提取全图亚像素边缘 XLD

3. 调用select_contours_xld过滤短杂线,保留有效长轮廓

4. 调用segment_contours_xld对长轮廓进行直线分段

5. 调用select_shape_xld筛选出所有纯直线段轮廓

6. 遍历目标直线段,使用fit_line_contour_xld局部拟合直线

7. 提取两组拟合直线端点,使用intersection_lines计算交点

8. 输出交点像素坐标,完成定位 / 测量 / 标定辅助取点

四、场景选用原则

1. 图像处理提取工件边缘线条:优先XLD 整套流程,抗干扰强、可分段局部拟合
2. 手动标定点位、离散采样坐标:优先
fit_line`无 XLD 拟合,简洁高效
3. 存在大量干扰线条、工件多折边:必须使用剔杂线 + 分段流程,保证拟合精度