标定流程概览:从标定板到结果验证的完整链路
说实话,很多新手拿到 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 就觉得万事大吉。我劝你别太信。
我一般做三件事验证:
- 看平均误差: 小于 0.3 像素算合格。大于 0.5 像素,重新拍。
- 看最大误差: 如果某张图的误差特别大,删掉那张重新标。
- 做反投影: 用标定结果把图像点投影到世界坐标,再投影回来。看偏差。
核心指标: 标定后的重投影误差(RMS)应该小于 0.3 像素。如果大于 0.5,检查标定板是否弯曲,或者图像是否模糊。
完整链路流程图
下面这张图,把整个流程串起来了。你可以把它贴在工位上。
常见问题速查表
| 现象 | 可能原因 | 我的解决方式 |
|---|---|---|
| find_calib_object 找不到板 | 标定板太小或太模糊 | 增大 SizeGrd 或重新采集 |
| 标定误差 > 0.5 像素 | 某张图质量差 | 删掉误差最大的那张,重新标 |
| 标定后测量不准 | 描述文件与实物不匹配 | 用 gen_caltab 重新生成 |
| 相机参数异常 | 初始值设置不合理 | 参考相机手册设置焦距和像元尺寸 |
一个小技巧: 标定完成后,用
disp_caltab 把标定板投影到图像上。如果投影点和实际点完全重合,说明标定没问题。如果不重合,嗯,重新来吧。
整个流程走下来,你会发现标定其实不复杂。但每一步都有细节。我见过太多人卡在 find_calib_object 这一步,其实就是标定板没选对或者光照没调好。
记住:标定板是尺子,图像是测量值,算子是计算器,验证是质检。四步缺一不可。