4. 从世界到像素:坐标变换的完整链路

各位同学,今天我们来聊聊自动驾驶感知中最基础、也最容易踩坑的一个环节——坐标变换。

说白了,车道线检测的终极目标,就是把物理世界中的一条白线,映射到你屏幕上那个像素点。这中间经历了三次变换:世界→相机(外参)、相机→图像(投影)、图像→像素(离散化)。每一步都有它的物理意义和数学表达。

我个人习惯把这三步拆开来看,因为每一步的误差来源完全不同。你如果混在一起调参,出了问题根本不知道是标定板没放平,还是内参矩阵算错了。

4.1 世界坐标系 → 相机坐标系(外参)

先问一个问题:为什么需要世界坐标系?

因为你的车在动,但车道线是固定的。我们需要一个全局参考系来描述车道线的绝对位置。通常,世界坐标系的原点选在车体中心或者第一个GPS天线下方,X轴指向车头,Y轴指向左侧,Z轴向上。

相机坐标系呢?它的原点在相机光心,Z轴指向镜头前方,X轴向右,Y轴向下(注意,这里和世界坐标系的方向不同)。

从世界到相机,本质上就是一个刚体变换:旋转 + 平移。

核心公式:

P_cam = R * P_world + T

其中 R 是 3x3 旋转矩阵,T 是 3x1 平移向量。这 6 个自由度(3 旋转 + 3 平移)就是所谓的外参。

我在项目中遇到过一个问题:标定完外参后,发现车道线投影到图像上总是偏左 2 个像素。排查了半天,结果是安装支架在车辆行驶中发生了微小形变。嗯,这里要注意——外参不是标定一次就一劳永逸的。特别是对于 L4 级别的量产车,建议每次上电后做一次在线标定校验。

我的经验:外参标定最常用的方法是 PnP(Perspective-n-Point)。你只需要知道 3D-2D 的对应点对,就能解出 R 和 T。但注意,点对数量至少 4 组,且不能共面。我曾经用 6 组点对,结果 3 组几乎在一条直线上,解出来的外参直接让车道线飞到天上去了。

4.2 相机坐标系 → 图像坐标系(投影)

这一步是从 3D 到 2D 的关键。相机坐标系下的点 (X_c, Y_c, Z_c),通过小孔成像模型,投影到图像平面上。

你想想看,小孔成像的本质是什么?是相似三角形。

x = f * X_c / Z_c
y = f * Y_c / Z_c

这里 f 是焦距(单位:毫米)。注意,投影后的坐标 (x, y) 是在图像坐标系下,单位还是毫米,原点在图像中心(主点)。

为什么强调这个?因为很多初学者直接把这一步得到的坐标当成像素坐标去用,结果发现图像边缘的物体位置全错了。说白了,你还需要一步离散化。

避坑指南:我曾经在调试一个环视系统时,发现四个相机的拼接处总有 3-5 个像素的错位。查了两天,最后发现是投影公式里忘了考虑镜头畸变。记住,实际镜头不是理想小孔,径向畸变和切向畸变必须校正。OpenCV 里用 cv::undistort() 或者 cv::initUndistortRectifyMap() 都可以做。

4.3 图像坐标系 → 像素坐标系(离散化)

最后一步,把连续的图像坐标 (x, y) 变成离散的像素坐标 (u, v)。

这一步其实就是一个仿射变换:

u = x / dx + u0
v = y / dy + v0

其中 dx, dy 是每个像素的物理尺寸(单位:毫米/像素),(u0, v0) 是主点在像素坐标系下的位置。

把这三步合起来,就得到了完整的投影矩阵 P:

P = K * [R | T]

其中 K 是内参矩阵:
K = [fx  0  u0
     0  fy  v0
     0   0   1]

fx = f / dx, fy = f / dy,单位是像素。

我个人习惯把内参矩阵 K 看作一个「翻译器」——它把物理世界的毫米,翻译成图像世界的像素。而外参 [R|T] 则是「定位器」——它告诉相机在世界中的位置和朝向。

4.4 知识体系总览

下面这张图总结了从世界到像素的完整链路。我建议你把它打印出来贴在工位上,调试的时候对照着看,能省不少时间。

从世界到像素:坐标变换完整链路 世界坐标系 (X_w, Y_w, Z_w) 全局参考系 原点:车体中心/GPS 外参 R, T 相机坐标系 (X_c, Y_c, Z_c) 光心为原点 Z轴指向镜头前方 投影 小孔成像 图像坐标系 (x, y) 单位:毫米 原点:图像中心 离散化 仿射变换 像素 (u,v) 单位: 像素 完整投影矩阵 P = K · [R | T] 内参矩阵 K(固定):焦距、主点、像素尺寸 → 相机出厂即确定 外参 [R|T](可变):旋转、平移 → 随安装位置和车辆姿态变化 投影过程:P_world → P_cam(外参)→ (x,y)(投影)→ (u,v)(离散化) 注意:实际应用中还需考虑镜头畸变校正,通常在投影之前完成

4.5 实战中的注意事项

讲完理论,说点实际的。我在量产项目中总结了几条经验:

  1. 坐标系方向要统一。 不同传感器(相机、激光雷达、IMU)的坐标系定义可能不同。我见过一个团队,相机用右手系,激光雷达用左手系,结果融合出来的车道线直接反了 180 度。
  2. 外参标定要定期做。 车辆行驶中的振动、温度变化都会导致外参漂移。建议每 1000 公里或者每次保养后重新标定一次。
  3. 内参一般不需要频繁标定。 除非你换了镜头或者相机模组。但注意,变焦镜头的内参会随焦距变化,每次变焦后必须重新标定。
  4. 投影前先做畸变校正。 这是最容易忽略的一步。我曾经在高速上测试,因为没做畸变校正,车道线在图像边缘偏移了 8 个像素,差点导致变道决策失误。

一个小技巧:在调试阶段,你可以把投影后的车道线叠加到原始图像上,用肉眼检查是否对齐。如果发现车道线在图像边缘出现弯曲或偏移,大概率是畸变校正没做好或者外参有误差。

好了,这一章的内容就到这里。坐标变换是整个车道线检测的基石,你如果能把这三步理解透,后面的语义分割、后处理都会轻松很多。

可可精品资料库