Camera calibration

相机标定的目的是从对已知标定靶的拍摄图像中恢复相机的内参矩阵 K\mathbf{K} 和镜头畸变参数。如果没有精确的标定,后续每一步几何计算——三角化、位姿估计、极线搜索——都会系统性地出错。

Zhang’s Method

Zhang 的方法(1999)是标准的标定流程。它使用从多个视角拍摄的平面棋盘格图像。每张图像都提供了已知的 3D 棋盘角点与检测到的 2D 图像角点之间的对应关系,从而对单应性(图像到棋盘)和内参都提供了约束。该流程如下:

  1. N3N \geq 3 张不同朝向的图像中检测棋盘格角点。
  2. 计算棋盘平面与每张图像之间的单应性 HiH_i
  3. 利用 H=λK[r1,r2,t]H = \lambda\mathbf{K}[r_1, r_2, \mathbf{t}](其中 r1r2r_1 \perp r_2r1=r2\|r_1\| = \|r_2\|)从每个 HiH_i 中提取关于 K\mathbf{K} 的约束。
  4. 求解一个关于内参的线性系统。
  5. 通过非线性最小二乘对所有参数(内参、外参、畸变)进行优化。

约束来源。H=[h1,h2,h3]H = [\mathbf{h}_1, \mathbf{h}_2, \mathbf{h}_3]。由于 h1Kr1\mathbf{h}_1 \propto \mathbf{K}r_1h2Kr2\mathbf{h}_2 \propto \mathbf{K}r_2,且 r1,r2r_1, r_2 正交归一,每个视角都会为对称矩阵 B=KTK1B = \mathbf{K}^{-T}\mathbf{K}^{-1} 的元素提供两个线性方程:

h1TBh2=0,h1TBh1=h2TBh2\mathbf{h}_1^T B\, \mathbf{h}_2 = 0, \qquad \mathbf{h}_1^T B\, \mathbf{h}_1 = \mathbf{h}_2^T B\, \mathbf{h}_2

BB 有 6 个未知量(若假设倾斜量为零则为 5 个),因此 3 个视角就足够了;随后通过类似 Cholesky 分解的方法从 BB 中恢复 K\mathbf{K}。这就是为什么棋盘格必须以不同朝向展示——平行视角只会带来冗余约束。

Lens Distortion Models

真实镜头会偏离理想的针孔模型。有两种标准模型:

径向畸变会使直线看起来是弯曲的:

xd=x(1+k1r2+k2r4+k3r6),yd=y(1+k1r2+k2r4+k3r6)x_d = x'(1 + k_1 r^2 + k_2 r^4 + k_3 r^6), \qquad y_d = y'(1 + k_1 r^2 + k_2 r^4 + k_3 r^6)

其中 r2=x2+y2r^2 = x'^2 + y'^2 是到主点的距离的平方。k1>0k_1 > 0 产生桶形畸变;k1<0k_1 < 0 产生枕形畸变。广角镜头的 k1|k_1| 较大。

切向畸变是由镜头与图像平面不完全平行造成的:

xd=x+2p1xy+p2(r2+2x2),yd=y+p1(r2+2y2)+2p2xyx_d = x' + 2p_1 x'y' + p_2(r^2 + 2x'^2), \qquad y_d = y' + p_1(r^2 + 2y'^2) + 2p_2 x'y'

在实践中,k1,k2k_1, k_2(有时还有 k3,p1,p2k_3, p_1, p_2)与 K\mathbf{K} 一起联合估计。OpenCV 在 cv::calibrateCamera() 中直接实现了这一点。

评判标定质量

标定返回的标准质量指标是均方根重投影误差:用估计出的参数把棋盘角点重投影回去,测量像素残差。除了这个单一数值之外,还应检查:

常见陷阱

对SLAM的意义

SLAM 系统假设送入几何求解器的观测已经去畸变并完成标定;图像边缘处即使只有几个像素的未校正畸变,也可能主导重投影误差并破坏地图。标定同时也是理解更难问题的模板——相机-IMU 和相机-LiDAR 外参标定都遵循同样的”已知标靶+非线性优化”模式。从实践角度看,用棋盘格标定自己的相机是入门这一领域最好的练习之一。

相关条目