1、坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系的定义与关系
做目标跟踪这些年,我踩过最多的坑,就是坐标系搞混了。
你想想看,一个目标在真实世界里是三维的,到了照片里变成了二维的。这中间经历了多少次坐标变换?每次变换都藏着坑。我记得刚入行那会儿,有个项目死活跟踪不准,折腾了两周,最后发现是像素坐标系和图像坐标系搞反了——一个正Y轴朝上,一个朝下,就这么简单的事。
所以今天咱们先把地基打牢。四个坐标系,一个变换链条,我带你捋一遍。
1.1 世界坐标系(World Coordinate System)
说白了,这就是我们生活的真实世界。你站在马路上,面前有一辆车——车的位置就是世界坐标系下的坐标。单位是米,原点可以随便定,比如以某个路灯为原点。
世界坐标系是绝对的。不管相机怎么动,目标在世界坐标系下的位置是不变的。这一点在做多相机跟踪时特别重要。我曾经做过一个跨镜头的行人跟踪项目,A相机看到行人在(10, 5, 0),B相机看到同一个行人在(8, 3, 0)——如果不统一到世界坐标系,你根本不知道这是同一个人。
1.2 相机坐标系(Camera Coordinate System)
相机坐标系是以相机为中心看世界。原点在相机的光心,Z轴指向相机的前方(也就是镜头朝向),X轴向右,Y轴向下。
嗯,这里要注意:相机坐标系的Y轴是朝下的。这和世界坐标系的习惯不一样。很多新手在这里翻车。
从世界坐标系到相机坐标系,其实就是一个刚体变换——旋转加平移。公式长这样:
P_cam = R * P_world + T
其中R是旋转矩阵,T是平移向量。R和T合起来就是相机的外参。每个相机的外参都不一样,这就是为什么不同相机看到的同一个目标位置不同。
1.3 图像坐标系(Image Coordinate System)
到了这一步,三维世界被投影到了二维平面上。图像坐标系的原点在相机的光轴与成像平面的交点——也就是图像的中心。单位还是物理单位,比如毫米。
从相机坐标系到图像坐标系,用的是小孔成像模型:
x = f * X_cam / Z_cam
y = f * Y_cam / Z_cam
f是焦距。你看,Z_cam跑到了分母上——这就是透视投影。近大远小,就是这个公式在作怪。
我做过一个车辆跟踪的项目,远处一辆车明明很大,到了图像上只有几个像素。如果不做尺度归一化,跟踪器根本认不出来。所以后来我习惯在跟踪前先做一步尺度补偿。
1.4 像素坐标系(Pixel Coordinate System)
终于到了我们最熟悉的坐标系。像素坐标系的原点在图像的左上角,u轴向右,v轴向下。单位是像素。
从图像坐标系到像素坐标系,就是一个缩放加平移:
u = x / dx + u0
v = y / dy + v0
dx和dy是每个像素的物理尺寸,u0和v0是图像中心点的像素坐标。这些参数合起来就是相机的内参矩阵。
1.5 四个坐标系的关系图
下面这张图是我手绘的,把整个变换链条串起来了。你盯着看两分钟,应该就能记住。
1.6 实际项目中的坐标系选择
做目标跟踪时,我一般遵循一个原则:在哪个坐标系下做跟踪,就用哪个坐标系的度量。
举个例子:
- 如果做单目视觉跟踪,直接在像素坐标系下做。简单、快。
- 如果做双目视觉跟踪,我会转到相机坐标系下做。因为深度信息能帮我做尺度补偿。
- 如果做多相机接力跟踪,必须统一到世界坐标系。不然不同相机的目标ID对不上。
1.7 常见坐标系变换矩阵
为了方便你查阅,我把常用的变换矩阵整理成了表格:
| 变换类型 | 矩阵形式 | 参数说明 |
|---|---|---|
| 世界→相机 | [R | T] 3×4矩阵 | R: 3×3旋转矩阵, T: 3×1平移向量 |
| 相机→图像 | 内参矩阵K 3×3 | K = [[f, 0, 0], [0, f, 0], [0, 0, 1]] |
| 图像→像素 | 仿射变换 3×3 | 包含缩放因子dx, dy和偏移u0, v0 |
| 世界→像素 | K × [R | T] 3×4 | 投影矩阵P,直接一步到位 |
好了,坐标系基础就讲到这里。这四个坐标系的关系,说白了就是一条链:世界→相机→图像→像素。每个环节都有对应的变换参数。搞清楚了这些,后面的坐标变换技巧才能用得上。
可可精品资料库