)
Halcon几何测量实战从点到线再到区域5个distance算子保姆级教程附完整代码在工业视觉检测中几何测量是最基础也最核心的功能之一。无论是检测零件的尺寸偏差还是定位物体的位置关系都离不开精确的几何计算。Halcon作为机器视觉领域的标杆工具提供了一系列强大的几何测量算子能够高效完成各种复杂场景下的测量任务。本文将带你从零开始通过一个完整的实战项目掌握Halcon中最常用的5个几何测量算子distance_pp、distance_pl、distance_pr、distance_lr和distance_ss。每个算子不仅会详细讲解其原理和使用方法还会提供可直接运行的完整代码和效果演示确保你能够真正学以致用。1. 环境准备与基础概念在开始实战之前我们需要先搭建好开发环境并了解一些基本概念。Halcon的开发环境相对简单你只需要安装Halcon的开发版或运行时版本即可。对于本教程推荐使用Halcon 20.11或更高版本。1.1 图像获取与预处理几何测量的第一步通常是获取清晰的图像。在实际项目中这可能涉及相机选型、光源设置等复杂环节。为了简化流程本教程将使用Halcon自带的示例图像* 初始化窗口 dev_close_window() read_image(Image, mreut) dev_open_window(0, 0, 512, 512, white, WindowID) dev_display(Image)关键预处理步骤图像二值化将灰度图像转换为二值图像便于后续处理区域连通性分析分离不同的物体区域区域筛选根据面积等特征选择感兴趣区域* 图像预处理示例 threshold(Image, Region, 180, 255) connection(Region, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, area, and, 10000, 100000000)1.2 几何测量基础Halcon的几何测量算子主要分为三类点相关测量distance_pp, distance_pl线相关测量distance_lr, distance_ss区域相关测量distance_pr每种算子都有其特定的应用场景和参数要求。理解这些差异是正确使用它们的关键。2. 点与点距离测量distance_ppdistance_pp算子是Halcon中最基础的几何测量工具用于计算两点之间的欧氏距离。其函数原型为distance_pp(Row1, Column1, Row2, Column2 : Distance)参数说明Row1, Column1第一个点的坐标Row2, Column2第二个点的坐标Distance输出的两点间距离2.1 实战示例下面是一个完整的distance_pp使用示例计算图像中一个固定点到区域轮廓上各点的距离* 获取区域轮廓 get_region_contour(SelectedRegions, Rows, Columns) * 定义参考点 RowPoint : 80 ColPoint : 250 * 可视化参考点 dev_set_color(red) gen_circle(Circle, RowPoint, ColPoint, 10) dev_display(Circle) * 计算并显示距离 dev_set_color(green) NumberTuple : |Rows| for I : 1 to NumberTuple by 10 * 绘制轮廓点 gen_cross_contour_xld(Cross, Rows[I], Columns[I], 6, 0.785398) * 绘制连线 gen_contour_polygon_xld(Contour, [Rows[I],RowPoint], [Columns[I],ColPoint]) * 计算距离 distance_pp(RowPoint, ColPoint, Rows[I], Columns[I], Distance) * 显示结果 dev_display(Cross) dev_display(Contour) wait_seconds(0.02) endfor提示在实际应用中可以通过设置采样间隔如示例中的by 10来提高计算效率特别是在处理大量点时。2.2 应用场景distance_pp常用于以下场景测量物体上两个特征点之间的距离计算物体中心到边缘的距离分布验证定位算法的精度3. 点到直线距离测量distance_pldistance_pl算子用于计算点到直线的最短距离。其函数原型为distance_pl(Row, Column, Row1, Column1, Row2, Column2 : Distance)参数说明Row, Column待测点的坐标Row1, Column1, Row2, Column2确定直线的两个点Distance点到直线的最短距离3.1 实战示例以下示例展示了如何计算区域轮廓上各点到一条参考直线的距离* 定义参考直线 RowLine1 : 5 ColLine1 : 300 RowLine2 : 300 ColLine2 : 400 * 显示参考直线 dev_set_color(red) disp_line(WindowID, RowLine1, ColLine1, RowLine2, ColLine2) * 计算轮廓点到直线的距离 dev_set_color(green) NumberTuple : |Rows| for i : 1 to NumberTuple by 20 * 绘制轮廓点 disp_line(WindowID, Rows[i], Columns[i] - 2, Rows[i], Columns[i] 2) disp_line(WindowID, Rows[i] - 2, Columns[i], Rows[i] 2, Columns[i]) * 计算距离 distance_pl(Rows[i], Columns[i], RowLine1, ColLine1, RowLine2, ColLine2, Distance) endfor3.2 应用场景distance_pl在以下场景中特别有用检测物体边缘与参考直线的偏差测量零件到基准线的距离计算点到导轨或导引线的距离4. 点到区域距离测量distance_prdistance_pr算子可以计算一个点到某个区域的最短和最长距离。其函数原型为distance_pr(Region, Row, Column : DistanceMin, DistanceMax)参数说明Region输入区域Row, Column待测点的坐标DistanceMin点到区域的最短距离DistanceMax点到区域的最长距离4.1 实战示例下面的代码展示了如何计算围绕中心点旋转的射线与目标区域的距离变化* 定义中心点 RowB1 : 255 ColumnB1 : 255 * 计算旋转射线的距离 for i : 1 to 360 by 1 * 计算射线终点 RowB2 : 255 sin(rad(i)) * 200 ColumnB2 : 255 cos(rad(i)) * 200 * 绘制射线 disp_line(WindowID, RowB1, ColumnB1, RowB2, ColumnB2) * 计算距离 distance_pr(SelectedRegions, RowB2, ColumnB2, DistanceMin, DistanceMax) endfor4.2 应用场景distance_pr适用于计算物体到边界的距离分布检测孔洞或凹槽的深度分析区域形状的不规则程度5. 线到区域距离测量distance_lrdistance_lr算子用于计算一条直线到一个区域的最短和最长距离。其函数原型为distance_lr(Region, Row1, Column1, Row2, Column2 : DistanceMin, DistanceMax)参数说明Region输入区域Row1, Column1, Row2, Column2确定直线的两个点DistanceMin直线到区域的最短距离DistanceMax直线到区域的最长距离5.1 实战示例以下代码演示了如何扫描多组直线并计算它们与目标区域的距离* 使用不同图像 read_image(Image, fabrik) threshold(Image, Region, 180, 255) connection(Region, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, area, and, 5000, 100000000) * 定义直线参数 Row1 : 100 Row2 : 400 * 扫描直线并计算距离 for Col : 50 to 400 by 4 * 计算距离 distance_lr(SelectedRegions, Row1, Col 100, Row2, Col, DistanceMin, DistanceMax) * 根据距离设置颜色 if (DistanceMin 0) dev_set_color(green) // 与区域相交 else dev_set_color(red) // 不与区域相交 endif * 绘制直线 disp_line(WindowID, Row1, Col 100, Row2, Col) endfor5.2 应用场景distance_lr常用于检测传送带上物体与边缘的距离测量导轨与工件的间隙分析区域边界与参考线的关系6. 线到线距离测量distance_ssdistance_ss算子用于计算两条线段之间的最短和最长距离。其函数原型为distance_ss(RowA1, ColumnA1, RowA2, ColumnA2, RowB1, ColumnB1, RowB2, ColumnB2 : DistanceMin, DistanceMax)参数说明RowA1, ColumnA1, RowA2, ColumnA2第一条线段的两个端点RowB1, ColumnB1, RowB2, ColumnB2第二条线段的两个端点DistanceMin两条线段间的最短距离DistanceMax两条线段间的最长距离6.1 实战示例下面的代码展示了如何计算多条线段与一条参考线之间的距离* 定义参考线 RowLine1 : 400 ColLine1 : 200 RowLine2 : 240 ColLine2 : 400 * 绘制参考线 dev_set_color(black) disp_line(WindowID, RowLine1, ColLine1, RowLine2, ColLine2) * 计算多组线段与参考线的距离 Rows : 40 Columns : 50 n : 0 for Rows : 40 to 200 by 4 * 计算距离 distance_ss(Rows, Columns, Rows n, Columns n, RowLine1, ColLine1, RowLine2, ColLine2, DistanceMin, DistanceMax) * 根据距离设置颜色 if (DistanceMin 0) dev_set_color(green) // 相交 else dev_set_color(red) // 不相交 endif * 绘制线段 disp_line(WindowID, Rows, Columns, Rows n, Columns n) n : n 8 endfor6.2 应用场景distance_ss适用于检测交叉或平行的线结构测量PCB板导线间距分析机械结构中线元素的相对位置7. 综合应用与性能优化掌握了各个算子的基本用法后我们需要考虑如何在实际项目中高效地组合使用它们。以下是几个实用建议性能优化技巧减少不必要的计算只在感兴趣的区域进行计算合理设置采样密度根据精度要求调整计算频率利用并行处理Halcon支持多线程计算预筛选区域先进行粗略筛选再精细测量错误处理建议检查输入参数的有效性处理可能的除零情况验证测量结果的合理性范围* 综合应用示例测量多个特征 measure_positions(Image, SelectedRegions, Measurements) for i : 0 to |Measurements| - 1 by 1 * 计算各种距离 distance_pp(Measurements[i].Row, Measurements[i].Column, ReferencePoint.Row, ReferencePoint.Column, DistPP) distance_pl(Measurements[i].Row, Measurements[i].Column, LineStart.Row, LineStart.Column, LineEnd.Row, LineEnd.Column, DistPL) * 记录和分析结果 add_measurement_result(MeasurementID, i, DistPP, DistPL) endfor在实际项目中几何测量往往不是孤立的任务而是与定位、识别、分类等其他功能紧密结合。通过合理设计测量流程和结果分析策略可以构建出更加鲁棒和高效的视觉检测系统。