1. 坐标系基础:四个坐标系的定义与关系

做3D视觉,说白了就是跟坐标系打交道。我刚开始接触这个领域时,最头疼的就是这几个坐标系来回倒腾。今天咱们就把它们彻底理清楚。

1.1 为什么需要四个坐标系?

你想想看,一个三维空间里的点,要最终显示在屏幕上,中间要经过多少道工序?

相机看到的是三维世界,但照片是二维的。像素位置是离散的整数,但物理世界是连续的。每个环节都有自己的“语言”,坐标系就是翻译官。

核心思路: 世界坐标系 → 相机坐标系 → 图像坐标系 → 像素坐标系,这是一条单向流水线。

1.2 世界坐标系 (World Coordinate System)

世界坐标系是参考系。它固定在地面上,用来描述物体和相机在真实世界中的位置。

  • 符号: 通常用 (Xw, Yw, Zw) 表示
  • 特点: 原点可以任意选取,但一旦选定就固定不变
  • 单位: 米、毫米等真实物理单位
  • 用途: 描述物体在场景中的位置
我的习惯: 做SLAM时,通常把第一帧相机的位置设为世界坐标系原点。这样后续所有位姿都相对第一帧计算,直观又好调试。

1.3 相机坐标系 (Camera Coordinate System)

相机坐标系是以相机光心为原点的坐标系。它跟着相机一起运动。

  • 符号: 通常用 (Xc, Yc, Zc) 表示
  • 原点: 相机光心(镜头中心)
  • Z轴: 指向相机正前方(光轴方向)
  • X轴: 指向相机右侧
  • Y轴: 指向相机下方(注意!这里是右手系,但Y轴朝下)
我曾经踩过的坑: 相机坐标系的Y轴方向跟图像坐标系是反的。图像坐标系Y轴朝下,而世界坐标系Y轴通常朝上。做外参标定时,旋转矩阵的方向很容易搞反,导致投影结果完全不对。

1.4 图像坐标系 (Image Coordinate System)

图像坐标系是二维的,位于成像平面上。它描述的是物理成像位置。

  • 符号: 通常用 (x, y) 表示
  • 原点: 光轴与成像平面的交点(主点)
  • 单位: 毫米等物理单位
  • 特点: 连续坐标,不是整数像素

这里有个关键点:图像坐标系的原点不是图像左上角,而是主点。主点通常靠近图像中心,但因为有装配误差,不一定在正中心。

1.5 像素坐标系 (Pixel Coordinate System)

像素坐标系就是我们最终看到的图像坐标。它是离散的整数网格。

  • 符号: 通常用 (u, v) 表示
  • 原点: 图像左上角
  • 单位: 像素(pixel)
  • u轴: 向右为正
  • v轴: 向下为正
注意: 像素坐标 (u, v) 是整数,而图像坐标 (x, y) 是浮点数。从图像坐标到像素坐标,中间有一个离散化过程。

1.6 四个坐标系的关系图

下面这张图展示了完整的坐标系转换链路。我建议你把它存下来,做项目时随时对照。

四个坐标系转换关系图 坐标系转换链路 世界坐标系 (Xw, Yw, Zw) 外参 相机坐标系 (Xc, Yc, Zc) 内参 图像坐标系 (x, y) 离散化 像素坐标系 (u, v) 缩放+平移 关键说明: • 外参:世界→相机,包含旋转R和平移t,描述相机在世界中的位姿 • 内参:相机→图像,包含焦距fx/fy、主点cx/cy,描述相机内部光学特性 • 离散化:图像→像素,包含缩放因子dx/dy,将物理坐标转为整数像素 • 整个流程是单向的:3D世界 → 2D图像 → 离散像素 • 逆过程(像素→世界)需要深度信息,这就是3D重建的核心

1.7 坐标系转换公式

光看图还不够,咱们得把公式写出来。我习惯用齐次坐标来统一表达,这样矩阵运算更简洁。

步骤1:世界 → 相机

| Xc |   | R11 R12 R13 tx | | Xw |
| Yc | = | R21 R22 R23 ty | | Yw |
| Zc |   | R31 R32 R33 tz | | Zw |
| 1  |   | 0   0   0   1  | | 1  |

这里的R是3×3旋转矩阵,t是3×1平移向量。它们合起来就是相机的外参矩阵。

步骤2:相机 → 图像

x = fx * Xc / Zc + cx
y = fy * Yc / Zc + cy

这是针孔相机模型的核心。注意这里除以Zc,实现了从3D到2D的透视投影。

步骤3:图像 → 像素

u = x / dx + u0
v = y / dy + v0

dx和dy是每个像素的物理尺寸(毫米/像素),u0和v0是主点在像素坐标系中的位置。

我的经验: 实际项目中,我们通常把步骤2和步骤3合并成一个内参矩阵K。这样写代码时一步到位,减少中间变量出错的机会。

1.8 完整投影公式(齐次坐标形式)

| u |   | fx  0  cx 0 | | R11 R12 R13 tx | | Xw |
| v | = | 0  fy cy 0 | | R21 R22 R23 ty | | Yw |
| 1 |   | 0   0  1  0 | | R31 R32 R33 tz | | Zw |
                          | 0   0   0   1  | | 1  |

这个公式就是3D视觉的基石。你把它拆开看:

  • 右边第一个矩阵是内参矩阵K(3×4)
  • 右边第二个矩阵是外参矩阵(4×4)
  • 两者相乘得到投影矩阵P = K[R|t]

1.9 坐标系对比总结

坐标系 维度 原点 单位 是否连续 典型符号
世界 3D 任意选定 米/毫米 连续 (Xw, Yw, Zw)
相机 3D 光心 米/毫米 连续 (Xc, Yc, Zc)
图像 2D 主点 毫米 连续 (x, y)
像素 2D 左上角 像素 离散 (u, v)
避坑提醒: 很多初学者搞混图像坐标系和像素坐标系。记住:图像坐标是物理单位(毫米),原点在主点;像素坐标是整数,原点在左上角。两者之间差了一个缩放和平移。

1.10 实战小贴士

做项目时,我建议你养成几个好习惯:

  1. 统一单位: 世界坐标用毫米,焦距用毫米,像素尺寸用毫米/像素。混用单位是坐标系转换最常见的错误来源。
  2. 检查主点: 标定完相机后,先看看主点坐标是否接近图像中心的一半。如果差太多,说明标定可能有问题。
  3. 验证投影: 写代码时,先拿一个已知3D点投影到2D,看看结果是否合理。我每次都会做这个验证,能省掉后面很多调试时间。
  4. 注意方向: 相机坐标系的Y轴朝下,跟世界坐标系的Y轴朝上正好相反。做旋转矩阵时一定要确认方向。

嗯,坐标系基础就讲到这里。这些概念虽然基础,但后面所有章节都建立在它们之上。你花时间把这里搞透,后面的内容会顺畅很多。