坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系
做标定这么多年,我见过太多人一上来就对着公式硬啃,结果越看越懵。其实坐标系转换这事儿,说白了就是搞清楚「一个点在不同坐标系下怎么表示」。你想想看,相机拍到的是一张二维图片,但我们要描述的是三维世界里的物体位置,这中间必然要经过几次「搬家」。
我个人习惯把这件事拆成四步走:世界→相机→图像→像素。每一步都有它存在的道理,咱们一个一个来。
1. 四个坐标系,先认识一下
先别急着算公式,咱们得先知道这四个坐标系长什么样:
- 世界坐标系 (World Coordinate System):你说了算的坐标系。你想把原点放在哪里都行,比如放在棋盘格的角点上,或者放在机器人基座上。单位是米或毫米。
- 相机坐标系 (Camera Coordinate System):以相机光心为原点,Z轴指向相机前方,X轴向右,Y轴向下(或者向上,看具体定义)。单位也是米。
- 图像坐标系 (Image Coordinate System):在成像平面上,以光轴与成像平面的交点为原点,单位是毫米。描述的是物理成像位置。
- 像素坐标系 (Pixel Coordinate System):就是我们最终看到的图片,原点在左上角,单位是像素。u轴向右,v轴向下。
核心理解:世界坐标系是「真实世界」,像素坐标系是「照片」。中间两步转换,就是解决「从三维到二维」的投影问题。
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 的图像)
计算步骤:
- 先算 Pc = R * Pw + T,得到相机坐标系下的坐标
- 再投影到图像平面:x = fx * Xc/Zc, y = fy * Yc/Zc
- 最后转像素:u = x + u0, v = y + v0
算出来大概在 (u≈720, v≈540) 附近。嗯,这个点落在图像中心偏右下的位置,符合直觉。
我的习惯:每次做标定前,我都会先手动算一个点的转换过程,验证一下代码逻辑对不对。别小看这一步,它能帮你发现很多低级错误,比如坐标轴方向搞反了、单位没统一之类的。
7. 总结一下
四个坐标系,三次转换,这就是相机成像的几何基础。你想想看,其实整个过程并不复杂:
- 外参解决「相机在哪看」的问题
- 内参解决「相机怎么看」的问题
- 像素坐标解决「照片怎么存」的问题
搞清楚了这些,后面的标定算法、畸变校正、手眼标定,都是在这个框架上做文章。我个人觉得,坐标系转换是标定里最值得花时间理解的部分——基础打牢了,后面就顺了。
可可精品资料库