4、透视变换与鸟瞰图:如何将前视图像转换为俯视图,便于赛道线检测与路径规划
在无人车视觉巡线系统中,摄像头通常以一定俯仰角安装于车体前方,获取的是包含地平线、赛道、两侧环境在内的前视图像。前视图像符合人眼观察习惯,但对于赛道线检测与路径规划而言,却存在一个根本性障碍:透视效应导致远处赛道线在图像中逐渐汇聚,车道宽度随距离变化,平行线不再平行,曲率信息被压缩。这种几何畸变使得基于像素坐标的霍夫变换、滑动窗口等算法难以直接提取稳定的车道曲率与横向偏移量。透视变换(Perspective Transform)正是解决该问题的核心手段——通过单应性矩阵将前视图像投影到世界坐标系下的俯视平面,生成鸟瞰图(Bird's Eye View, BEV),使赛道线恢复平行关系,为后续的曲率拟合、横向偏差计算和速度决策提供几何一致的输入。
透视变换的数学本质是平面单应性映射。在无人车场景中,假设赛道为平面,摄像头光轴与赛道平面存在夹角,则前视图像与俯视平面之间满足单应关系。通过选取前视图像中已知的4个非共线点(通常为赛道梯形区域的四个顶点),并指定它们在鸟瞰图中的目标坐标,即可求解3×3单应矩阵H。该矩阵将前视图像中的每个像素坐标映射到鸟瞰图坐标,从而消除透视畸变。OpenCV提供的cv2.getPerspectiveTransform(src, dst)函数接收两组坐标点集并返回H,随后通过cv2.warpPerspective对图像进行重采样,生成鸟瞰图。整个过程计算量小、实时性高,非常适合嵌入式平台(如Jetson Nano、树莓派)上的视觉巡线任务。
4.1 核心原理:从像素平面到世界平面的几何映射
透视变换的数学表达式为:
[u] [h11 h12 h13] [x]
[v] = [h21 h22 h23] [y]
[1] [h31 h32 h33] [1]
其中(x,y)为前视图像素坐标,(u,v)为鸟瞰图像素坐标。由于H有8个自由度(h33通常归一化为1),因此需要至少4组对应点。在实际工程中,通常选取赛道近处左右边缘点、远处左右边缘点共4个点作为源点集。目标点集则设置为鸟瞰图中一个矩形区域的四个顶点,矩形宽度对应实际赛道宽度(如1.5米),高度对应前视图像中可检测的赛道纵向距离(如10米)。
需要特别强调的是,透视变换不是简单的仿射变换。仿射变换只能处理平移、旋转、缩放和错切,无法消除透视汇聚效应。透视变换通过h31和h32分量引入非线性缩放,使得远处物体在鸟瞰图中被“拉宽”,近处物体被“压缩”,从而恢复平行关系。这一特性对于后续的曲率计算至关重要——在鸟瞰图中,直线赛道的左右边缘线严格平行,曲线赛道的曲率半径可以直接通过多项式拟合获得,无需再考虑透视畸变带来的误差。
4.2 操作流程:从图像采集到鸟瞰图生成的完整步骤
在实际无人车系统中,透视变换的工程实现需要遵循以下流程:
- 摄像头标定与安装固定:确保摄像头俯仰角固定(如30°),内参畸变已校正。若使用广角镜头,需先进行畸变校正,否则透视变换结果会出现边缘弯曲。
- 选取源点集:在实时视频流中暂停一帧,手动选取赛道梯形区域的四个顶点。推荐选取近处左右边缘(距离车头约0.5米)和远处左右边缘(距离车头约8-10米)。源点坐标需精确到像素级。
- 设定目标点集:在鸟瞰图中,将上述四点映射为矩形。矩形宽度建议设置为300-400像素(对应实际1.5米赛道宽度),高度设置为400-600像素(对应实际10米纵向距离)。目标点坐标需保持矩形形状,否则会导致赛道线倾斜。
- 计算单应矩阵:调用
cv2.getPerspectiveTransform(src, dst)获得H矩阵。该矩阵可缓存复用,无需每帧重新计算。 - 执行透视变换:对每一帧图像调用
cv2.warpPerspective(img, H, (width, height))生成鸟瞰图。注意输出尺寸需与目标点集坐标范围匹配。 - 像素当量标定:在赛道上放置已知间距的标记物(如每隔1米放置一个色块),在鸟瞰图中测量像素距离,计算mm/px比例。该比例用于后续速度控制和横向偏差计算。
| 步骤 | 输入 | 输出 | 关键参数 | 常见错误 |
|---|---|---|---|---|
| 源点选取 | 前视图像帧 | 4个像素坐标点 | 近处y≈图像高度80%,远处y≈图像高度40% | 选取点不在赛道边缘,导致鸟瞰图赛道线倾斜 |
| 目标点设定 | 源点坐标 | 4个目标坐标点 | 矩形宽度=300px,高度=500px | 目标点非矩形,导致图像拉伸变形 |
| 矩阵计算 | src, dst | 3×3矩阵H | 数据类型float32 | 源点共线导致矩阵奇异 |
| 图像变换 | 原图, H, 输出尺寸 | 鸟瞰图 | 插值方法:INTER_LINEAR | 输出尺寸过小导致信息丢失 |
| 像素标定 | 已知间距标记物 | mm/px比例 | 建议在赛道直线段标定 | 标定距离过短导致比例误差大 |
4.3 案例拆解:基于鸟瞰图的赛道线检测与路径规划实战
以下通过一个完整的工程案例,展示透视变换在无人车视觉巡线中的实际应用。假设我们使用Jetson Nano平台,配备120°广角摄像头,安装高度15cm,俯仰角25°,赛道为室内PVC材质,宽度1.5米,包含直线、S弯和直角弯。
初始现象与目标:直接在前视图像上使用滑动窗口检测赛道线,发现S弯处曲率计算误差超过30%,直线段检测正常但弯道处横向偏差抖动剧烈。目标是将曲率计算误差控制在5%以内,横向偏差精度达到±2cm。
关键输入数据:摄像头分辨率为1280×720,帧率30fps。前视图像中,赛道近处宽度约400像素,远处(8米处)宽度约80像素,透视汇聚明显。
分析判断过程:前视图像中赛道线在远处几乎汇聚于一点,导致滑动窗口在远处无法可靠区分左右车道线。同时,曲率拟合时远处点的权重被压缩,使得拟合结果偏向近处直线段,无法反映真实弯道曲率。因此,必须通过透视变换将图像转换为鸟瞰图,使赛道线恢复平行。
实际操作步骤:
- 在直线段暂停视频帧,选取源点集:近处左(200, 600)、近处右(1080, 600)、远处左(500, 300)、远处右(780, 300)。
- 设定目标点集:近处左(200, 500)、近处右(500, 500)、远处左(200, 0)、远处右(500, 0)。输出尺寸为700×500。
- 计算H矩阵并缓存。对每帧执行warpPerspective,耗时约3ms。
- 在鸟瞰图中使用颜色阈值提取白色赛道线,采用直方图峰值定位左右车道线起始位置,滑动窗口跟踪。
- 对左右车道线分别进行二阶多项式拟合,计算曲率半径和车辆横向偏移量。
- 标定像素当量:在赛道直线段放置间隔1米的标记物,测得鸟瞰图中每米对应200像素,即5mm/px。
结果对比:转换前,S弯处曲率计算误差为32%,横向偏差抖动幅度±5cm;转换后,曲率误差降至3.8%,横向偏差稳定在±1.5cm。直线段检测速度从25ms/帧提升至18ms/帧(因鸟瞰图尺寸更小)。
风险与代价:透视变换对源点选取敏感,若源点选取不当,鸟瞰图会出现赛道线倾斜或比例失真。此外,鸟瞰图在远处(超过10米)分辨率急剧下降,像素当量变大,导致远处检测精度降低。因此,实际系统中通常只对近处8米范围内的赛道进行路径规划,远处信息仅用于方向预判。
4.4 常见误区与总结复盘
在透视变换的实际应用中,初学者常犯以下错误:
- 误区一:源点选取随意。源点必须位于赛道边缘线上,且远近两组点应尽量覆盖赛道的主要检测区域。若源点选取过近,鸟瞰图只能覆盖车头附近,无法提供足够的预判距离;若选取过远,远处像素分辨率不足,变换后噪声放大。
- 误区二:目标点矩形宽度与实际不符。目标矩形的宽高比应反映实际赛道的宽长比。若矩形过宽,赛道线在鸟瞰图中会显得“瘦长”,曲率计算偏大;若矩形过窄,赛道线会显得“矮胖”,曲率计算偏小。
- 误区三:忽略摄像头畸变。广角镜头存在明显的桶形畸变,若未先进行畸变校正,透视变换后的鸟瞰图边缘会出现弯曲,导致远处赛道线偏离真实位置。正确流程应为:畸变校正 → 透视变换。
- 误区四:每帧重复计算H矩阵。H矩阵只与摄像头安装位置和角度有关,与场景内容无关。应在初始化时计算一次并缓存,避免不必要的计算开销。
- 误区五:忽视像素当量标定。鸟瞰图中的像素距离与实际物理距离的比例必须通过标定获得。若直接假设1像素=1厘米,会导致速度控制和横向偏差计算出现系统性误差。
总结而言,透视变换是无人车视觉巡线中承上启下的关键环节。它将前视图像中难以处理的透视几何问题转化为鸟瞰图中的平面几何问题,使得赛道线检测、曲率计算和横向偏差估计变得简洁而可靠。工程实现时,应重点关注源点选取的准确性、目标点矩形的合理性以及像素当量的标定精度。通过合理的透视变换,无人车能够在高速行驶中稳定识别赛道走向,为后续的速度控制和路径纠偏提供高质量的输入信息。