基于CCD摄像头的黑线提取算法
第三种做法: 找出每行的最黑点,把它作为道路。
本文引用地址:http://www.amcfsurvey.com/article/91257.htm由于每行搜索的是最黑点,因此可以将黑点的阈值稍稍扩大一点,即使远方的黑白不清,由于找的是最黑点因此还是可以提取出真确的黑线的.它的主要问题是,不一定每行都有符合要求的点,会造成一行丢失而失去后面的黑点.解决的方法是当发现一行丢失以后,不立即退出搜索,而是置一个丢失计数器,只有当丢失计数器的值连续累加到一定的阈值后才退出.当每次搜索到一行的黑线后看看丢失计数器是否为非零.若不是,则说明前面没有丢失行.若是,则说明前面有几行丢失了.我们可以根据这一行与上以有效行对中间的丢失行对中间的丢失行做一个线性化处理.然后清零丢失计数器.有了丢失计数器,我们可以对赛道的提取条件加以严格的限制,而不必担心黑线的漏检.比如我们可以严格限制黑线的宽度,这样我们可以很容易滤除看到大块的黑斑带来的干扰;对于上述的斜看十字交叉线的问题我们只要根据上一行的黑线严格限制下一行黑线出现范围便可轻松滤除.当然在发现丢失行以后对于下一行的搜索必需加大黑线搜索的范围,允许的连续丢失行越多则再次找回的黑线的可信度也就越低,在实际的提取过程中必须把握好这一阈值,使得即可以顺利找到前方的道路,又不至于误提取黑线.实际证明这种方法实现简单,可靠性也最高,黑线提取十分稳定.
硬件滤波(电压跳变比较)
图4摄像头的视频输出信号
从摄像头的视频输出信号,我们可以看出在黑线与白线之间有一个明显的电压跳变过程,我们可以利用这一特点来作为黑线的提取标志.利用合理的硬件电路我们变可以实现在电压跳变以前输出逻辑1,在电压跳变后输出逻辑0.这样单片机要做的就是不停地读取引脚的电平状态.由于不需要AD转化,这使得单片机在每个视频的行中断中读取比AD多得多的点,黑点的个数自然也很多.在提取黑线是软件要做的就是区分0与1而已,实现起来非常方便.下面是一幅由这种方法提取出的图像与AD采样图像的对比.
图5 AD采样图
图6 硬件采样图
可以看到它的黑线非常明显,效果很好。
但是这种方法也存在着它的很多局限性:
首先,它对环境的要求很苛刻,不能有缝,不能有反光.由于缝的颜色明显易于周围的颜色,因此在图像上它就表现为一条黑线。其次由于反光的作用使得反光区域光线异常强烈。反光区在图像上也是一片黑,使得白变黑。
其次,它对横向的分辨能力很弱。使得它对起始道的区分非常困难。比如起始道在图像上往往会把中间的黑道变成白道,使得起始道的辨别以及黑线的提取困难。
最后,对于十字交叉道,由于一行全是黑线,电压无跳变,因此在图像上它是一条白线,使得赛道出现断点.出现黑变白.更糟糕的情况是稍微斜看十字叉时,它会出现起始道的特征.使得赛车乱停机.
上述的黑变白以及白变黑的出现,很大程度上抵消了它所带来的方便性,软件必须对于采到的黑线加以认真判别它是否是真的黑线,这就涉及到许多方面的滤波.再则,由于单片机读取的仅仅是0-1信号,丢失了每个点的之间细微的黑白程度,这给滤波也带来极大的难处.为了正确提取黑线它涉及到本文所提到过的所有滤波方式,包括线宽设置,黑线的连续性等等.
但是它带来的最大困难还是起始道的判别问题.起始道的干扰不仅来自十字交叉线,而且还来自一般赛道,因为很有可能在赛道的两侧由于光线反射的不均衡导致电压的跳变,使得在黑线的旁边隔着一段白斑出现几段的黑线,很容易误认起始道,最终导致起始道根本无法识别.
基于以上的分析,最后我们还是选用了AD的第三种方法,它简单,实用,效果很理想.
它的流程图以及程序代码如下:
图7 流程图
参考文献:
[1] 卓晴,黄开胜,邵贝贝等. 学做智能车—挑战“飞思卡尔”杯. 北京航空航天大学出版社. 2007
[2] 第二届全国大学生“飞思卡尔”杯智能汽车竞赛浙江大学捷豹II队技术文档
[3] 第二届全国大学生“飞思卡尔”杯智能汽车竞赛上海交大speedstar队技术文档
摄像头相关文章:摄像头原理
评论