2. 误差来源分析:镜头畸变、特征点检测噪声、标定板平面度
做标定这么多年,我最大的感受就是:重投影误差不是算出来的,是“攒”出来的。你想想看,一个像素的偏差,背后可能是镜头畸变没建模好,也可能是角点检测偏了半个像素,甚至可能是标定板本身就不平。这一章,咱们就把这三个“罪魁祸首”一个一个拎出来分析。
2.1 镜头畸变:最“诚实”的误差源
镜头畸变是物理世界的硬伤。说白了,就是光线穿过透镜时,不走直线了。我刚开始做标定时,总觉得畸变模型越复杂越好,后来发现——模型选不对,误差反而更大。
2.1.1 径向畸变 vs 切向畸变
| 畸变类型 | 产生原因 | 数学模型 | 典型表现 |
|---|---|---|---|
| 径向畸变 | 透镜曲面制造误差 | k₁, k₂, k₃ 多项式 | 图像边缘“桶形”或“枕形” |
| 切向畸变 | 透镜与传感器不平行 | p₁, p₂ 参数 | 图像“梯形”拉伸 |
我个人习惯,先只标 k₁ 和 k₂。为什么?因为 k₃ 对边缘像素影响很大,但如果你标定板没拍满整个视场,k₃ 就是瞎猜。我在一个车载项目里吃过这个亏——用了 5 参数畸变模型,结果远角点误差反而比 3 参数还大。
2.1.2 畸变对重投影误差的影响曲线
畸变误差在图像中心几乎为零,越往边缘越大。我习惯用下面这张图来理解:
2.2 特征点检测噪声:看不见的“抖动”
特征点检测,说白了就是找棋盘格角点或者圆点中心。但像素是离散的,亚像素精度再高,也有极限。我见过很多新手,把 OpenCV 的 findChessboardCorners 当成“真理”,其实它返回的坐标本身就有噪声。
2.2.1 噪声来源
- 量化误差: 模拟信号转数字时,像素值被四舍五入。这是物理极限,躲不掉。
- 光照不均匀: 标定板一半亮一半暗,角点检测会偏移。我在户外标定时吃过这个亏。
- 图像模糊: 对焦不准或运动模糊,角点梯度变弱,亚像素定位精度下降。
- 算法偏差: 不同检测算法(Harris、Shi-Tomasi、OpenCV 自带)对同一角点的定位可能差 0.1~0.3 像素。
2.2.2 噪声对重投影误差的影响
特征点噪声是随机误差,不像畸变那样有规律。它的影响可以用一个简单公式理解:
重投影误差 ≈ 特征点检测噪声 × 相机位姿敏感度
什么意思?就是如果你的相机离标定板很远,或者角度很刁钻,同样的 0.1 像素检测噪声,会被放大成 0.5 像素的重投影误差。我习惯用多帧平均来降低这个影响。
2.3 标定板平面度:最容易被忽视的“隐形杀手”
嗯,这里要注意。标定板不平,是所有误差里最隐蔽、最难排查的。你想想看,如果标定板本身有 0.1mm 的弯曲,在 100mm 的视场里,它造成的角度误差可能只有 0.05°,但反映在重投影误差上,可能就是 0.3 像素。
2.3.1 平面度误差的数学模型
假设标定板实际是一个曲面,我们用平面模型去拟合它。那么每个角点都会有一个Z 方向偏差 ΔZ。这个偏差通过投影矩阵映射到图像上:
Δu = f_x * ΔZ / Z² * (u - u₀)
Δv = f_y * ΔZ / Z² * (v - v₀)
其中 f_x, f_y 是焦距,Z 是相机到标定板的距离。你看,焦距越大、距离越近,平面度误差的影响越大。
2.3.2 不同标定板的平面度对比
| 标定板类型 | 典型平面度 | 适用场景 | 我的建议 |
|---|---|---|---|
| 陶瓷棋盘格 | ±0.01mm | 高精度实验室 | 首选,但贵 |
| 玻璃棋盘格 | ±0.03mm | 中等精度 | 性价比高 |
| 亚克力/塑料板 | ±0.1~0.3mm | 快速验证 | 慎用,容易变形 |
| 打印纸贴玻璃 | 取决于玻璃 | 临时方案 | 纸会皱,不推荐 |
2.4 三种误差的叠加效应
这三种误差不是独立工作的。它们会叠加、放大、甚至互相掩盖。我画了一张图来展示它们的关系:
你看,这三个误差源最终都汇聚到重投影误差上。但最麻烦的是——它们会互相掩盖。比如,畸变误差和平面度误差方向相反时,重投影误差反而变小了。你以为标定结果很好,其实两个误差都没消除。
2.5 本章小结
- 镜头畸变: 系统误差,边缘大中心小。模型别贪多,3 参数起步。
- 特征点噪声: 随机误差,多帧平均是王道。光照和焦距要控制好。
- 标定板平面度: 隐蔽误差,选板子要舍得花钱。温度变化要留意。
- 叠加效应: 三种误差会互相掩盖,别只看重投影误差的数值,要看分布。