基于摄像头的AD黑线提取算法
图2 三行相加提取黑线示意图
加了以上的滤波以后真个搜索赛道程序会显得十分复杂,而且也不是十分可靠。
第二种做法: 利用若干行相加,取最黑点。
这种做法是我们上届的学长提出来的算法。但是我利用起来不是很可靠。它的头点始终采不稳定。它的三行相加的理由是若中间一行右黑点丢失,它可以利用自己设定的阈值把它找回,如三行相加的黑点阈值可以定义为1个白点与2个黑点的和。带有些中值滤波的味道。 但是,由于远处的黑白不是很清楚,本来黑白的阈值就难以设定,三行相加的阈值就更难设定。而且在弯道上由于远方的点本来就少,大约只有一两个黑点而且又不在同一列上,很容易将这些点丢失,导致头部的点不稳定。为了尽可能地将远方的黑线提取出来,从软件上将唯一的方法就是增大阈值,比如将三行相加的阈值设置为一黑二白相加,但是问题是远方的黑白不是很明显,白点比较黑,黑点比较白,这种阈值的选取很容易造成把远方的那些比较黑的白点也一并归入黑线之中,这使得小车的转向发生混乱。
图3 逐行找黑点
第三种做法: 找出每行的最黑点,把它作为道路。
由于每行搜索的是最黑点,因此可以将黑点的阈值稍稍扩大一点,即使远方的黑白不清,由于找的是最黑点因此还是可以提取出真确的黑线的。它的主要问题是,不一定每行都有符合要求的点,会造成一行丢失而失去后面的黑点。解决的方法是当发现一行丢失以后,不立即退出搜索,而是置一个丢失计数器,只有当丢失计数器的值连续累加到一定的阈值后才退出。当每次搜索到一行的黑线后看看丢失计数器是否为非零。若不是,则说明前面没有丢失行。若是,则说明前面有几行丢失了。我们可以根据这一行与上以有效行对中间的丢失行对中间的丢失行做一个线性化处理。然后清零丢失计数器。有了丢失计数器,我们可以对赛道的提取条件加以严格的限制,而不必担心黑线的漏检。比如我们可以严格限制黑线的宽度,这样我们可以很容易滤除看到大块的黑斑带来的干扰;对于上述的斜看十字交叉线的问题我们只要根据上一行的黑线严格限制下一行黑线出现范围便可轻松滤除。当然在发现丢失行以后对于下一行的搜索必需加大黑线搜索的范围,允许的连续丢失行越多则再次找回的黑线的可信度也就越低,在实际的提取过程中必须把握好这一阈值,使得即可以顺利找到前方的道路,又不至于误提取黑线。实际证明这种方法实现简单,可靠性也最高,黑线提取十分稳定。
硬件滤波(电压跳变比较)
图4 摄像头的视频输出信号
从摄像头的视频输出信号,我们可以看出在黑线与白线之间有一个明显的电压跳变过程,我们可以利用这一特点来作为黑线的提取标志。利用合理的硬件电路我们变可以实现在电压跳变以前输出逻辑1,在电压跳变后输出逻辑0.这样单片机要做的就是不停地读取引脚的电平状态。由于不需要AD转化,这使得单片机在每个视频的行中断中读取比AD多得多的点,黑点的个数自然也很多。在提取黑线是软件要做的就是区分0与1而已,实现起来非常方便。下面是一幅由这种
评论