坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系及其转换关系

做外参标定,说白了就是搞清楚相机在空间中的位置和朝向。但在这之前,你得先弄明白四个坐标系——它们就像四把尺子,量出来的东西不一样,但彼此之间可以换算。

我刚开始接触视觉SLAM时,就被这四个坐标系绕晕过。后来踩了几个坑,才真正理解它们之间的关系。今天咱们就把这事彻底讲清楚。

1. 世界坐标系:我们生活的三维空间

世界坐标系,就是你在现实世界中定义的一个固定参考系。比如你站在房间中央,以墙角为原点,X轴指向东,Y轴指向北,Z轴指向天——这就是一个世界坐标系。

它的作用很简单:描述物体在真实空间中的位置。一个路标点、一辆车、一个行人,它们在世界坐标系下的坐标是唯一的、不变的(除非物体移动)。

世界坐标系通常用 (X_w, Y_w, Z_w) 表示,单位是米(或毫米、厘米,取决于你的应用)。

我的习惯:做外参标定时,我通常把标定板所在平面定义为 Z_w = 0。这样能简化很多计算,尤其是用棋盘格标定时。

3. 相机坐标系:以相机为中心看世界

相机坐标系的原点在相机的光心(也就是镜头中心),Z轴指向相机的前方(沿着光轴方向),X轴向右,Y轴向下(符合图像的行列方向)。

你想想看,相机看到的物体,其实都是在相机坐标系下的坐标。世界坐标系下的一个点,经过旋转和平移,就变成了相机坐标系下的点。

这个转换关系就是外参的核心:

| X_c |     | R11  R12  R13  tx |   | X_w |
| Y_c |  =  | R21  R22  R23  ty | * | Y_w |
| Z_c |     | R31  R32  R33  tz |   | Z_w |
|  1  |     |  0    0    0    1  |   |  1  |

其中 R 是旋转矩阵,t 是平移向量。这6个参数(3个旋转角 + 3个平移量)就是我们要标定的外参。

我曾经踩过的坑:旋转矩阵必须是正交矩阵,行列式为+1。如果你用数值优化算出来的R不满足这个条件,那一定是算法写错了。我有一回调试了三天,最后发现是旋转向量转矩阵时用了错误的公式。

3. 图像坐标系:从三维到二维的投影

相机坐标系下的三维点,通过针孔相机模型投影到成像平面上,就变成了图像坐标系下的二维点。

图像坐标系的原点在光轴与成像平面的交点(也就是主点),通常用 (x, y) 表示,单位是毫米。

投影公式很简单:

x = f * X_c / Z_c
y = f * Y_c / Z_c

其中 f 是焦距。这个公式就是传说中的「小孔成像」模型。

嗯,这里要注意:实际相机的主点不一定在图像正中心,因为镜头安装有偏差。这就是内参中 cx、cy 的由来。

4. 像素坐标系:计算机看到的数字世界

图像坐标系是连续的、以毫米为单位的。但计算机只能处理离散的像素。所以我们需要把图像坐标系离散化,变成像素坐标系。

像素坐标系的原点在图像的左上角,u轴向右,v轴向下。单位是像素(pixel)。

转换关系:

u = x / dx + cx
v = y / dy + cy

其中 dx、dy 是每个像素在x、y方向上的物理尺寸(毫米/像素),cx、cy 是主点的像素坐标。

把上面两步合并,就得到了从相机坐标系到像素坐标系的完整投影公式:

u = fx * X_c / Z_c + cx
v = fy * Y_c / Z_c + cy

其中 fx = f / dx,fy = f / dy,这就是内参矩阵中的焦距参数。

5. 四个坐标系的完整转换链路

现在我们把它们串起来:

  1. 世界坐标系 → 相机坐标系:通过外参(R, t)
  2. 相机坐标系 → 图像坐标系:通过针孔投影(除以Z)
  3. 图像坐标系 → 像素坐标系:通过内参(fx, fy, cx, cy)

用矩阵形式表示,一步到位:

Z_c * | u |   =   | fx  0   cx  0 |   | R11 R12 R13 tx |   | X_w |
      | v |       | 0   fy  cy  0 | * | R21 R22 R23 ty | * | Y_w |
      | 1 |       | 0   0   1   0 |   | R31 R32 R33 tz |   | Z_w |
                                        | 0   0   0   1  |   |  1  |

这个公式,就是整个视觉几何的基石。你做的所有标定、三维重建、SLAM,本质上都是在解这个公式中的未知参数。

核心要点:
  • 外参描述的是「世界坐标系」到「相机坐标系」的刚体变换
  • 内参描述的是「相机坐标系」到「像素坐标系」的投影变换
  • 标定的本质:已知若干组3D-2D对应点,求解内外参

6. 一张图看懂四个坐标系的关系

下面这张SVG图,把四个坐标系和它们之间的转换关系画得清清楚楚。我建议你把它保存下来,每次做标定前看一眼。

四个坐标系及其转换关系 世界坐标系 (X_w, Y_w, Z_w) 真实世界的绝对坐标 相机坐标系 (X_c, Y_c, Z_c) 以相机光心为原点 图像坐标系 (x, y) 连续坐标,单位毫米 像素坐标系 (u, v) 离散坐标,单位像素 外参 (R, t) 针孔投影 (除以Z) 内参 (fx, fy, cx, cy) 完整链路:世界坐标 → 相机坐标 → 图像坐标 → 像素坐标 外参标定就是求解第一步中的 R 和 t

7. 实战中的注意事项

搞清楚了理论,咱们聊聊实际中容易出问题的地方:

  • 坐标系方向要统一:OpenCV、ROS、Pytorch3D用的坐标系方向都不一样。我习惯用OpenCV的约定(Z向前,Y向下),但如果你在ROS里做,记得检查一下。
  • 单位要一致:世界坐标用米,焦距用毫米,像素尺寸用微米——混在一起算出来的结果全是错的。我建议全部统一成米。
  • 主点不是图像中心:很多初学者以为cx、cy就是图像宽高的一半。实际上由于镜头安装误差,主点通常会偏移几个像素。标定时一定要把它作为未知数来优化。
  • 畸变模型别忘了:针孔模型是理想情况。实际相机有径向畸变和切向畸变,标定时需要同时估计畸变参数。否则投影误差会很大。
我的一个小技巧:在写代码时,我会把四个坐标系分别用不同的颜色打印出来调试。世界坐标用红色,相机坐标用绿色,图像坐标用蓝色,像素坐标用黄色。这样一眼就能看出数据流到哪里了。

好了,坐标系基础就讲到这里。这四个坐标系就像四把尺子,搞清楚了它们之间的换算关系,外参标定就成功了一半。下一节咱们会深入讨论旋转矩阵的表示方法——四元数、欧拉角、旋转向量,它们各有优劣,实际项目中怎么选?到时候我会分享我的经验。

可可精品资料库