标定流程概览:从标定板到结果验证的完整链路

说实话,很多新手拿到 HALCON 第一件事就是找 find_calib_object 这个算子。然后对着参数列表发呆。我当年也这样。

标定这件事,说白了就是给相机“量尺寸”。你得知道它拍出来的图像里,一个像素到底对应真实世界多少毫米。这中间有一整套流程,少一步都不行。

这一章,我把整个链路拆成四个阶段。你跟着走一遍,心里就有谱了。

1. 标定板选择:别拿错尺子

标定板就是你的“物理参考尺”。选错了,后面全白干。

标定板类型 适用场景 我踩过的坑
圆点阵列板 高精度测量、远心镜头 圆点边缘检测比棋盘格更稳定
棋盘格 普通面阵相机、广角镜头 角点提取快,但光照不均时容易偏
非对称圆点板 大畸变镜头、鱼眼 HALCON 官方推荐,鲁棒性最好
我的习惯: 项目里我首选 caltab_30mm.descr 这个描述文件。30mm 的圆点间距,覆盖大多数工业场景。如果你做的是手机镜头那种小视野,换成 10mm 的。

选板子时注意三点:

  • 尺寸: 标定板要占图像面积的 1/4 到 1/3。太小了,标定精度不够。
  • 材质: 陶瓷基板比纸基板耐用。我在产线上见过纸板被油污泡烂的……
  • 描述文件: 必须有对应的 .descr 文件。没有?自己用 gen_caltab 生成一个。

2. 图像采集:拍 15 张就够了?不一定

很多人以为随便拍几张就行。我见过一个项目,拍了 3 张就开始标定,结果误差 0.5 个像素。后来补到 20 张,误差降到 0.05。

采集原则:

  • 数量: 12-20 张。少于 10 张,解算不稳定。
  • 姿态: 标定板要倾斜、旋转、平移。别只放在正中间。
  • 覆盖: 让标定板出现在图像的四个角和中心。
  • 光照: 保持均匀。别让标定板上有反光点。
我曾经: 在一个项目中,标定板边缘有反光,结果 find_calib_object 死活找不到圆点。后来用偏振片解决了。嗯,这里要注意,金属标定板特别容易反光。

3. 算子调用:核心三步走

HALCON 的标定算子其实不多。核心就三个:

* 第一步:创建标定模型
create_calib_data ('calibration_object', 'camera', 1, 1, CalibHandle)

* 第二步:设置相机参数初始值
set_calib_data_cam_param (CalibHandle, 0, 'area_scan_division', [0, 0, 0.01, 0.01, 10, 10, 640, 480])

* 第三步:逐张图像找标定板并收集点
for i := 1 to 15 by 1
    read_image (Image, 'calib_' + i$'02d')
    find_calib_object (Image, CalibHandle, 0, 0, i-1, [], [])
endfor

* 第四步:执行标定
calibrate_cameras (CalibHandle, Errors)

* 第五步:获取结果
get_calib_data (CalibHandle, 'camera', 0, 'params', CameraParam)

你想想看,这五步就是标准流程。但实际项目中,find_calib_object 经常失败。为什么?

  • 标定板太模糊?调大 SizeGrd 参数。
  • 背景太复杂?用 set_calib_data 设置 ROI。
  • 圆点被遮挡?检查标定板是否完整出现在图像里。

4. 结果验证:别信那个误差值

标定完成后,HALCON 会返回一个 Errors 数组。很多人看到误差 0.1 就觉得万事大吉。我劝你别太信。

我一般做三件事验证:

  1. 看平均误差: 小于 0.3 像素算合格。大于 0.5 像素,重新拍。
  2. 看最大误差: 如果某张图的误差特别大,删掉那张重新标。
  3. 做反投影: 用标定结果把图像点投影到世界坐标,再投影回来。看偏差。
核心指标: 标定后的重投影误差(RMS)应该小于 0.3 像素。如果大于 0.5,检查标定板是否弯曲,或者图像是否模糊。

完整链路流程图

下面这张图,把整个流程串起来了。你可以把它贴在工位上。

HALCON 标定完整链路 标定板选择 尺寸 / 类型 / 描述文件 图像采集 12-20 张 / 多姿态 算子调用 创建 / 找点 / 标定 结果验证 重投影误差 / 反投影 不合格则重新采集 关键提醒 1. 标定板描述文件(.descr)必须与实物完全一致 2. 采集时标定板倾斜角度建议在 15°-45° 之间 3. 标定后务必用 get_calib_data 导出内参 4. 重投影误差 RMS < 0.3 像素才算合格

常见问题速查表

现象 可能原因 我的解决方式
find_calib_object 找不到板 标定板太小或太模糊 增大 SizeGrd 或重新采集
标定误差 > 0.5 像素 某张图质量差 删掉误差最大的那张,重新标
标定后测量不准 描述文件与实物不匹配 用 gen_caltab 重新生成
相机参数异常 初始值设置不合理 参考相机手册设置焦距和像元尺寸
一个小技巧: 标定完成后,用 disp_caltab 把标定板投影到图像上。如果投影点和实际点完全重合,说明标定没问题。如果不重合,嗯,重新来吧。

整个流程走下来,你会发现标定其实不复杂。但每一步都有细节。我见过太多人卡在 find_calib_object 这一步,其实就是标定板没选对或者光照没调好。

记住:标定板是尺子,图像是测量值,算子是计算器,验证是质检。四步缺一不可。