halcon的union_collinear_contours_xld和union_adjacent_contours_xld

1、union_collinear_contours_xld 是 Halcon 中用于处理 XLD(eXtended Line Descriptor)轮廓的函数。这个函数的主要目的是合并那些在特定条件下共线的轮廓,通常用于图像处理中的边缘检测和形状分析。

参数列表

  • Contours (input_object):输入的 XLD 轮廓。
  • UnionContours (output_object):合并后的输出轮廓。
  • MaxDistAbs (input_control):沿参考轮廓的回归线测量两个轮廓之间的最大间隙长度(间隙在参考轮廓拟合直线上的投影)。
  • MaxDistRel (input_control):间隙在参考轮廓拟合直线上的投影长度与参考轮廓长度的比值上限。
  • MaxShift (input_control):第二个轮廓与参考轮廓拟合直线的最大距离。
  • MaxAngle (input_control):两个轮廓拟合直线之间的角度上限(0.0 ≤ MaxAngle ≤ 0.78539816339,即45度)。
  • Mode (input_control):定义轮廓属性处理的模式,即是否保留或丢弃轮廓属性

参数详解

  • MaxDistAbs 决定了两个轮廓绝对距离的上限,这个距离是两个轮廓直线间隙在参考轮廓拟合直线上的投影的长度。
  • MaxDistRel 决定了两个轮廓相对距离的上限,相对距离由绝对距离除以参考轮廓长度计算得出。
  • MaxShift 决定了第二个轮廓距离参考轮廓拟合直线最大距离的上限,此距离是垂直于参考轮廓的拟合直线测量的。
  • MaxAngle 决定了两个轮廓的拟合直线之间角度的上限。

模式(Mode)

  • 'attr_keep':所有属性都复制到输出轮廓。全局属性仅保留在那些未与其他轮廓合并的轮廓上。(可以使用query_contour_attribs_xld查看轮廓属性)
  • 'attr_forget':输出轮廓将不包含任何属性。如果不需要这些属性进行进一步计算,可以选择此模式以提高性能。

2、union_adjacent_contours_xld 是 Halcon 中用于合并相邻轮廓的算子。这个算子会将输入的 XLD(扩展线描述)轮廓数组中,端点相近的轮廓合并。

参数列表

  • Contours (input_object):输入的 XLD 轮廓数组。
  • UnionContours (output_object):合并后的输出轮廓数组。
  • MaxDistAbs (input_control):两个轮廓端点间的最小距离控制参数,这个距离是沿着参考轮廓的回归线测量的,即两个轮廓之间间隙在参考轮廓拟合直线上的投影长度。
  • MaxDistRel (input_control):两个轮廓端点间的最小距离与最长轮廓长度的比值控制参数。
  • Mode (input_control):定义轮廓属性处理的模式,即是否保留或丢弃轮廓属性

### 如何在 HALCON 中获取 XLD 的位置信息 在 HALCON 中,XLD 是一种扩展线条描述的数据结构,能够存储丰富的几何信息。要获取 XLD 的位置信息,可以通过访问其属性调用特定的算子实现。 #### 1. 访问 XLD 坐标 XLD 数据结构中的每个点都具有精确的坐标信息(亚像素级别)。可以使用 `get_contour_xld` 算子提取这些坐标: ```python * 获取 XLD 轮廓的坐标 get_contour_xld (Contour, Rows, Columns) ``` 上述代码会返回两个数组:`Rows` `Columns`,分别代表轮廓上各点的行坐标列坐标[^1]。 #### 2. 使用统计方法计算中心位置 如果需要获得整个 XLD 轮廓的中心位置,可以利用 `tuple_mean` 来计算平均值: ```python * 计算 XLD 轮廓的中心位置 tuple_mean(Rows, CenterRow) tuple_mean(Columns, CenterColumn) ``` 这样可以获得该 XLD 轮廓的质心 `(CenterRow, CenterColumn)`。 #### 3. 提取线段的方向角度 对于由多个点组成的直线型 XLD,可以通过首尾两点计算方向向量并进一步得到角度。以下是具体过程: ```python * 获取 XLD 首尾点 gen_cross_contour_xld(Cross, RowStart, ColStart, RowEnd, ColEnd) * 计算偏移量 OffsetX := ColEnd - ColStart OffsetY := RowEnd - RowStart * 利用反正切函数求解角度 tuple_atan2(OffsetY, OffsetX, AngleRad) tuple_deg(AngleRad, AngleDeg) ``` 最终得出的角度 `AngleDeg` 表示该线段相对于 X 轴正方向的夹角[^3]。 #### 4. 合并后的 XLD 处理 当执行过合并操作(如 `union_collinear_contours_xld`, `union_cocircular_contours_xld` 或者 `union_adjacent_contours_xld`),新生成的 XLD 结构仍然保留完整的坐标集合。因此可以直接重复以上步骤来分析新的轮廓[^2]。 --- ### 示例程序 下面是一个综合的例子,展示如何读入图像、找到目标对象边界并输出其中一条边界的中心位置及其倾斜度数: ```hdevelop read_image(Image, 'path_to_your_image') edges_sub_pix(Image, Edges, 'canny', 1, 20, 40) select_shape_std(Edges, SelectedContours, 'large', 50) get_contour_xld(SelectedContours[0], Rows, Columns) * 计算中心点 tuple_mean(Rows, CenterRow) tuple_mean(Columns, CenterColumn) * 输出第一个端点到最后一个端点之间的斜率角度 gen_cross_contour_xld(SelectedContours[0], StartRow, StartCol, EndRow, EndCol) OffsetX := EndCol - StartCol OffsetY := EndRow - StartRow tuple_atan2(OffsetY, OffsetX, AngleRad) tuple_deg(AngleRad, AngleDeg) dev_display(Image) disp_cross(10, CenterRow, CenterColumn, 0, 'black') * 显示中心十字标记 write_line(WindowHandle, [], [], ['Line angle:', AngleDeg]) ``` 此脚本不仅展示了基本的操作流程,还包含了图形化显示部分以便验证结果准确性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值