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是图像中心点的像素坐标。这些参数合起来就是相机的内参矩阵。

我曾经踩过的坑:有一次我直接用OpenCV的cv2.warpAffine做图像变换,结果目标框全偏了。查了半天才发现,OpenCV的坐标系是像素坐标系,而我传进去的变换矩阵是基于图像坐标系的。差了一个平移量,整个跟踪就废了。

1.5 四个坐标系的关系图

下面这张图是我手绘的,把整个变换链条串起来了。你盯着看两分钟,应该就能记住。

世界坐标系 (Xw, Yw, Zw) 单位:米 外参 R, T 相机坐标系 (Xc, Yc, Zc) 单位:米 投影 小孔成像 图像坐标系 (x, y) 单位:毫米 内参 缩放+平移 像素坐标系 (u, v) 单位:像素 坐标系变换链条 完整变换公式 世界 → 相机:P_cam = R * P_world + T 相机 → 图像:x = f * X_cam / Z_cam, y = f * Y_cam / Z_cam 图像 → 像素:u = x/dx + u0, v = y/dy + v0 最终:像素坐标 = 内参矩阵 × 外参矩阵 × 世界坐标

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,直接一步到位
注意:上面的内参矩阵K是简化版。实际相机还有畸变参数——径向畸变和切向畸变。我建议你在做高精度跟踪时,一定要做相机标定,把畸变矫正掉。不然目标在图像边缘时,位置误差会很大。

好了,坐标系基础就讲到这里。这四个坐标系的关系,说白了就是一条链:世界→相机→图像→像素。每个环节都有对应的变换参数。搞清楚了这些,后面的坐标变换技巧才能用得上。

一句话总结:世界坐标系是"真实位置",相机坐标系是"以相机看世界",图像坐标系是"物理投影",像素坐标系是"数字表示"。四个坐标系,一条变换链,搞懂它们,目标跟踪就成功了一半。

可可精品资料库