相机标定基础:针孔模型与畸变模型,标定板的设计与选择,Halcon标定助手的使用

各位同学,咱们今天聊点硬核的——相机标定。说实话,我入行头两年,觉得标定就是个“走流程”,随便拍几张棋盘格,跑个算子就完事了。直到有一次在汽车零部件项目上,3D测量精度死活差了0.15mm,查了三天,最后发现是标定板选错了材质。嗯,从那以后,我再也不敢小看这个“基础环节”了。

相机标定,说白了就是给相机“配眼镜”。它要回答两个问题:世界坐标系里的点,到底映射到了图像哪个像素?以及这个映射关系里,镜头本身带来了多少扭曲?搞懂了这两点,后面的3D测量和抓取位姿计算才有根基。

核心结论:标定精度直接决定了3D测量误差的下限。标定做不好,后面算法再牛也救不回来。

针孔模型:理想世界的投影

先看理想情况。针孔模型假设光线直线传播,穿过光心,在成像平面上形成倒像。数学上,它就是一个透视投影:

// 齐次坐标下的投影关系
λ * [u, v, 1]^T = K * [R | t] * [X, Y, Z, 1]^T

这里面,K是内参矩阵,包含焦距(fx, fy)和主点(cx, cy);[R|t]是外参矩阵,描述相机在世界坐标系里的位置和朝向。我个人的习惯是,先把内参标定好,外参每次换场景再重新算——这样效率高,而且内参一旦稳定,后续的重复性就好很多。

你想想看,如果相机分辨率是500万像素,镜头焦距12mm,那fx和fy大概在3000-4000像素这个量级。标定出来的内参如果偏差超过0.5个像素,3D测量误差就会放大到毫米级——这在精密装配里是不能接受的。

畸变模型:现实世界的扭曲

理想很丰满,现实很骨感。镜头不是完美的针孔,它会把直线拍成曲线。这就是畸变。主要分两类:

  • 径向畸变:光线在透镜边缘弯曲更厉害,产生“桶形”或“枕形”效果。用k1, k2, k3三个参数描述。
  • 切向畸变:镜头和成像平面不平行,产生“梯形”偏移。用p1, p2两个参数描述。

我在项目中遇到过最夸张的一次,一个广角镜头的k1值到了-0.35,图像边缘的直线弯成了圆弧。如果不做畸变校正,3D重建出来的平面直接就是曲面。所以,畸变模型不是可选项,是必选项。

我的经验:对于工业相机,一般用5参数畸变模型(k1, k2, k3, p1, p2)就够了。k3只在鱼眼镜头或大畸变场景下才需要。别盲目加参数,过拟合反而会降低标定稳定性。

标定板的设计与选择

标定板是标定的“尺子”。尺子不准,量什么都白搭。我见过有人用A4纸打印棋盘格贴在纸板上,结果纸板受潮变形,标定出来的内参一天一个样。所以,标定板的选择有讲究:

类型 材质 精度等级 适用场景 我的建议
陶瓷棋盘格 陶瓷基板+光刻 ±0.01mm 高精度3D测量 首选,热稳定性好
玻璃棋盘格 玻璃+铬层 ±0.02mm 实验室/中等精度 注意防反光
亚克力/胶片 亚克力+印刷 ±0.1mm 快速验证/教学 不推荐用于量产
圆点阵列板 陶瓷/玻璃 ±0.01mm 高精度/大视场 圆点中心提取更稳定

我个人习惯用陶瓷圆点阵列板。为什么?因为圆点的亚像素中心提取比棋盘格角点更鲁棒,尤其是在光照不均匀或镜头畸变大的情况下。棋盘格角点容易受边缘模糊影响,而圆点中心是几何对称的,抗干扰能力强。

避坑指南:我曾经用一块表面有细微划痕的玻璃标定板,结果标定出来的畸变参数在划痕区域出现异常跳变。后来换了陶瓷板,问题立刻消失。标定板表面必须平整、无划痕、无污渍。每次使用前,用无尘布擦拭是基本操作。

Halcon标定助手的使用

Halcon的标定助手(Calibration Assistant)是我用过最顺手的标定工具之一。它把复杂的数学计算封装成了可视化流程,但你不能只点“下一步”——你得理解每一步在干什么。

基本流程是这样的:

  1. 加载标定板描述文件(.descr文件),告诉Halcon标定板的物理尺寸和图案结构。
  2. 采集标定图像:至少15-20张,覆盖视场的不同位置、不同角度、不同距离。
  3. 提取标定点:Halcon自动找到棋盘格角点或圆点中心,并给出亚像素坐标。
  4. 执行标定:Halcon用最小二乘法求解内参、外参和畸变系数。
  5. 验证标定结果:查看重投影误差,一般要求小于0.1像素。

这里有个关键点——标定图像的采集质量。我见过有人随便拍10张就标定,结果重投影误差0.5像素,还问我为什么测量不准。你想想看,如果标定板只放在画面中央,那边缘的畸变参数根本拟合不出来。正确的做法是:

  • 标定板要出现在画面的四个角落和中心
  • 标定板要倾斜15-30度,模拟实际测量中的角度变化
  • 标定板距离要覆盖工作距离的±20%
  • 光照要均匀,避免标定板表面出现高光或阴影

关键指标:标定完成后,务必检查重投影误差(RMS Error)。如果大于0.15像素,说明标定质量不合格。这时候不要盲目增加图像数量,而是检查是否有模糊、过曝或标定板移动的图像,剔除它们再重新标定。

在Halcon里,标定助手的输出可以直接导出为相机参数文件(.cal文件)。后续的3D测量和手眼标定都依赖这个文件。我习惯把标定日期、相机型号、镜头焦距、标定板型号都写在文件名里,比如cam1_12mm_20250315.cal。这样半年后回看,还能知道当时用的什么配置。

下面这张图,是我自己总结的标定知识体系,帮你理清各个概念之间的关系:

相机标定知识体系 相机标定 成像模型 针孔模型 畸变模型 标定板 棋盘格 圆点阵列 Halcon标定助手 图像采集 特征提取 参数求解 误差验证 标定精度 = 模型正确性 × 标定板精度 × 图像质量 × 算法稳定性

最后说一句,标定不是一次性工作。相机镜头松动、温度变化、振动,都会导致内参漂移。我建议每周做一次快速验证标定,用同一块标定板拍一张照片,对比重投影误差。如果误差突然变大,赶紧重新标定。这个习惯,能帮你省掉很多排查问题的时间。