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

做视觉标定这么多年,我见过太多工程师一上来就对着公式硬啃,结果越看越晕。其实说白了,坐标系转换就是解决一个核心问题:怎么把现实世界中一个点的位置,准确地映射到相机拍出来的照片上

我个人习惯把这件事拆成四步走。每一步对应一个坐标系,环环相扣。你只要搞懂了这四步,标定原理就通了七成。

1. 四个坐标系,各司其职

先认识一下今天的主角们。它们就像一条流水线上的四个工位,每个工位干自己的活:

坐标系 单位 描述
世界坐标系 mm / m 我们熟悉的真实三维空间。比如机械臂的基座、流水线的起点,都可以作为原点。
相机坐标系 mm / m 以相机光心为原点,Z轴指向镜头前方。说白了,就是「相机眼中的三维世界」。
图像坐标系 mm 在相机内部,感光芯片上的物理平面。单位是毫米,原点一般在芯片中心。
像素坐标系 pixel 我们最终看到的图像。原点在左上角,单位是像素。你拍的照片就是它。

嗯,这里要注意:世界坐标系和相机坐标系是三维的,图像和像素坐标系是二维的。从三维到二维,必然有信息丢失——这就是透视投影在起作用。

2. 转换链条:从世界到像素

整个转换过程,就像一条单向流水线:

世界坐标 → 相机坐标 → 图像坐标 → 像素坐标

每一步都有明确的数学关系。我画了一张图帮你理清脉络:

世界坐标系 (Xw, Yw, Zw) 相机坐标系 (Xc, Yc, Zc) 图像坐标系 (x, y) 像素坐标系 (u, v) 刚体变换 透视投影 仿射变换 外参(R, T) 内参(fx, fy, cx, cy) 畸变系数(k1, k2, p1, p2) 标定的本质:求解这些参数

这张图你看明白了吗?标定的本质,就是求解这些参数。下面我们一步步拆解。

3. 第一步:世界坐标系 → 相机坐标系(刚体变换)

这一步最简单。世界坐标系和相机坐标系之间,只差一个旋转和一个平移。用数学表达就是:

|Xc|   | R11 R12 R13 | |Xw|   |Tx|
|Yc| = | R21 R22 R23 | |Yw| + |Ty|
|Zc|   | R31 R32 R33 | |Zw|   |Tz|

写成齐次坐标更简洁:

[Xc, Yc, Zc, 1]^T = [R | T] * [Xw, Yw, Zw, 1]^T

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

我的经验: 在实际项目中,我习惯用旋转向量而不是旋转矩阵来标定。因为旋转向量只有3个参数,优化起来更稳定。用Rodrigues公式可以互相转换,OpenCV里直接有函数。

4. 第二步:相机坐标系 → 图像坐标系(透视投影)

这一步是三维到二维的关键跳跃。用的是小孔成像模型:

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

写成矩阵形式:

|x|   |f  0  0  0| |Xc|
|y| = |0  f  0  0| |Yc|
|1|   |0  0  1  0| |Zc|
                     |1 |

这里f是焦距。你想想看,Zc在分母上——这就是为什么距离越远,物体在图像上越小

避坑指南: 我曾经在一个项目中,相机安装角度有点偏,结果标定出来的焦距值总是飘。后来发现是畸变没校正到位。记住:畸变校正一定要在投影之前做,顺序不能乱。

5. 第三步:图像坐标系 → 像素坐标系(仿射变换)

图像坐标系的原点在芯片中心,单位是毫米。像素坐标系的原点在左上角,单位是像素。转换关系:

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

其中dx、dy是每个像素的物理尺寸,cx、cy是主点坐标(光心在像素坐标系中的位置)。

写成矩阵:

|u|   |1/dx  0    cx| |x|
|v| = |0     1/dy cy| |y|
|1|   |0     0    1 | |1|
核心要点: 内参矩阵K = |fx 0 cx| |0 fy cy| |0 0 1 | 其中fx = f/dx, fy = f/dy。标定就是求这4个参数(fx, fy, cx, cy)加上畸变系数。

6. 完整转换公式(一步到位)

把三步串起来,从世界坐标到像素坐标的完整公式:

Zc * |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 |

简化写法:

Zc * [u, v, 1]^T = K * [R | T] * [Xw, Yw, Zw, 1]^T

这就是视觉标定的核心方程。所有标定算法,本质上都是在求解K、R、T。

7. 实战中的几个坑

  • 棋盘格要平整: 我见过有人用打印纸贴在弯曲的纸箱上标定,结果误差大得离谱。标定板一定要贴在刚性平面上。
  • 图片数量要够: 我个人习惯拍15-20张不同角度的图片。太少的话,内参解不稳定。
  • 覆盖整个视场: 标定图片要分布在画面的各个区域,尤其是边缘。中心区域拍再多,边缘畸变也标不准。
  • 注意Zc的符号: 在相机坐标系中,物体在相机前方,Zc > 0。如果标定出来Zc是负的,说明坐标系定义反了。
一个小技巧: 标定完成后,可以用重投影误差来评估标定质量。一般误差小于0.5个像素就算不错。如果超过1个像素,建议检查标定板或重新采集图片。

好了,坐标系转换这部分就讲到这里。你只要记住那条转换链条,再理解每一步的物理意义,标定原理就掌握了一大半。下一节我们聊聊具体的标定方法和操作步骤。


专注资料整理