前言

        这次电赛是我第一次参加省级以上的比赛,作为一名即将大三的学生来说有些晚了,况且由于学业紧张,openmv只学习了短短一个多星期左右就赶鸭子上架地上场比赛了。因此这篇文章也来记录一下我在比赛过程中识别方面的思路,控制方面这次比赛只写了一部分代码,可能过段时间整理完后也会写一篇心得体会。

一、识别整体思路

        此次C题整体识别的任务主要集中在巡线和分辨停车线,岔道口等等,一开始我巡线采用比赛前就写好并测试过的二值化代码,但后来发现二值化的确可以非常准确的识别,但是这个函数的返回值太少了,不像find_blob可以返回色块面积,甚至是密度等等参数,因而后面改为用识别色块的方法巡线,我在一开始使用了灰度进行判断,刚开始的想法只是灰度比RGB的帧率高一些,避免脱机时引起问题,后面发现其他组同学用的RGB会在阴影比较大的时候产生很多误识别问题,灰度反而能稍微避免一些这个问题,也算是误打误撞了。主要思路是摄像头判断黑线色块的中心点坐标,比如说QQVGA的分辨率是160*120,那么黑线的中点就应该在80的位置(前提是摄像头位置正确且x,y轴正确)这时候将当前识别到的中心点x坐标数据发送给单片机,由单片机PID进行控制(PID的desired就是80,算出error即可)。这样就完成了基本的巡线。

sensor.reset()                        ##初始化
sensor.set_pixformat(sensor.GRAYSCALE)##选择灰度模式
sensor.set_framesize(sensor.QQVGA)    ##选择分辨率(分辨率越高帧率可能越低)

二、识别停车线

为了保险起见,我在识别停车线时采用了两个条件同时满足的办法来防止误识别,采用面积和中心点坐标判断。停车线作为一个面积比正常线大的多的色块是可以很轻松地识别出来的,而在摄像头识别到停车线时,其中心点坐标依旧保持基本不变,这样就防止了碰到不规则阴影或者岔路口面积发生改变时误停车的情况。

if((largest_blob.cy() >= 50 and largest_blob.cy() <= 70) and Area >= 12000):  ##判断停车线(两重判断)
    data = bytearray([0xAA, largest_blob.cy(), 1, 0XBB]) 
    uart.write(data)

       我的代码部分 ps:我的摄像头架的方向不一样,根据方向,我的摄像头上面的y轴是实际方向的x轴,因此返回的是y轴坐标。这个摄像头问题确实恶心了我四天,但一开始搭车的时候已经架好了就不麻烦队友了。。。

三、识别内外圈 

        我的思路可能稍微麻烦一些,通过单片机判断这圈是内圈还是外圈,并发送数据给openmv,由此我根据数据选择外圈的函数还是内圈的函数。

       在判断内外圈分界线方面我一样用了面积和中心点坐标的办法,在我测试过程中,停车线面积和分界线差别还是很大的,因此这个就可以很准确的判断出来了。但当识别出现意外时还是需要一个保底的办法。也就是中心点坐标判断。当识别到分界线时,由于有一条向内的黑线,此时得到的黑色色块的中心点坐标会发生偏移,偏移到内圈的方向去一些,因此可以根据这个来区分停车线。(极端情况:两个面积大小差不多时这个办法很有用)

     当单片机发送此圈为内圈的信息且内外圈判断完成后,我使用了分割roi来使摄像头只能识别到内圈的黑线。这个就需要根据赛道进行判断,其实roi如果带上一些外圈的黑线也不要紧,我在find_blob函数中将比较小的黑色色块过滤掉了,就不会产生一些意外的小色块出现导致识别错误的情况。

 if(Area>=8000 and largest_blob.cy()<=50):            ##内外圈岔道口判断
              blobs2 = img.find_blobs(GRAYSCALE_THRESHOLD,roi=(53,0,107,65),merge=True)
              if blobs2:
               largest_blob = max(blobs2, key=lambda b: b.pixels())
               data = bytearray([0xAA, largest_blob.cy(),0,0XBB])
               uart.write(data)

                                                      识别岔道 

ROIS = [
        (0, 0, 160, 30, 0.7),
        (0, 30, 160, 60, 0.3),
        (0, 90, 160, 30, 0.1)
       ]                              ##选择ROI感兴趣区,将视野进行分割

                                                     我的roi感兴趣区 


总结

        这次电赛是我第一次参加这种规模比较大的比赛,可能思路和代码有很多问题,希望大家多多包涵。但是在封箱前的测试中我的识别是没有什么问题的(虽然线下展示的时候因为光线的问题还是识别出了问题。。。最后只拿了一个省二,在这个问题上我肯定有很大的责任)之后的比赛和科研中我也会继续学习、记录,希望未来我的专业技术能够有所增长。

完全代码链接:https://download.csdn.net/download/qzh020312/86394697

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐