4、相机外参矩阵:从世界坐标系到相机坐标系的旋转与平移
说到相机外参矩阵,我脑子里第一个蹦出来的画面就是——刚入行那年,在实验室里对着一个标定板折腾了一下午,结果发现相机装歪了5度,整个重建出来的三维点云全飘了。嗯,从那以后,我再也不敢小看这个矩阵了。
相机外参矩阵,说白了就是回答一个问题:相机在哪儿?它朝哪儿看?
世界坐标系是我们定义的一个全局参考系。比如你在地上画个十字,那就是X轴和Y轴,垂直向上是Z轴。相机坐标系呢?它以相机光心为原点,Z轴指向镜头前方。要把世界坐标系里的一个点,映射到相机坐标系里,就需要外参矩阵。
4.1 外参矩阵的数学形式
外参矩阵由两部分组成:旋转矩阵R和平移向量t。写成齐次形式就是:
[X_c] [R t] [X_w]
[Y_c] = [ ] [Y_w]
[Z_c] [ ] [Z_w]
[1 ] [0 0 1] [1 ]
其中:
R是 3×3 的旋转矩阵,描述世界坐标系到相机坐标系的旋转关系t是 3×1 的平移向量,描述世界坐标系原点在相机坐标系下的位置- 最后一行 [0 0 0 1] 是为了凑齐次坐标,方便矩阵运算
我个人习惯把外参矩阵记作 [R|t],这样写起来省事,看着也直观。
4.2 旋转矩阵的几何意义
旋转矩阵R的每一列,其实是世界坐标系的三个轴在相机坐标系下的方向向量。你想想看:
- R的第一列:世界坐标系X轴在相机坐标系下的方向
- R的第二列:世界坐标系Y轴在相机坐标系下的方向
- R的第三列:世界坐标系Z轴在相机坐标系下的方向
所以R是一个正交矩阵,满足 R^T R = I,行列式为+1。为什么?因为旋转不会改变向量的长度和夹角,说白了就是刚体变换。
重要性质:旋转矩阵的逆等于它的转置。即 R^{-1} = R^T。这个性质在反向变换时特别有用。
4.3 平移向量的理解
平移向量t表示的是:世界坐标系原点在相机坐标系下的坐标。
举个例子:如果相机在世界坐标系中的位置是 (1, 2, 3),那么t就是 (-1, -2, -3)。为什么是负的?因为我们要把世界坐标系的点变换到相机坐标系,相当于把整个世界移动到相机的位置上。
我在项目中遇到过一个问题:有人直接把相机在世界坐标系的位置当作t,结果算出来的点全反了。记住,t是原点的偏移,不是相机的位置。
4.4 外参矩阵的分解与合成
实际应用中,我们经常需要从外参矩阵里提取R和t。比如在SLAM系统里,每一帧都会估计相机位姿,那就是一个外参矩阵。
提取方法很简单:
R = P[:, :3] # 取前3列
t = P[:, 3] # 取第4列
反过来,合成外参矩阵:
P = np.hstack([R, t.reshape(-1, 1)])
P = np.vstack([P, [0, 0, 0, 1]])
小技巧:如果你用的是OpenCV,可以用 cv2.Rodrigues() 把旋转向量转成旋转矩阵,或者反过来。我个人习惯用旋转向量来优化,因为只有3个自由度,比9个参数的矩阵好处理。
4.5 外参矩阵的逆变换
有时候我们需要从相机坐标系变换回世界坐标系。比如在三维重建中,我们知道了相机坐标系下的点,想求它在世界坐标系中的位置。
逆变换公式:
X_w = R^T * (X_c - t)
或者用齐次形式:
[X_w] [R^T -R^T * t] [X_c]
[Y_w] = [ ] [Y_c]
[Z_w] [ ] [Z_c]
[1 ] [0 0 0 1 ] [1 ]
你看,这里就用到了 R^T = R^{-1} 的性质。我曾经在调试一个视觉里程计系统时,就是因为忘了取转置,结果轨迹全反了,找了半天bug才发现。
4.6 外参矩阵与相机位姿的关系
相机位姿通常用 [R|t] 表示,但要注意:不同的库可能定义不同。
| 库/框架 | 外参定义 | 说明 |
|---|---|---|
| OpenCV | [R|t] | 世界→相机 |
| COLMAP | [R|t] | 世界→相机 |
| PyTorch3D | [R|t] | 相机→世界(注意!) |
避坑指南:我曾经在PyTorch3D和OpenCV之间来回切换,结果发现它们的外参定义是反的。一个是从世界到相机,一个是从相机到世界。如果你不做转换,直接拿来用,结果就是——点全跑到相机后面去了。
4.7 可视化理解
为了让你更直观地理解外参矩阵的作用,我画了一张图:
从图上你能看到:世界坐标系中的点P_w,经过旋转R和平移t,变成了相机坐标系中的点P_c。这个变换就是外参矩阵干的活。
4.8 实际应用中的注意事项
- 尺度问题:外参矩阵中的平移向量t是有单位的(通常是米或毫米)。如果你用的数据集单位不统一,记得先做单位转换。
- 旋转顺序:如果你用欧拉角表示旋转,要注意旋转顺序(XYZ、ZYX等)。不同的顺序得到的结果完全不同。
- 数值稳定性:长时间运行的SLAM系统,外参矩阵可能会漂移。我建议定期做回环检测,修正累积误差。
一句话总结:外参矩阵就是相机的「身份证」,告诉你怎么把世界坐标变成相机坐标。搞懂了它,目标跟踪里的坐标变换就通了八成。
好了,这一章就到这里。记住,多动手写代码,多画图理解,比死记公式强一百倍。