坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系

做标定这么多年,我见过太多人一上来就对着公式硬啃,结果越看越懵。其实坐标系转换这事儿,说白了就是搞清楚「一个点在不同坐标系下怎么表示」。你想想看,相机拍到的是一张二维图片,但我们要描述的是三维世界里的物体位置,这中间必然要经过几次「搬家」。

我个人习惯把这件事拆成四步走:世界→相机→图像→像素。每一步都有它存在的道理,咱们一个一个来。

1. 四个坐标系,先认识一下

先别急着算公式,咱们得先知道这四个坐标系长什么样:

  • 世界坐标系 (World Coordinate System):你说了算的坐标系。你想把原点放在哪里都行,比如放在棋盘格的角点上,或者放在机器人基座上。单位是米或毫米。
  • 相机坐标系 (Camera Coordinate System):以相机光心为原点,Z轴指向相机前方,X轴向右,Y轴向下(或者向上,看具体定义)。单位也是米。
  • 图像坐标系 (Image Coordinate System):在成像平面上,以光轴与成像平面的交点为原点,单位是毫米。描述的是物理成像位置。
  • 像素坐标系 (Pixel Coordinate System):就是我们最终看到的图片,原点在左上角,单位是像素。u轴向右,v轴向下。

核心理解:世界坐标系是「真实世界」,像素坐标系是「照片」。中间两步转换,就是解决「从三维到二维」的投影问题。

世界坐标系 (Xw, Yw, Zw) 单位:米 相机坐标系 (Xc, Yc, Zc) 单位:米 图像坐标系 (x, y) 单位:毫米 像素坐标系 (u, v) 单位:像素 外参 内参 离散化 坐标系转换流程 三维 → 三维 → 二维(物理) → 二维(像素) Pc = R * Pw + T (x, y) = (f*Xc/Zc, f*Yc/Zc) (u, v) = (x/dx + u0, y/dy + v0)

2. 世界坐标系 → 相机坐标系(外参的舞台)

这一步其实就是一个刚体变换。世界坐标系里的点,要挪到相机坐标系里,需要做两件事:旋转和平移。

公式长这样:

|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 是 3x3 的旋转矩阵,T 是 3x1 的平移向量。合在一起,就是咱们常说的外参矩阵。

我的经验:实际项目中,旋转矩阵 R 有 9 个参数,但自由度只有 3。我建议用旋转向量或者欧拉角来表示,这样优化起来更稳定。曾经有一次我用 9 参数直接优化,结果矩阵不满足正交性,标定结果一塌糊涂。

3. 相机坐标系 → 图像坐标系(小孔成像)

这一步是核心中的核心。相机坐标系里的三维点,怎么投影到二维成像平面上?

用相似三角形就能推导出来:

x = f * Xc / Zc
y = f * Yc / Zc

其中 f 是焦距,单位是毫米。注意这里 Zc 不能为 0,否则就除以零了——这也是为什么相机不能拍到紧贴着镜头的物体。

避坑指南:我曾经在调试一个双目视觉系统时,发现左右图像对不上。查了两天才发现,是图像坐标系的原点定义搞反了——有的资料把原点定义在左上角,有的定义在中心。所以做标定前,一定要先确认好你用的相机模型是怎么定义坐标轴的。

4. 图像坐标系 → 像素坐标系(离散化)

图像坐标系是连续的物理坐标(毫米),但像素坐标系是离散的(像素)。这一步说白了就是「采样」。

转换公式:

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

其中 dx 和 dy 是每个像素在 x 和 y 方向上的物理尺寸(毫米/像素),(u0, v0) 是图像坐标系原点在像素坐标系中的位置,通常就是图像中心。

写成矩阵形式更直观:

|u|   |1/dx  0    u0| |x|
|v| = | 0   1/dy  v0| |y|
|1|   | 0    0    1 | |1|

5. 四步合一:完整的投影公式

把上面三步串起来,就是完整的从世界坐标到像素坐标的转换:

Zc * |u|   |fx  0   u0  0| |R  T| |Xw|
     |v| = |0   fy  v0  0| |0  1| |Yw|
     |1|   |0   0   1   0|       |Zw|
                                 |1 |

这里 fx = f/dx,fy = f/dy,就是咱们常说的内参中的焦距参数。

关键理解:整个转换过程中,外参(R, T)描述的是「相机在世界中的位置和朝向」,内参(fx, fy, u0, v0)描述的是「相机本身的成像特性」。标定的本质,就是同时求解这两组参数。

6. 一个具体的例子

假设世界坐标系中有一个点 Pw = (1m, 2m, 3m),相机的外参是:

  • 旋转:绕 Z 轴转 30°
  • 平移:Tx=0.1m, Ty=0.2m, Tz=0.5m

内参:fx=800, fy=800, u0=640, v0=480(假设是 1280x960 的图像)

计算步骤:

  1. 先算 Pc = R * Pw + T,得到相机坐标系下的坐标
  2. 再投影到图像平面:x = fx * Xc/Zc, y = fy * Yc/Zc
  3. 最后转像素:u = x + u0, v = y + v0

算出来大概在 (u≈720, v≈540) 附近。嗯,这个点落在图像中心偏右下的位置,符合直觉。

我的习惯:每次做标定前,我都会先手动算一个点的转换过程,验证一下代码逻辑对不对。别小看这一步,它能帮你发现很多低级错误,比如坐标轴方向搞反了、单位没统一之类的。

7. 总结一下

四个坐标系,三次转换,这就是相机成像的几何基础。你想想看,其实整个过程并不复杂:

  • 外参解决「相机在哪看」的问题
  • 内参解决「相机怎么看」的问题
  • 像素坐标解决「照片怎么存」的问题

搞清楚了这些,后面的标定算法、畸变校正、手眼标定,都是在这个框架上做文章。我个人觉得,坐标系转换是标定里最值得花时间理解的部分——基础打牢了,后面就顺了。

可可精品资料库