再谈总钻风之算法简析—By“逐飞科技” 智能车发展到第十四届,不再按传感器分类组别,光电组,电磁组,线性CCD组,相继成为了历史,摄像头逐渐发展成了最主流的传感器,很荣幸,总钻风经过几年大家的认识,也成为了智能车竞赛中可能使用最广泛的主流摄像头,当然现在仍然有部分参赛选手选择了更为简单的硬件二值化摄像头,也有人甚至开始想用彩色摄像头,但是大家的选择基本还是符合正态分布的,选择了更适合目前比赛需求的总钻风摄像头。为什么说更适合目前的比赛需求相信也不用过多的分析,因为总的来说今年应该是有史以来最难的一届了吧,比如“阳光算法”,每年都有人吐槽主办方光线不好的问题,导致比赛失利,今年组委会直接将光线问题交给选手来解决,场地再也不要求遮光了,那么很多车友们在摄像头的选择上就开始出现了担忧,到底是用灰度摄像头(比如总钻风)还是用硬件二值化摄像头呢。我们推荐的当然是总钻风摄像头,推荐使用总钻风摄像头的原因并不是说总钻风能自动处理反光,而是由于灰度摄像头信息更多,当出现反光的时候可以通过程序去判断是否为反光,比如正常的情况没有反光的话,我们可以调节曝光时间控制图像最大亮度都在150以下,如果出现反光可能反光处就会特别的亮,我们通过判断像素值的大小就可以得到一些有用信息来做判断,反观二值化摄像头,像素点的值就只有0和1,不是黑就是白根本就没有办法去通过像素的值判断是否可能存在反光,当然这仅仅是举一个小小的例子,反光还有可能与赛道颜色值比较接近,需要通过其他办法来继续抑制。比如当某一个边界出现反光的时候,我们可以根据另外一个边界来进行判断反光问题并补线,方法可能很多,更多的探索就需要大家自己多加尝试,最近也有一个小伙伴和我说他的光线问题大概解决了,以下是聊天截图。在这里非常感谢车友给我们反馈信息。 上面这位车友也说到了一个关键点,并不是摄像头自己能抑制反光,也不是用的什么高级算法,仅仅是因为灰度摄像头数据信息多,直接处理灰度去判断反光,然后对边界进行补线,从而提高抗反光的能力。 但是由于很多学校传承的原因,可能摄像头虽然使用了灰度摄像头但是还是将图像二值化了之后再进行边界提取的,虽然比以前的那种硬件二值化摄像头在动态性能上要好(因为总钻风是全局快门,相较于卷帘快门在运动时图像更加完整),可是这样的用法就没有将灰度的优点发挥出来,而且很多车友都是用的全局二值化方案,也就是一个阈值对整幅图进行二值化,如果还是想用二值化方案的话,我这里建议可以尝试下局部二值化,对一幅图像进行分割,定义多个阈值,每一个区域一个阈值,可以提升二值化的效果,但是这并不能去解决反光的问题,不过可以在一定程度上解决光线不均匀的问题。 (PS:对于那种反光非常严重的,人看图像都有点分不清哪里是赛道哪里是背景的只有切换电磁寻迹了,毕竟人都不行了,那么程序估计很难写的出来。)
重点来了:上面也说了,很多小伙伴拿着灰度摄像头完全不知道怎么直接使用灰度,那么本次我们就对视频中逐飞科技的测试样车是如何使用灰度的来做一个简单的讲解。图片及视频如下: 视频1:
视频2:
硬件测试平台配置:新款130°总钻风摄像头+逐飞LPC54606核心板+逐飞1024线迷你编码器+新款IPS液晶屏+母板电源板+逐飞MOS双驱,搭载在C车模上运行。 直接灰度使用的简单算法分享:逐飞科技测试样车采用的方式是将两个像素点的差值除以两个像素的和值(公式为:abs(a-b)*100/(a+b)),其中乘以100仅仅是为了放大数据而已,避免使用浮点计算,提高计算速度。 上表列出了4中情况 情况1:黑点为30,白点为100,我们通过差比和公式计算并放大100倍,得到的结果为53 情况3:白点1为90,白点2为100,我们通过差比和公式计算并放大100倍,得到的结果为5 情况3:黑点1为30,黑点2为35,我们通过差比和公式计算并放大100倍,得到的结果为7 通过对这三种情况进行分析,我们可以看到当选取的两个点,像素值差距较大时计算出来的值比较大,像素值差距较小的时候计算出来的值比较小,那么我们就可以设置一个阈值,当差比和计算出来的值超过这个阈值的时候(这个阈值就需要自己上赛道观察白点与黑点的值,然后再自己计算一下这个黑点与白点的差比和值是多少,然后计算出来的值乘以0.7来作为阈值,也可以根据自己的测试对这个阈值再稍加调试),我们认为找到了一个黑点与一个白点。 情况4:可以看得出来白点与黑点都比较暗,但是通过差比和计算出来的值却还是和正常图像计算出来的值差距不大,这样我们就可以通过使用差比和提高我们的稳定性,不像二值化那样光线稍有变化二值化图像就会跟随着变化。从而稍微提高了对光线的适应能力。 列个表后面说明算法用:
接下来我们在稍微介绍下关于使用差比和进行边界的搜索,假设我们的车模放在了赛道中间,然后打开电源,那么我们从图像最近一行的中点向左右两边进行边界的搜索,上方有一个a到k的表格,假设就是我们摄像头返回来的最近一行的数据,a是最左边k是最右边,
那么我们从e开始往左边进行差比和的计算,比如使用e和d进行差比和计算,由于车模已经放好在赛道上,中间肯定都是白色的,因此计算出来的值必然比较小,自然不会大于我们设置的阈值,那么我们继续往左移动一格进行计算,使用d和c进行计算,直到计算出来的结果大于我们设置的阈值,假设c与b计算之后的值大于了我们设置的阈值,那么我们就可以判断b为黑点,即找到了边界。右边也是同理。 以上是最基本的模型,那么在实际使用的过程中其实会遇到一个问题,由于我们图像是连续的,在赛道的边界从白变为黑存在灰度渐变,比如数据从100 70 55 35这样过度到黑色的,如果我们使用紧邻的两个点进行差比和计算则容易出现找不到边界的问题,因为两个点的差值较小,所以为了避免这个问题我们可以将计算的两个点隔5像素,这样可以使得差值较为明显。比如使用g点与b点进行计算,然后下一次使用f点与a点进行计算。始终保持两点有一定的间距。 总结:我们仅仅是提供了一个简单的方法而已,抛砖引玉,具体在代码编写与调试过程或者更高级的使用方法都要靠自己,还有很多需要完善的地方也是需要大家自己分析然后在加入相应的代码。另外关于搜线的算法,在逐飞科技之前的帖子里也有专门的分析,摄像头选择和总钻风介绍也有专门的帖子,需要了解的可以去多看看。 【思路】线性CCD & 摄像头搜线方案 By“逐飞科技” http://www.znczz.com/forum.php?mod=viewthread&tid=259429&fromuid=15522 (出处: 智能车制作) 最后:对于很多人经常问一个问题,MT9V032与MT9V034的区别,有的伙伴从名字上看,一个数字大一点一个数字小一点,会误以为数字大一点的是不是要好一点呢,就好比iPhoneX比iPhone8好,但其实就这两名字和芯片来说并不是这样,甚至在这里MT9V032的芯片单价比MT9V034单价高出30元RMB左右,这个问题的答案可以多方面查证,关于芯片到底谁好,百度或者查看数据手册,其实可以知道两个芯片唯一的不同点是034有两套配置寄存器而已,其他的两者并没有什么性能上的优缺点。对于平时大家使用来讲就是一样的,这是芯片上的区别。那么经常也有人问友商的摄像头与我们的哪个好,我们只能说别家的我们不是很清楚,我们只知道我们的摄像头很赞,使用起来很简单,容易上手,而且我们的配套例程还算比较完善靠谱,基本买回去可以不用过于理会摄像头部分比较麻烦的底层代码,我们都提供配套的库,基本满足做智能车的需求,可以说帮助大家解决了很多关于底层的很多麻烦事儿,以节省时间、提高效率,留给车友们更多时间研究图像提取算法以及后面的控制算法。 还是得再苦口婆心的啰嗦几句,我们提供库仅仅是为了帮助大家快速上手,但是仍然建议大家有空的时候,自己可以尝试下写一写底层,至少你得明白写底层的过程大概是怎样的。这样有助于学习到更多的东西,毕竟我们参加比赛是为了获取知识而不是获取奖状,好多没获奖或者获奖并不好的牛逼车友相信大家也都知道一些,不以一时成败论英雄,学到知识才是硬道理,做车就那么一两年或者三年,后面等着你证明你自己能力的可是几十年,大学期间打下一个好的基础才最重要,竞赛也就是一个训练你成长的载体而已,能成什么得看你自己!!! 最最后,阳光算法打卡这个梗好像过不去了,卓大挺为难的,都开始送书来封口了,我想说……卓大可以送我一本签名版么?跪求……收件信息可以私聊的,手动偷笑!
逐飞科技智能车技术交流群:“逐飞科技_智能车2部:244861897”
本文由“逐飞科技”编辑整理,大神轻拍,欢迎交流,愿智能车世界更美好!
|