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 四个坐标系的关系图
下面这张图展示了完整的坐标系转换链路。我建议你把它存下来,做项目时随时对照。
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 实战小贴士
做项目时,我建议你养成几个好习惯:
- 统一单位: 世界坐标用毫米,焦距用毫米,像素尺寸用毫米/像素。混用单位是坐标系转换最常见的错误来源。
- 检查主点: 标定完相机后,先看看主点坐标是否接近图像中心的一半。如果差太多,说明标定可能有问题。
- 验证投影: 写代码时,先拿一个已知3D点投影到2D,看看结果是否合理。我每次都会做这个验证,能省掉后面很多调试时间。
- 注意方向: 相机坐标系的Y轴朝下,跟世界坐标系的Y轴朝上正好相反。做旋转矩阵时一定要确认方向。
嗯,坐标系基础就讲到这里。这些概念虽然基础,但后面所有章节都建立在它们之上。你花时间把这里搞透,后面的内容会顺畅很多。