4. 双目相机标定
双目视觉系统要输出可用的深度与尺度,前提是左右相机之间的几何关系被准确描述。标定的本质,是求解一组能把“像素坐标”映射到“物理空间坐标”的参数:内参描述单个相机自身的成像特性,外参描述左右相机之间的相对位姿,畸变系数描述镜头非线性误差。三者缺一不可,且必须联合使用。
一、核心原理:三类参数各管什么
内参矩阵 K 包含焦距 fx、fy 与主点 cx、cy,它决定一个三维点投影到图像上的位置。畸变系数通常用径向畸变 k1、k2、k3 与切向畸变 p1、p2 表示,描述真实镜头相对理想针孔模型的偏差。外参由旋转矩阵 R 与平移向量 t 组成,描述右相机坐标系相对左相机坐标系的变换。
张正友标定法的核心思想是:用一块已知棋盘格平面,在多个不同姿态下拍摄图像,利用平面单应性约束求解内参初值,再通过最大似然估计优化全部参数。它不需要高精度三维标定物,只需一张打印的棋盘格,因此成为工业界最通用的标定方法。
二、方法流程:从单目标定到双目联合标定
标准流程分为四步。第一步,制作高精度棋盘格,建议使用氧化铝或玻璃基板,避免纸张受潮变形。第二步,左右相机同步采集多组棋盘格图像,覆盖画面中心、四角、远近、倾斜等姿态。第三步,分别对左右相机做单目标定,得到各自内参与畸变系数。第四步,固定内参,利用左右图像中同一棋盘格的对应角点,求解外参 R、t,并做联合光束法平差。
OpenCV 提供了完整接口,典型命令如下:
# 单目标定
ret, K, dist, rvecs, tvecs = cv2.calibrateCamera(
object_points, image_points, image_size, None, None)
# 双目标定
ret, K1, d1, K2, d2, R, T, E, F = cv2.stereoCalibrate(
object_points, img_points1, img_points2,
K1, d1, K2, d2, image_size,
flags=cv2.CALIB_FIX_INTRINSIC)
# 立体校正
R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify(
K1, d1, K2, d2, image_size, R, T, alpha=0)
三、案例场景:工业双目模组标定实战
假设一套 1/2.3 英寸双目模组,基线 60 mm,镜头焦距 4 mm,分辨率 1280×720。采集 20 组棋盘格图像后,单目标定得到左相机 fx=620.3、fy=620.8、cx=642.1、cy=358.7,右相机 fx=619.8、fy=620.2、cx=638.5、cy=360.2。双目标定输出平移向量 T≈[-60.12, 0.08, 0.35] mm,旋转矩阵接近单位阵,说明机械装配良好。
此时重投影误差 RMS 为 0.21 pixel,满足要求。若 RMS 大于 0.5 pixel,应检查角点检测是否准确、标定板是否平整、左右图像是否同步。完成标定后,用 stereoRectify 做极线校正,再通过 SGBM 计算视差图,即可得到深度。
| 参数类别 | 符号 | 典型量级 | 作用 |
|---|---|---|---|
| 内参焦距 | fx, fy | 600~1500 pixel | 像素与物理尺寸换算 |
| 主点 | cx, cy | 约图像中心 | 光轴与像面交点 |
| 径向畸变 | k1, k2, k3 | -0.3~0.3 | 桶形/枕形校正 |
| 切向畸变 | p1, p2 | 1e-4 量级 | 镜头与传感器不平行 |
| 外参旋转 | R | 接近单位阵 | 左右相机姿态差 |
| 外参平移 | t | 基线长度 | 决定深度尺度 |
四、误区与复盘
- 误区一:只标一次就长期使用。 温度变化 10℃ 可能让基线漂移 0.05 mm,深度误差随之放大。建议每季度或每次大修后复标。
- 误区二:标定板姿态单一。 所有图像都正对相机,会导致内参病态。应覆盖 ±30° 倾斜与画面边缘。
- 误区三:忽略同步误差。 动态场景下左右曝光不同步,角点对应关系错位,外参会解算错误。需硬件触发或时间戳对齐。
- 误区四:用低分辨率图像标定。 角点亚像素精度下降,建议使用原始分辨率,避免缩放。
掌握内参、外参与畸变系数的联合标定,是双目 SLAM 尺度恢复的第一道工程门槛。只有把这一步做扎实,后续的极线搜索、视差计算与深度恢复才有可靠基础。