附件 B:基于 CCD 摄像头的黑线提取算法
基于 CCD 摄像头的黑线提取算法
华文,俞斌,翁华
浙江大学电气工程学院
【摘要】:
从大的层面上来讲,黑线提取分为 AD 转换提取以及通过硬件滤波(电压跳
变比较)提取两种算法,本文具体介绍了两种方法的利与弊,以及我们为什么最
后选择了 AD 采样。
关键字:AD 采样,电压跳变采样,硬件滤波,提取黑线,逐行搜索
附件 B:基于 CCD 摄像头的黑线提取算法
【Abstract】:
On the whole, there are two methods to sample black lines. One is AD converting, and the
other is separate the black line from the white lines using the voltage jumping. In this
paper, we will discuss these two methods not only their advantages but also their
disadvantages.
Keywords: AD sampling, sampling with the voltage jumping,
附件 B:基于 CCD 摄像头的黑线提取算法
一、基于 AD 采样的算法:
基于 AD 的黑线提取算法能够反映图像上的每个点的黑白程度,提取出来的
黑线准确度比较高,但是后续的黑线提取算法比较复杂。基于电压跳变比较方法
软件黑线提取非常简单,但是硬件调试比较困难,而且不能反映每个点的真实黑
白程度。对赛道环境要求很高,易受干扰。
基于 AD 的黑道提取有以下几种方法:
1) 找出每一行的黑线的左右边界点,把中间点作为道路;
2) 利用若干行相加,取最黑点;
3) 找出每行的最黑点,把它作为道路。
第一种做法: 找出每一行的黑线的左右边界点,把中间点作为道路.
图 1 斜看十字交叉道示意图
它是最容易想到的方法,在无交叉道以及摄像头的黑白 AD 值分明的情况下,
它可以达到非常理想的效果.但是若出现了斜看交叉道或者黑白 AD 不是很分明
的情况下,该方法的滤波显得十分复杂.在实际中由于摄像头对于远处的黑线不
是很敏感,这使得黑点的阈值很难以确定,选大了会使远方道路提取出错,选小了
会丢失远方的道路信息.也许采用动态阈值是一个好方法,但是它也不是十分管
用.在实验中我们发现黑点的阈值不是随着距离的变化成线性变化的,它的变化
多少带有点突变的味道,因此很难确定黑点阈值的变化规律,自然动态阈值也很
难设定.斜看十字道会带来更大的麻烦,由于在实际的控制中很难做到每次都严
格地贴线走,因此小车在从弯道出来的时候若弯道前方有个十字道,很容易造成
斜看的情况发生.这时从 AD 采集的图像上看来十字交叉道会像一个分叉的树枝
一样从前方道路上出来,更糟糕的情况是在前方正确道路消失的地方恰好被斜的
十字道路的一边给补上了.若采用这种方法,则很容易误将道路确定到十字叉的
一边上,使得小车的转向错误.为了滤除这种情况,我们根据它的特点采用了很多
的滤波方法.
首先,在前方道路与十字叉的交界点,黑点的个数会突然增加很多.在一般情
况下,随着距离的增加黑点的个数会慢慢减少,不会出现突然增多的情况.因此我
附件 B:基于 CCD 摄像头的黑线提取算法
们可以用上一行的黑点数,估计出下一行的黑点数,如果超出了我们的估计值,我
们就认为它是不合理的.
其次可以根据赛道不突变的原则,来滤除杂点.我们可以根据前面两行的变化
情况预测出下一行的赛道变化范围,利用它来滤除杂点.但是在实际的应用中下
一行的变化范围预测总是不是很理想.因此当赛车经过 90 度弯时,赛道的变化在
小车看来变化是十分巨大的几乎和斜看十字交叉道没有多大的区别.有时会将
90 度弯滤除,造成小车直接冲出跑道.
最后,我们还可以通过分别从左至右与从右至左的方法来所搜赛道的左右边界
点,若发现两者不一致,则可以采取取变化较小的点作为赛道来处理.
加了以上的滤波以后真个搜索赛道程序会显得十分复杂,而且也不是十分可靠.
图 2 三行相加提取黑线示意图
第二种做法: 利用若干行相加,取最黑点
这种做法是我们上届的学长提出来的算法.但是我利用起来不是很可靠.它的
头点始终采不稳定.它的三行相加的理由是若中间一行右黑点丢失,它可以利用
自己设定的阈值把它找回,如三行相加的黑点阈值可以定义为 1 个白点与 2 个黑
点的和.带有些中值滤波的味道. 但是,由于远处的黑白不是很清楚,本来黑白的
阈值就难以设定,三行相加的阈值就更难设定.而且在弯道上由于远方的点本来
就少,大约只有一两个黑点而且又不在同一列上,很容易将这些点丢失,导致头部
的点不稳定.为了尽可能地将远方的黑线提取出来,从软件上将唯一的方法就是
增大阈值,比如将三行相加的阈值设置为一黑二白相加,但是问题是远方的黑白
不是很明显,白点比较黑,黑点比较白,这种阈值的选取很容易造成把远方的那些
比较黑的白点也一并归入黑线之中,这使得小车的转向发生混乱.
附件 B:基于 CCD 摄像头的黑线提取算法
图 3 逐行找黑点
第三种做法: 找出每行的最黑点,把它作为道路
由于每行搜索的是最黑点,因此可以将黑点的阈值稍稍扩大一点,即使远方
的黑白不清,由于找的是最黑点因此还是可以提取出真确的黑线的.它的主要问
题是,不一定每行都有符合要求的点,会造成一行丢失而失去后面的黑点.解决的
方法是当发现一行丢失以后,不立即退出搜索,而是置一个丢失计数器,只有当丢
失计数器的值连续累加到一定的阈值后才退出.当每次搜索到一行的黑线后看看
丢失计数器是否为非零.若不是,则说明前面没有丢失行.若是,则说明前面有几
行丢失了.我们可以根据这一行与上以有效行对中间的丢失行对中间的丢失行做
一个线性化处理.然后清零丢失计数器.有了丢失计数器,我们可以对赛道的提取
条件加以严格的限制,而不必担心黑线的漏检.比如我们可以严格限制黑线的宽
度,这样我们可以很容易滤除看到大块的黑斑带来的干扰;对于上述的斜看十字
交叉线的问题我们只要根据上一行的黑线严格限制下一行黑线出现范围便可轻
松滤除.当然在发现丢失行以后对于下一行的搜索必需加大黑线搜索的范围,允
许的连续丢失行越多则再次找回的黑线的可信度也就越低,在实际的提取过程中
必须把握好这一阈值,使得即可以顺利找到前方的道路,又不至于误提取黑线.实
际证明这种方法实现简单,可靠性也最高,黑线提取十分稳定.
二、硬件滤波(电压跳变比较):
附件 B:基于 CCD 摄像头的黑线提取算法
图 4 摄像头的视频输出信号
从摄像头的视频输出信号,我们可以看出在黑线与白线之间有一个明显的电压
跳变过程,我们可以利用这一特点来作为黑线的提取标志.利用合理的硬件电路
我们变可以实现在电压跳变以前输出逻辑 1,在电压跳变后输出逻辑 0.这样单片
机要做的就是不停地读取引脚的电平状态.由于不需要 AD 转化,这使得单片机在
每个视频的行中断中读取比 AD 多得多的点,黑点的个数自然也很多.在提取黑线
是软件要做的就是区分 0 与 1 而已,实现起来非常方便.下面是一幅由这种方法提
取出的图像与 AD 采样图像的对比.
图 5 AD 采样图
附件 B:基于 CCD 摄像头的黑线提取算法
可以看到它的黑线非常明显,效果很好.
图 6 硬件采样图
但是这种方法也存在着它的很多局限性:
首先,它对环境的要求很苛刻,不能有缝,不能有反光.由于缝的颜色明显易
于周围的颜色,因此在图像上它就表现为一条黑线.其次由于反光的作用使得反
光区域光线异常强烈.反光区在图像上也是一片黑,使得白变黑.
其次,它对横向的分辨能力很弱.使得它对起始道的区分非常困难.比如起始
道在图像上往往会把中间的黑道变成白道,使得起始道的辨别以及黑线的提取困
难.
最后,对于十字交叉道,由于一行全是黑线,电压无跳变,因此在图像上它是
一条白线,使得赛道出现断点.出现黑变白.更糟糕的情况是稍微斜看十字叉时,
它会出现起始道的特征.使得赛车乱停机.
上述的黑变白以及白变黑的出现,很大程度上抵消了它所带来的方便性,软
件必须对于采到的黑线加以认真判别它是否是真的黑线,这就涉及到许多方面的
滤波.再则,由于单片机读取的仅仅是 0-1 信号,丢失了每个点的之间细微的黑白
程度,这给滤波也带来极大的难处.为了正确提取黑线它涉及到本文所提到过的
所有滤波方式,包括线宽设置,黑线的连续性等等.
但是它带来的最大困难还是起始道的判别问题.起始道的干扰不仅来自十字
交叉线,而且还来自一般赛道,因为很有可能在赛道的两侧由于光线反射的不均
衡导致电压的跳变,使得在黑线的旁边隔着一段白斑出现几段的黑线,很容易误
认起始道,最终导致起始道根本无法识别.
基于以上的分析,最后我们还是选用了 AD 的第三种方法,它简单,实用,效果
很理想.
它的流程图以及程序代码如下:
附件 B:基于 CCD 摄像头的黑线提取算法
图 7 流程图
找黑线代码:
char FindCenter(void)//图像存放于 Img[ROW][COLUMN]的二维数组中
{
int count,i,j,p,q;
int min_index;
int min;
int tmp;
int lose_flag;//丢失计数器