坐标系基础:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换关系
做车道线检测,说白了就是在玩坐标转换。你想想看,车在路上跑,路是三维的,但摄像头拍出来的照片是二维的。怎么把二维图像里的车道线,映射回真实的三维世界?这背后就是四个坐标系在来回倒腾。
我个人习惯把这件事分成两步来理解:第一步,把三维世界里的点拍到相机里;第二步,把相机里的成像变成我们能处理的像素。每一步都对应着不同的坐标系转换。
四个坐标系,各司其职
先认识一下这四个老朋友:
- 世界坐标系 (Xw, Yw, Zw):真实世界的绝对坐标。比如你在地上画个十字,这就是世界坐标系的原点。车道线的物理位置,就是用这个坐标系描述的。
- 相机坐标系 (Xc, Yc, Zc):以相机光心为原点。Zc轴指向相机前方,Xc轴向右,Yc轴向下。说白了,就是「相机眼中的世界」。
- 图像坐标系 (x, y):在成像平面上,以光轴与成像平面的交点为原点。单位是毫米。这是物理成像的坐标。
- 像素坐标系 (u, v):就是我们最终看到的图像。原点在图像左上角,u轴向右,v轴向下。单位是像素。
核心一句话:世界坐标 → 相机坐标 → 图像坐标 → 像素坐标。反过来就是去畸变和逆透视变换要做的事。
第一步:世界坐标系 → 相机坐标系(外参干的活)
这一步叫刚体变换。说白了,就是把整个世界挪到相机的位置和角度上来看。
公式很简单:
|Xc| |R11 R12 R13| |Xw| |Tx|
|Yc| = |R21 R22 R23| |Yw| + |Ty|
|Zc| |R31 R32 R33| |Zw| |Tz|
写成齐次坐标更清爽:
|Xc| |R T| |Xw|
|Yc| = |0 1| |Yw|
|Zc| |Zw|
|1 | |1 |
这里的 R 是旋转矩阵,T 是平移向量。这两者合起来就是外参。
我的经验:我在做车道线标定时,最头疼的就是外参。有一次在颠簸路段测试,标定好的外参全乱了。后来我学乖了——每次上路前先做一次快速外参校验,用地面上的车道线作为参考,反算R和T有没有漂移。
第二步:相机坐标系 → 图像坐标系(内参的透视投影)
这一步是透视投影。相机坐标系里的三维点,通过小孔成像原理,映射到成像平面上。
公式:
x = f * Xc / Zc
y = f * Yc / Zc
其中 f 是焦距。写成矩阵形式:
|x| |f 0 0 0| |Xc|
|y| = |0 f 0 0| |Yc|
|1| |0 0 1 0| |Zc|
|1 |
注意:这里有个坑。Zc 不能为0,否则除零错误。我在项目中遇到过,当车道线正好在相机正下方时,Zc 很小,计算出来的 x, y 会非常大,导致投影失真。所以实际标定时,要保证标定板离相机有一定距离。
第三步:图像坐标系 → 像素坐标系(离散化)
这一步是把连续的物理坐标,变成离散的像素坐标。说白了,就是告诉你成像平面上的一个点,对应图像里的第几行第几列。
公式:
u = x / dx + u0
v = y / dy + v0
其中 dx, dy 是每个像素的物理尺寸,u0, v0 是图像中心(光轴与成像平面交点)的像素坐标。
矩阵形式:
|u| |1/dx 0 u0| |x|
|v| = |0 1/dy v0| |y|
|1| |0 0 1 | |1|
合在一起:完整的投影公式
把三步串起来,就是完整的从世界坐标到像素坐标的转换:
|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。前面那个 3x4 矩阵就是内参矩阵,后面那个 4x4 矩阵就是外参矩阵。
说白了:内参是相机自己的属性(焦距、像素大小、中心点),出厂就定了。外参是相机相对于世界的位置和朝向,每次安装都要重新标定。
知识体系结构图
下面这张图,帮你理清四个坐标系之间的转换关系:
逆透视变换(IPM)—— 从像素回到世界
刚才讲的是正向投影。但在车道线检测中,我们经常要做逆透视变换——把图像里的车道线,映射到俯视图(鸟瞰图)上。
为什么?因为透视效应会让远处的车道线变窄、变模糊。逆透视之后,车道线变成平行的,检测起来容易得多。
逆透视的公式就是正向投影的逆过程:
|Xw| |R^T -R^T*T| |Zc * (u - u0)/fx|
|Yw| = |0 1 | |Zc * (v - v0)/fy|
|Zw| | Zc |
|1 | | 1 |
避坑指南:我曾经在逆透视时犯过一个低级错误——忘了 Zc 是未知数。实际上,逆透视需要假设地面是平面(Zw=0),才能解出 Zc。如果地面有坡度,逆透视就会变形。所以做车道线检测时,最好假设路面是平的,或者用多帧信息估计路面坡度。
总结一下
四个坐标系之间的转换,是自动驾驶感知的基石。你想想看,不管是车道线检测、障碍物测距,还是路径规划,本质上都是在做坐标转换。
我个人建议,刚开始接触的同学,先用手算一遍从世界坐标到像素坐标的完整流程。拿一个已知的点,比如车道线起点,手动算一遍,看看最终落在图像的哪个像素上。算通了,后面的标定、检测、跟踪就都好理解了。
嗯,坐标系这块就聊到这儿。记住一句话:外参管位置,内参管成像,两者缺一不可。
核心公式速记:
- 世界→相机:Xc = R * Xw + T(外参)
- 相机→图像:x = f * Xc / Zc(透视投影)
- 图像→像素:u = x/dx + u0(离散化)