本博客使用的图像是188*120的大津法二值化图像。摄像头安装高度为25cm(离地),前瞻长度约1m。

本文简单讲解一下斑马线和车库的识别方案。相比霍尔元件识别,用摄像头识别斑马线具有前瞻长和稳定性更好的优势,可以给停车入库留出更充足的时间。

斑马线的图像特征

在编写程序时,以下各行条件是层层递进进行判定的,一旦有一个条件判定不满足就退出此次判定。

预识别条件:

  1. 某一横行内,黑白交界点的个数很多,多于某一个阈值;
  2. 在具有较多黑白交界点的行内,这些黑白交界点大致均匀分布。

符合以上两点条件的行,称为斑马线特征行。

决定识别条件:

视野内有很多斑马线特征行。

因为斑马线比较简单,但是画起来挺难的,示意图在这里就就不放了。车库的安装位置在斑马线旁边,识别到了斑马线就等于识别到了车库。车库左右的判定只需要加入一个左右侧边线丢线判定即可,丢线多的一侧即为车库所在侧。

识别程序编写思路

斑马线的特征其实是很明显的,误判率也相对较低,使用这个识别思路可以很快很准地认出斑马线来,而且几乎不存在误判,毕竟赛道上除了斑马线之外也没有那么多的黑白交界段。

  1. 需要提前设置的一些阈值
  • 判定横向上单像素行斑马线特征黑白跳变阈值,由于边线的存在,此值必须大于2
  • 具有斑马线特征像素行数阈值,只有一帧图像中有斑马线特征的行数大于此阈值才认为认到了斑马线,调节此值可以调节斑马线判定前瞻
  • 斑马线横向均匀黑白段数目判定最小值/最大值,只有判定到地均匀黑白交界线段数量在这两个值的范围内才算该行为斑马线特征行,设置这个值是为了避免在赛道的其他地方误判
  • 斑马线均匀检测黑白交界点容差阈值,此值指定了同一行像素内横向上的黑、白线段宽度之间最大的差值,在此差值内认为是均匀的黑白交界线段
  1. 思路
    (1)扫描单行像素,预判断斑马线:寻找该行像素中的黑白跳变点,记录黑白交界点的个数和它们的横坐标,用于后续判定;
    (2)逐行判定当黑白跳变在某一行中是否大于一定次数,若是则预判定该行具有斑马线特征,进入均匀性判断;
    (3)判断横向上该行的均匀黑白交界段数是否在指定范围内,若是则判定该行具有斑马线特征,行特征计数器+1;
    (4)若斑马线特征行数计数器大于设定阈值,则判定该帧存在斑马线。

补线程序编写思路

其实斑马线和车库段我并没有进行严格意义上的补线,因为这次的省赛赛道,在出了三岔到斑马线的那个弯道内,车模是斜着面对斑马线的,斑马线对循迹的影响很难消除,速度较快的时候,即使在其他地方都很稳定,在这一段内车身的抖动也是非常严重的。在省赛赛道图出来之前,我就完成了斑马线的识别程序编写,当时我们是把斑马线放在长直道上的,我使用的是在识别到斑马线后,对其进行图像上的抹除的方法,尽管抹除得并不是很彻底,但还是可以很大程度上降低斑马线对正常循迹造成的影响,而且在车库不进行补线的情况下,依旧可以实现循迹,我也就没写车库补线了。在改成省赛赛道后,由于今年线上赛道的弯曲实在是太多了,车子几乎一直处于打弯的状态,虽然我的这套斑马线识别程序依旧可以正常识别斑马线,但是由于是斜对着斑马线的,斑马线在图像中几乎不可干净地抹除,在过斑马线和车库的时候,车子抖动得非常厉害。因为当时我还差环岛没写(环岛状态又多又难,按照传统的找尖思路确实难做,我当时一直受制于传统思路去找尖,即使上了电磁+图像的判定,依旧会出现速度快了认不到环岛的情况),但是车基本上可以勉强通过斑马线区域,进度又比较赶,这个问题我也一直留着没有处理(它在剧烈抖动的情况下依旧可以完成循迹,这一点让我很惊讶)。这也是我程序的一个缺陷吧。但是说到补线程序编写思路,其实正常情况下应该是对车库部分进行处理的,下面说一下我的思路。这个过程分两步:

  1. 斑马线的抹除
    斑马线的抹除其实很简单,只需要在二值化图像上,在之前认斑马线的那些特征行中,把从第一个黑白交界点开始,到该行最后一个黑白交界点为止的像素均置为白色即可。这种方法可能抹除得并不是那么彻底,但是我实测在大多数情况下抹除效果不错,而且不会像直接就是抹一个大白方块上去那样,车子但凡偏了就会抹到正常的赛道边界上去,导致循迹异常。
  2. 车库补线

(1)传统补线法:车库在图像中其实就类似于半边十字,可以直接套用十字找上下L角点的方式找到L角点,然后直接连接上下角点即可完成补线,在视野内仅剩上L角点时采用最小二乘法补线即可。

(2)单边循线法:参照三岔的单边巡线方式,在检测到斑马线后自动切换为单边循线,在检测不到斑马线后切换回正常巡线即可。