一句话定义
相机标定通过拍摄已知几何图案(通常是棋盘格)的多个姿态,联合求解内参 K、外参 [R|t] 与畸变系数,使三维点经投影后的重投影误差最小。
为什么重要
畸变让直线变弯、让测量失真:AR 叠加要「贴得准」、立体视觉要「行对齐」、SLAM 要「投影一致」,前提都是一套可靠的 K 与畸变参数;标定是所有度量级视觉任务的第一道工序,也是判断一套视觉系统是否「做得认真」的试金石。
直观类比
给相机做一次「验光」:拿一张已知方格的视力表(棋盘格)摆出十几个姿势,让相机记录「它以为的方格位置」,再调整处方(K 与畸变系数),直到它说的位置与真实位置平均偏差最小——处方好不好,用重投影误差这个「视力值」来量化。
前置知识
kp-010(投影方程与 K)。
核心概念
- 畸变(Distortion):镜头非理想造成的非线性像差,分径向(桶形/枕形)与切向(装配偏斜)。
- 张正友标定法:从 ≥2 张(工程上 10–20 张)平面棋盘图像线性求解初值,再非线性联合优化。
- 重投影误差(Reprojection Error):3D 点经当前参数投影到像素的坐标与观测角点坐标的平均距离。
- 去畸变(Undistort):把有畸变图像重映射为针孔假设下的理想图像。
- 鱼眼模型:超广角时径向项需用等距/等立体角等模型替代普通多项式。
原理与机制
每个棋盘角点的世界坐标由「格点 + 平面假设」精确已知,图像中用角点检测(亚像素)得到观测坐标;于是每张图提供一组「3D 点 ↔ 2D 点」对应,标定就是解一个大的非线性最小二乘:未知量含 5 个内参(fx, fy, cx, cy, γ)、每张图 6 个外参、以及 4–8 个畸变系数。张正友方法先用线性解(忽略畸变)得到闭式初值,再整体非线性优化(Levenberg–Marquardt),避免直接优化陷入局部极小。畸变建模以归一化坐标 r² = x² + y² 为自变量,低阶多项式即可覆盖普通镜头;重投影误差好于 0.5 像素、畸变参数量级合理即视为标定可信。
公式与模型
x_d = x(1 + k1·r² + k2·r⁴ + k3·r⁶) + 2p1·x·y + p2·(r² + 2x²)
y_d = y(1 + k1·r² + k2·r⁴ + k3·r⁶) + p1·(r² + 2y²) + 2p2·x·y
其中 r² = x² + y²,(x, y) 为归一化坐标,(xd, yd) 为畸变后坐标
RMS = √( Σ ‖ 观测角点 − 投影角点 ‖² / N )图示
实例与案例
打印机打印 A4 棋盘贴硬板(必须平整),从不同角度、覆盖画面各区域拍 15–20 张,OpenCV 一条管线出 K、畸变向量与每图外参。双目系统的双相机需分别标定再立体标定(求相对位姿),行对齐质量直接决定 kp-013 视差计算的搜索效率。工业尺寸测量要求标定板高精度(玻璃基板),并把温度漂移纳入复标周期。
import cv2, glob
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
und = cv2.undistort(img, mtx, dist, None, mtx)
rms = ret # 重投影均方根误差(像素)常见误区
- 棋盘姿态单一:全部正对拍摄无法约束焦距与主点,姿态应含明显倾斜且覆盖四角。
- 标定板不平整:纸的翘曲直接污染「已知 3D 坐标」,误差被算进 K。
- 只看误差不看残差分布:整体 RMS 达标但某几张图残差异常大,说明个别姿态角点检测失败,应剔除重标。
- 畸变系数越多越好:无高阶畸变的镜头硬加 k3 会与 k1 强相关,参数震荡;按镜头类型选模型。
与其他知识点的关系
标定出的 K 参与 kp-012 的 E→F 换算;去畸变是 kp-013 立体匹配的前置工序;SLAM(kp-014)的投影残差依赖全程固定一致的 K 与畸变参数。
自测题
- 为什么标定需要多个姿态的棋盘图像?
答案要点:单视角下内参与外参耦合(尺度/角度简并),多视角提供独立约束,才能把内参分离出来。
- 重投影误差 2 像素的标定能用吗?
答案要点:视用途而定;AR/测量级场景偏大,通常应排查角点检测或标定板平整度,压到 0.5 像素以内。
- 径向与切向畸变分别来自什么?
答案要点:径向来自镜头曲面形状(桶形/枕形),切向来自镜头组与传感器平面不平行(装配偏斜)。
延伸阅读
- Zhang 2000《A Flexible New Technique for Camera Calibration》
- kp-010 回顾 K 的几何含义