2. HALCON开发环境与计量项目骨架
在精密测量与机器视觉计量工程中,HALCON 提供的不只是算子集合,更是一套从图像采集、标定、特征提取到亚像素测量的完整开发环境。理解 HDevelop、HDevelopEVO、算子库组织方式以及计量程序的基本骨架,是后续所有测量任务能够稳定复现的前提。本节围绕“开发环境如何组织、程序如何搭建、数据如何流动”展开,帮助读者建立可落地的工程认知。
一、HDevelop 与 HDevelopEVO:两种交互形态
HALCON 的经典集成开发环境是 HDevelop,它采用“程序窗口 + 变量窗口 + 算子窗口 + 图形窗口”的多窗格布局。程序窗口按行书写算子调用,每一行执行后,变量窗口立即显示图像、区域、轮廓、数组等对象的当前值,图形窗口则把区域、轮廓、测量点叠加显示在图像上。这种“逐行执行、即时观察”的机制,非常适合调试亚像素边缘、拟合直线或圆等计量环节。
HDevelopEVO 是面向新一代交互体验的开发环境,它在保留 HDevelop 算子语义的基础上,强化了流程组织、代码折叠、变量监视和可视化调试能力。对于计量项目,EVO 更适合管理较长的测量流程,例如“采集 → 标定 → 定位 → 测量 → 输出”这样包含多个阶段的程序。两者生成的代码本质一致,均可导出为 C++、C# 或 Python 调用,区别主要在于交互效率与工程组织方式。
二、算子库的组织逻辑
HALCON 算子按功能前缀组织,理解前缀即可快速定位算子。常见类别包括:read_image、open_framegrabber 属于图像采集;rgb1_to_gray、emphasize 属于图像预处理;threshold、connection、select_shape 属于区域分割;edges_sub_pix、measure_pos 属于亚像素边缘与测量;fit_line_contour_xld、fit_circle_contour_xld 属于几何拟合;vector_to_hom_mat2d、affine_trans_point_2d 属于坐标变换与标定。
计量项目中最关键的是 亚像素算子族 与 标定算子族。亚像素边缘通常由 edges_sub_pix 配合 canny 或 lanser 滤波器得到 XLD 轮廓,再用 fit_line_contour_xld 以 tukey 加权拟合直线,从而获得亚像素级直线参数。标定则通过 find_calib_object 提取标定板标记点,再用 calibrate_cameras 求解相机内参和畸变系数。
三、图像采集接口
HALCON 通过统一的 open_framegrabber 接口对接不同品牌相机。以 GigE Vision 相机为例,典型调用如下:
open_framegrabber ('GigEVision2', 0, 0, 0, 0, 0, 0, 'progressive',
-1, 'default', -1, 'false', 'default', 'cam0', 0, -1, AcqHandle)
grab_image (Image, AcqHandle)
close_framegrabber (AcqHandle)
其中 'GigEVision2' 指定接口类型,'cam0' 为设备标识,AcqHandle 是采集句柄。对于离线计量,可直接用 read_image 读取图像序列,便于复现和回归测试。采集阶段需要关注曝光时间、增益和触发模式,这些参数直接影响边缘对比度与测量重复性。
四、计量程序的基本骨架
一个可复现的 HALCON 计量程序通常包含五个阶段:采集与预处理、标定与坐标映射、ROI 定位、亚像素测量、结果输出与判定。下面给出一个测量金属件圆孔直径的骨架示例,参数为教学假设值:
* 1. 采集
read_image (Image, 'metal_part_01.png')
rgb1_to_gray (Image, GrayImage)
* 2. 标定:假设已获得像素当量 0.02 mm/pixel
PixelSize := 0.02
* 3. ROI 定位:在图像中心区域搜索圆孔
gen_circle (ROI, 640, 512, 180)
reduce_domain (GrayImage, ROI, ROIImage)
* 4. 亚像素边缘与拟合
edges_sub_pix (ROIImage, Edges, 'canny', 1.5, 20, 40)
fit_circle_contour_xld (Edges, 'algebraic', -1, 0, 0, 3, 2, \
Row, Column, Radius, StartPhi, EndPhi, PointOrder)
* 5. 结果换算与判定
DiameterMM := 2 * Radius * PixelSize
if (DiameterMM >= 9.98 and DiameterMM <= 10.02)
Result := 'PASS'
else
Result := 'FAIL'
endif
该骨架中,edges_sub_pix 的 Alpha 参数控制边缘平滑程度,值越小边缘越敏感但噪声也越多;fit_circle_contour_xld 的 MaxNumPoints 设为 -1 表示使用全部轮廓点。实际项目中,应先用标准件验证像素当量和拟合稳定性,再投入批量测量。
五、从骨架到工程化
上述骨架在 HDevelop 中可直接运行,但投入产线前还需补充三件事:其一,把标定参数 CamParam 和像素当量保存为文件,避免每次重新标定;其二,用 try...catch 包裹采集与拟合环节,处理图像缺失或轮廓点数不足的异常;其三,将测量结果写入 CSV 或通过 TCP 发送给上位机,形成可追溯的数据记录。
对于多工位测量,建议把“采集、标定、测量”拆分为独立过程(procedure),每个过程只暴露必要输入输出。这样在更换相机或调整 ROI 时,只需修改对应过程,不会影响整体流程。HALCON 的 dev_set_check 和 dev_get_window 等调试算子,可以帮助在开发阶段快速定位变量类型错误或窗口句柄失效问题。
change_radial_distortion_contours_xld 对轮廓做校正。