2. 坐标系基础
做传感器融合,第一关就是坐标系。我见过不少新手,算法推得头头是道,结果一跑数据,点云和图像对不上——十有八九是坐标系搞混了。说白了,坐标系就是给空间里的每个点一个唯一的“身份证号”。
今天咱们把四个核心坐标系掰开揉碎讲清楚。你想想看,一个三维点从真实世界落到你屏幕上的像素,中间经历了什么?嗯,就是下面这张图说的故事。
核心逻辑一句话:世界坐标系 → 相机坐标系 → 图像坐标系 → 像素坐标系。每一步都是一次数学变换,少一个环节,数据就对不上。
1. 世界坐标系 (World Coordinate System)
世界坐标系是整个场景的“参考系”。你可以把它想象成一个固定的原点,所有物体、传感器、车辆的位置都相对于它来描述。我习惯把世界坐标系的原点设在场景的某个角落,比如停车场的第一根柱子,或者用GPS经纬度作为基准。
- 表示方式: (Xw, Yw, Zw)
- 单位: 米(或毫米,看应用场景)
- 特点: 一旦定义,不再改变。所有其他坐标系都通过变换与之关联。
我的习惯:在自动驾驶项目中,我通常把世界坐标系Z轴朝上(右手系),这样和大多数地图数据兼容。如果你做机器人室内导航,Z轴朝上也是主流。别小看这个选择——方向错了,后面所有旋转矩阵都得重算。
2. 相机坐标系 (Camera Coordinate System)
相机坐标系的原点在相机的光心(镜头中心),Z轴指向相机的前方(也就是拍摄方向),X轴向右,Y轴向下。嗯,这里要注意:相机坐标系的Y轴是朝下的,这和世界坐标系的习惯不一样。
为什么这么定义?因为图像的行是从上往下数的,Y轴朝下方便后续映射到图像坐标。我在第一次做标定时,没注意这个细节,结果点云投影到图像上全是上下颠倒的——折腾了一天才发现是坐标系方向搞反了。
- 表示方式: (Xc, Yc, Zc)
- 与世界坐标系的关系: 通过旋转矩阵R和平移向量t进行刚体变换
数学表达:
[Xc] [R11 R12 R13] [Xw] [tx]
[Yc] = [R21 R22 R23] [Yw] + [ty]
[Zc] [R31 R32 R33] [Zw] [tz]
简写为:Pc = R · Pw + t
3. 图像坐标系 (Image Coordinate System)
图像坐标系是二维的,原点在成像平面的中心(也就是光轴与成像平面的交点),x轴向右,y轴向下。单位是毫米。
这里有个关键点:相机坐标系里的三维点,通过透视投影变成图像坐标系里的二维点。说白了,就是小孔成像原理——远处的物体在成像平面上变小了。
我曾经踩过的坑:图像坐标系的原点不是图像左上角,而是成像平面的物理中心。很多初学者直接把图像左上角当原点,结果投影全偏了。记住:图像坐标系是连续的物理坐标,像素坐标系才是离散的整数坐标。
透视投影公式:
x = f * (Xc / Zc)
y = f * (Yc / Zc)
其中f是焦距(单位:毫米)。Zc是物体到相机的深度。
4. 像素坐标系 (Pixel Coordinate System)
像素坐标系就是我们最终看到的图像坐标。原点在图像左上角,u轴向右,v轴向下。单位是像素(pixel)。
从图像坐标系到像素坐标系,其实就是一次“离散化”和“偏移”:
u = (x / dx) + u0
v = (y / dy) + v0
其中:
- dx, dy:每个像素在x和y方向的物理尺寸(毫米/像素)
- u0, v0:图像坐标系原点在像素坐标系中的位置(主点坐标)
我建议:在实际项目中,不要手动算这些公式。直接用OpenCV的cv2.projectPoints()或者Eigen的投影函数。但理解背后的原理很重要——当投影结果不对时,你知道该查哪个环节。
5. 完整转换关系总结
把上面四步串起来,一个世界坐标系下的点Pw到像素坐标(u, v)的完整变换是:
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:以像素为单位的焦距
- u0, v0:主点坐标
- R, t:相机外参(旋转和平移)
| 坐标系 | 维度 | 原点 | 单位 | 关键参数 |
|---|---|---|---|---|
| 世界坐标系 | 3D | 自定义 | 米 | 无(参考) |
| 相机坐标系 | 3D | 光心 | 米 | R, t(外参) |
| 图像坐标系 | 2D | 成像平面中心 | 毫米 | f(焦距) |
| 像素坐标系 | 2D | 图像左上角 | 像素 | fx, fy, u0, v0(内参) |
一句话记住:世界坐标系是“真实世界”,相机坐标系是“以相机为中心看世界”,图像坐标系是“物理成像平面”,像素坐标系是“你看到的图像”。每一步变换都有明确的数学公式,少一个环节,数据就对不上。