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 可视化理解

为了让你更直观地理解外参矩阵的作用,我画了一张图:

X_w Y_w Z_w O_w P_w (x, y, z) R, t X_c Y_c Z_c O_c P_c = R * P_w + t 外参矩阵:世界坐标系 → 相机坐标系 图例: X轴 Y轴 Z轴

从图上你能看到:世界坐标系中的点P_w,经过旋转R和平移t,变成了相机坐标系中的点P_c。这个变换就是外参矩阵干的活。

4.8 实际应用中的注意事项

  1. 尺度问题:外参矩阵中的平移向量t是有单位的(通常是米或毫米)。如果你用的数据集单位不统一,记得先做单位转换。
  2. 旋转顺序:如果你用欧拉角表示旋转,要注意旋转顺序(XYZ、ZYX等)。不同的顺序得到的结果完全不同。
  3. 数值稳定性:长时间运行的SLAM系统,外参矩阵可能会漂移。我建议定期做回环检测,修正累积误差。

一句话总结:外参矩阵就是相机的「身份证」,告诉你怎么把世界坐标变成相机坐标。搞懂了它,目标跟踪里的坐标变换就通了八成。

好了,这一章就到这里。记住,多动手写代码,多画图理解,比死记公式强一百倍。

可可精品资料库