Camera calibration
相机标定的目的是从对已知标定靶的拍摄图像中恢复相机的内参矩阵 和镜头畸变参数。如果没有精确的标定,后续每一步几何计算——三角化、位姿估计、极线搜索——都会系统性地出错。
Zhang’s Method
Zhang 的方法(1999)是标准的标定流程。它使用从多个视角拍摄的平面棋盘格图像。每张图像都提供了已知的 3D 棋盘角点与检测到的 2D 图像角点之间的对应关系,从而对单应性(图像到棋盘)和内参都提供了约束。该流程如下:
- 在 张不同朝向的图像中检测棋盘格角点。
- 计算棋盘平面与每张图像之间的单应性 。
- 利用 (其中 且 )从每个 中提取关于 的约束。
- 求解一个关于内参的线性系统。
- 通过非线性最小二乘对所有参数(内参、外参、畸变)进行优化。
约束来源。 记 。由于 、,且 正交归一,每个视角都会为对称矩阵 的元素提供两个线性方程:
有 6 个未知量(若假设倾斜量为零则为 5 个),因此 3 个视角就足够了;随后通过类似 Cholesky 分解的方法从 中恢复 。这就是为什么棋盘格必须以不同朝向展示——平行视角只会带来冗余约束。
Lens Distortion Models
真实镜头会偏离理想的针孔模型。有两种标准模型:
径向畸变会使直线看起来是弯曲的:
其中 是到主点的距离的平方。 产生桶形畸变; 产生枕形畸变。广角镜头的 较大。
切向畸变是由镜头与图像平面不完全平行造成的:
在实践中,(有时还有 )与 一起联合估计。OpenCV 在 cv::calibrateCamera() 中直接实现了这一点。
评判标定质量
标定返回的标准质量指标是均方根重投影误差:用估计出的参数把棋盘角点重投影回去,测量像素残差。除了这个单一数值之外,还应检查:
- 残差是否在图像上均匀分布——角点处的偏差表明畸变模型不够充分(例如把鱼眼镜头强行用径向-切向模型拟合)。
- 棋盘格是否出现在图像的所有区域中,包括角落和边缘——这些地方的畸变最强,否则将得不到约束。
- 拍摄视角是否包含足够的倾斜(不只是正面拍摄),这样焦距和主点才能解耦。
常见陷阱
- 拍摄过程中的运动模糊和卷帘快门效应会破坏角点检测;每次拍摄时应保持棋盘(或相机)静止。
- 标定板不够平整:贴在纸板上的打印纸会弯曲,畸变估计会把这种弯曲也吸收进去。应使用刚性的平面靶。
- 图像边缘附近的姿态太少——此时高阶径向项会过拟合,并在未覆盖的区域产生剧烈的外推误差。
- 在一个焦距/变焦设置下标定,却在另一个设置下使用:内参会随焦距变化;应锁定镜头,并在硬件设置改变时重新标定。
对SLAM的意义
SLAM 系统假设送入几何求解器的观测已经去畸变并完成标定;图像边缘处即使只有几个像素的未校正畸变,也可能主导重投影误差并破坏地图。标定同时也是理解更难问题的模板——相机-IMU 和相机-LiDAR 外参标定都遵循同样的”已知标靶+非线性优化”模式。从实践角度看,用棋盘格标定自己的相机是入门这一领域最好的练习之一。