2. HALCON开发环境与计量项目骨架

在精密测量与机器视觉计量工程中,HALCON 提供的不只是算子集合,更是一套从图像采集、标定、特征提取到亚像素测量的完整开发环境。理解 HDevelop、HDevelopEVO、算子库组织方式以及计量程序的基本骨架,是后续所有测量任务能够稳定复现的前提。本节围绕“开发环境如何组织、程序如何搭建、数据如何流动”展开,帮助读者建立可落地的工程认知。

一、HDevelop 与 HDevelopEVO:两种交互形态

HALCON 的经典集成开发环境是 HDevelop,它采用“程序窗口 + 变量窗口 + 算子窗口 + 图形窗口”的多窗格布局。程序窗口按行书写算子调用,每一行执行后,变量窗口立即显示图像、区域、轮廓、数组等对象的当前值,图形窗口则把区域、轮廓、测量点叠加显示在图像上。这种“逐行执行、即时观察”的机制,非常适合调试亚像素边缘、拟合直线或圆等计量环节。

HDevelopEVO 是面向新一代交互体验的开发环境,它在保留 HDevelop 算子语义的基础上,强化了流程组织、代码折叠、变量监视和可视化调试能力。对于计量项目,EVO 更适合管理较长的测量流程,例如“采集 → 标定 → 定位 → 测量 → 输出”这样包含多个阶段的程序。两者生成的代码本质一致,均可导出为 C++、C# 或 Python 调用,区别主要在于交互效率与工程组织方式。

建议:算法探索阶段用 HDevelop 快速验证算子参数;项目集成阶段用 HDevelopEVO 组织流程并导出代码,避免在两种环境间反复复制粘贴。

二、算子库的组织逻辑

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 表示使用全部轮廓点。实际项目中,应先用标准件验证像素当量和拟合稳定性,再投入批量测量。

HALCON 计量程序骨架与数据流 ① 图像采集 open_framegrabber read_image / grab_image ② 预处理 rgb1_to_gray emphasize / median_image ③ 标定映射 find_calib_object calibrate_cameras ④ ROI 定位 gen_circle / reduce_domain threshold / connection ⑤ 亚像素测量 edges_sub_pix fit_line / fit_circle_contour_xld ⑥ 结果换算与判定 DiameterMM = 2*R*PixelSize PASS / FAIL 判定 Image GrayImage CamParam ROI 关键参数与观察点 曝光/增益:影响边缘对比度,建议先固定再调算法 像素当量 PixelSize:由标定得到,单位 mm/pixel,决定测量换算精度 Alpha / 拟合权重:控制亚像素边缘灵敏度与抗噪能力,需用标准件验证 采集/预处理 标定/定位 测量/判定

五、从骨架到工程化

上述骨架在 HDevelop 中可直接运行,但投入产线前还需补充三件事:其一,把标定参数 CamParam 和像素当量保存为文件,避免每次重新标定;其二,用 try...catch 包裹采集与拟合环节,处理图像缺失或轮廓点数不足的异常;其三,将测量结果写入 CSV 或通过 TCP 发送给上位机,形成可追溯的数据记录。

对于多工位测量,建议把“采集、标定、测量”拆分为独立过程(procedure),每个过程只暴露必要输入输出。这样在更换相机或调整 ROI 时,只需修改对应过程,不会影响整体流程。HALCON 的 dev_set_check 和 dev_get_window 等调试算子,可以帮助在开发阶段快速定位变量类型错误或窗口句柄失效问题。

注意:亚像素测量结果对光照和镜头畸变非常敏感。若未做畸变校正,边缘拟合出的圆度可能包含系统性偏差。建议在标定阶段同时求解径向畸变系数,并在测量前用 change_radial_distortion_contours_xld 对轮廓做校正。