3、车道线检测基础:摄像头成像原理、车道线特征提取及Hough变换与曲线拟合

各位同学,咱们今天聊聊车道线检测的底层逻辑。说实话,很多做ADAS的工程师,上来就调模型、跑算法,结果到了实车上,车道线一断、光照一变,系统就懵了。为什么?因为基础没打牢。我当年刚入行时也吃过这个亏,后来老老实实把摄像头成像原理和特征提取啃了一遍,才真正理解了车道保持的“手感”。

3.1 摄像头成像原理:从三维世界到二维图像

摄像头怎么“看”到车道线的?说白了,就是小孔成像的升级版。光线通过镜头,打在CMOS传感器上,每个像素记录下光的强度。但这里有个关键问题——透视效应

你想想看,一条笔直的车道,在图像里为什么是两条向远处汇聚的线?因为近处的物体在图像上占的像素多,远处的占得少。这就是透视投影。我习惯用一个简单的公式来理解:

u = fx * (X / Z) + cx
v = fy * (Y / Z) + cy

其中(u,v)是图像坐标,(X,Y,Z)是世界坐标。fx、fy是焦距参数,cx、cy是主点偏移。这个公式告诉我们:距离Z越大,物体在图像上的位置越靠近消失点

核心要点:车道线检测的难点,很大程度上源于透视效应带来的尺度变化。近处的车道线宽而清晰,远处的窄而模糊。标定时必须考虑这个特性。

我在项目中遇到过一个问题:某款摄像头安装高度偏低,导致近处车道线畸变严重。后来我调整了标定板的位置,重新做了内参标定,才把这个问题解决。嗯,这里要注意——摄像头安装位置直接影响车道线在图像中的分布,标定前一定要确认好。

3.2 车道线特征提取:颜色、边缘与纹理

图像拿到了,怎么把车道线“揪”出来?我们需要提取特征。常用的特征有三种:颜色、边缘、纹理。我一般按这个顺序来。

3.2.1 颜色特征提取

车道线通常是白色或黄色。白色在RGB空间里三个通道值接近,黄色则是R和G高、B低。但RGB空间受光照影响太大——同样的黄色,晴天和阴天看起来完全不一样。

我建议用HSV或HLS颜色空间。这两个空间把颜色(Hue)、饱和度(Saturation)和亮度(Lightness/Value)分开,对光照变化更鲁棒。举个例子:

// 提取白色车道线(HLS空间)
if (L > 200 && S < 30) {
    // 这是白色像素
}

// 提取黄色车道线
if (H > 20 && H < 40 && S > 50 && L > 100) {
    // 这是黄色像素
}

我曾经在一条老旧的柏油路上测试,路面颜色偏灰白,白色车道线几乎融进去了。后来我把亮度阈值从200降到180,同时增加了对比度拉伸,才勉强提取出来。说白了,阈值不是死的,要根据实际场景微调

3.2.2 边缘特征提取

颜色提取不够用怎么办?加边缘检测。车道线和路面之间通常有明显的亮度跳变,这就是边缘。

我常用的算子有两个:

  • Sobel算子:计算水平和垂直方向的梯度。对车道线这种近似垂直的边缘,我一般用垂直方向的Sobel。
  • Canny边缘检测:先高斯滤波去噪,再计算梯度幅值和方向,最后用双阈值筛选。效果比Sobel好,但计算量大一些。

个人经验:在高速场景下,车道线边缘比较清晰,用Sobel就够了。但在城市道路,路面有各种标记、阴影,我建议用Canny,配合形态学操作(膨胀、腐蚀)把断开的边缘连起来。

3.2.3 纹理特征提取

颜色和边缘都搞不定的时候,试试纹理。车道线表面比路面更光滑,纹理更均匀。我常用局部二值模式(LBP)Gabor滤波器来提取纹理特征。

不过说实话,纹理特征在车道线检测中用得不多,因为计算量太大。我只有在极端场景(比如雪天、雨天)才会启用。平时用颜色+边缘就够用了。

3.3 Hough变换与曲线拟合

特征提取完了,得到一堆像素点。怎么把这些点变成一条线?这就是Hough变换和曲线拟合的活儿了。

3.3.1 Hough变换:从像素点到直线

Hough变换的原理很简单:把图像空间中的每个点,映射到参数空间中的一条曲线。如果多个点对应的曲线交于一点,那这些点就在同一条直线上。

参数空间通常用极坐标表示:

ρ = x * cos(θ) + y * sin(θ)

其中ρ是原点到直线的距离,θ是直线的角度。我习惯把θ范围设为-90°到90°,ρ范围根据图像尺寸来定。

避坑指南:我曾经在一条弯道上用Hough变换检测车道线,结果直线拟合出来的线完全不对。为什么?因为Hough变换只能检测直线,弯道必须用曲线拟合。所以,Hough变换只适用于直道或近似直道的场景

3.3.2 曲线拟合:从直线到弯道

弯道怎么办?用曲线拟合。我常用的方法有两种:

  1. 多项式拟合:用二次或三次多项式拟合车道线点。公式很简单:
y = a * x^2 + b * x + c

其中x是图像的行坐标(纵向),y是列坐标(横向)。a控制曲率,b控制斜率,c控制偏移。

  1. 样条曲线拟合:用分段多项式拟合,适合曲率变化大的弯道。但计算量比多项式大。

我个人的习惯是:高速场景用二次多项式,城市道路用三次多项式或样条。为什么?高速弯道曲率变化小,二次就够了;城市道路弯道急,需要更高阶的拟合。

3.3.3 实战中的取舍

在实际项目中,我不会只用一种方法。我通常的做法是:

  • 先用Hough变换检测直线段,判断车道是直道还是弯道
  • 如果是直道,直接用Hough变换的结果
  • 如果是弯道,用多项式拟合,同时用Hough变换的结果作为初始值

这样既保证了直道的实时性,又兼顾了弯道的准确性。嗯,这里要注意——Hough变换的参数(ρ和θ的分辨率)直接影响检测精度。分辨率太高,计算慢;太低,漏检。我一般设ρ分辨率为1像素,θ分辨率为1°。

总结一下:车道线检测的基础,就是理解摄像头怎么成像、怎么提取特征、怎么把特征点拟合成线。这三步走扎实了,后面的车道保持控制策略才有根基。我见过太多人跳过基础直接调参,结果出了问题都不知道从哪查起。别急,慢慢来。

下一章,咱们聊聊车道保持的控制策略——怎么根据检测到的车道线,算出方向盘该打多少。到时候我会分享一个我踩过的坑,关于PID参数整定的,保证让你少走弯路。