智能车赛道图像识别
大三时学校有个 Freescale 智能车比赛,比赛内容是组装赛车部件(摄像头、电机、车身、电路板、电源等)并编写赛车控制程序,使赛车自行沿赛道行驶。班上同学参加后组装好硬件后不会写软件,我便协助他们编写程序。
整个赛车控制程序中最难的是赛道识别(机器学习啊,呵呵),这里面的核心问题是:如何根据摄像头所采集数据来识别前方赛道的路线?
比赛赛道有多种关键路段,为:直道、U 型弯道、环型弯道、直角弯道、S 型弯道和十字路口。前期我们将赛车上的摄像头通过几米长的电线连接到赛道旁边的电视机上,手动推动赛车沿赛道行驶并观察摄像头画面,得到以上关键路段的视频图像。如图(由于当时没有留下影像资料,现在只好手画示意图):
最开始队友使用从老师那儿弄来的一份上届比赛使用的程序,以作参考(!)。它的主要思想是:扫描数据数组(由黑白模拟摄像头及模数转换器生成的画面帧的 2 维数组,数组单元值为 0 表示像素白,1 为黑)的一行,找到第一个和最后一个值为 0(赛道内为白色,赛道外为黑色)的单元,相当于此像素行上赛道的左右边界;两者取平均值,作为此行赛道的中间点;依此由上至下逐行扫描数组,便可得到一个 1 维数组,值为该帧画面中赛道由远及近的各段中点值,相当于赛道中线的离散采样分布;最终结合数组长度(作为画面中赛道长度)求出前方赛道中线方向与赛车视前方偏移角度的近似值,并依此求出赛车需调整的前轮角度、后轮速度等量值。如下图:
经过实际使用发现这种方法存在很多问题。比如,赛道边界超出摄像头视野时,此方法会将视频画面边界误认为赛道边界,导致结果偏差;视频画面中的噪点会严重影响此方法对赛道边界的判断,设想使用此方法寻找赛道边界点,在扫描到实际赛道边界之前遇到一个噪点(因光线原因导致摄像头将赛道外黑色区域成像为白色的画面区域),则该区域会被误认为赛道,导致结果偏差。
在和队友一起去吃中饭的路上,我们讨论现有的方法存在这么多问题,该如何修改才能排除这些问题?有没有办法不让这些问题干扰程序对赛道的识别呢?现有方法通过横向检测画面来寻找赛道边界,以求得赛车与赛道偏移角度,可不可以不这么干呢?
我突然想到:如果我们竖向检测会怎样呢?