相机外参标定原理:旋转矩阵R、平移向量t、外参矩阵的几何意义

大家好,我是老张。在传感器标定这个行当里摸爬滚打了十几年,今天跟大伙聊聊相机外参标定。说白了,外参就是回答一个问题:相机在三维空间里到底搁哪儿、朝哪儿看?

我刚开始做标定时,总觉得内参才是核心,外参不就是个位置嘛。直到有一次在自动驾驶项目里,相机装歪了0.5度,结果30米外的障碍物位置偏差了半米多……嗯,从那以后我再也不敢小看外参了。

核心一句话:外参矩阵描述了从世界坐标系到相机坐标系的刚体变换。它由旋转矩阵R和平移向量t组成。

1. 旋转矩阵R:相机到底朝哪看?

旋转矩阵R,是一个3×3的正交矩阵。你想想看,相机在空间里可以绕X轴、Y轴、Z轴分别旋转,这三个旋转组合起来,就是R。

我个人习惯把R拆成三个轴的旋转来理解:

  • 绕Z轴旋转(偏航角Yaw):相机左右摇头
  • 绕Y轴旋转(俯仰角Pitch):相机上下点头
  • 绕X轴旋转(滚转角Roll):相机歪脖子

数学上,R矩阵满足两个性质:R^T * R = I(正交性),det(R) = 1(右手系)。我在项目中遇到过有人直接手动填R矩阵,结果不满足正交性,标定出来的结果一塌糊涂。

避坑指南:我曾经用欧拉角表示旋转,结果遇到了万向锁问题。后来我改用四元数或者旋转向量,稳定多了。如果你用欧拉角,记得注意旋转顺序——不同的顺序,结果完全不同。

2. 平移向量t:相机到底搁哪儿?

平移向量t是一个3×1的向量,表示相机光心在世界坐标系中的位置。说白了,就是相机在世界里的坐标。

举个例子:如果t = [1, 2, 3]^T,意思是相机光心在世界坐标系的(1, 2, 3)这个点。

这里有个容易搞混的地方:t表示的是世界原点在相机坐标系下的坐标,而不是相机在世界坐标系下的坐标。这两个概念互为相反数关系。我刚开始学的时候也绕晕过,后来记住一句话:P_cam = R * P_world + t,t就是世界原点在相机系下的位置。

符号 含义 维度
R 旋转矩阵,描述世界系到相机系的旋转 3×3
t 平移向量,世界原点在相机系下的坐标 3×1
[R|t] 外参矩阵,3×4的刚体变换矩阵 3×4

3. 外参矩阵的几何意义

外参矩阵通常写作[R|t],是一个3×4的矩阵。它的几何意义非常直观:把世界坐标系里的一个点,变换到相机坐标系里。

数学表达式:

P_cam = R * P_world + t

用齐次坐标表示:
|X_cam|   |r11 r12 r13 t1| |X_world|
|Y_cam| = |r21 r22 r23 t2| |Y_world|
|Z_cam|   |r31 r32 r33 t3| |Z_world|
|  1  |   |  0   0   0   1| |  1    |

为什么用齐次坐标?说白了就是为了把旋转和平移统一成一个矩阵乘法,方便计算。我在做多相机联合标定时,这个4×4的齐次变换矩阵帮了大忙。

注意:外参矩阵是刚体变换,它不会改变物体的形状和大小,只会改变物体的位置和朝向。如果你发现标定后物体变形了,那一定是R矩阵出了问题——不满足正交性。

4. 知识体系结构图

下面这张图,是我自己总结的外参标定知识体系。你看一眼就能明白各个概念之间的关系:

相机外参标定知识体系 世界坐标系 真实世界的三维坐标 R, t 外参矩阵 [R|t] 刚体变换(旋转+平移) 相机坐标系 以相机光心为原点 旋转矩阵 R 3×3 正交矩阵 描述朝向(Yaw/Pitch/Roll) 平移向量 t 3×1 向量 描述位置(X/Y/Z偏移) 齐次变换 4×4 矩阵 统一旋转+平移 核心公式:P_cam = R * P_world + t 外参标定的目标:求解最优的R和t,使得重投影误差最小

5. 实际标定中的注意事项

讲完了理论,说说实际干活时要注意的点。我踩过的坑,你们就别再踩了:

  1. R矩阵的初始化很重要。我见过有人直接用单位矩阵初始化,结果优化半天收敛不到正确值。建议先用PnP方法算个初值。
  2. t向量的尺度问题。单目相机标定出来的t是带尺度模糊的,只有双目或者有已知尺寸的标定物才能得到真实尺度。
  3. 外参和内参的耦合。有时候外参标不准,其实是内参没标好。我一般先标内参,固定住,再标外参。
  4. 标定板要覆盖整个视场。只拍中间区域,边缘的外参可能不准。我习惯让标定板出现在画面的四个角和中心。

个人经验:在实际项目中,我通常会用至少20张不同位姿的标定板图像来做外参标定。太少的话,R和t的方差会很大。另外,标定板的姿态变化要足够大——平移和旋转都要有,否则会退化。

好了,关于相机外参标定的旋转矩阵、平移向量和外参矩阵的几何意义,今天就聊到这儿。这些东西看着简单,但真正用好了,能解决很多实际问题。下次你们遇到标定不准的情况,不妨回头看看R和t是不是出了问题。


公众号:蓝海资料掘金营,微信deep3321