去年参加魔方机器人大赛,今年又一如既往的参加了,期间其实有很多东西没有完全搞懂,在这里我自己给自己温习一下,顺便给大家分享一下自己的所得和感悟,希望能够给你一些帮助。我们队去年的魔方还原时间大概在14s左右,今年应该可以进6s。在我负责的视觉方面,可以做到在180ms内使用四个摄像头完成六个面的采集,并对颜色进行分类;      


                                         


                                                                       第一年14s方案  


                               


                                                                         大致控制流程


                                      


                                                                 我负责部分的算法运行结果


首先是视觉方案:


我们团队使用的视觉方案是使用四个摄像头,具体的款式是fpv摄像头,用bnc线接采集卡,再汇总一个USB接到电脑上;一个摄像头看上面两个面,一个摄像头看下面 两个面;另外两个摄像头每个都看一个面(在这里应该会想到会有手指遮挡到魔方的情况,这个情况我们有两种方案:一种是手指留出的部分不把整个色块遮住,留下大概一半左右用于视觉采集;另外一种是:在采集的时候,有一只手张开,这样这整个魔方未知的部分只有两个色块,这里我们没有证明,但是应该可以得出,很大概率上一种魔方能够求解,另外一种魔方是没有解得,如果两种都有解得话那就多一步机械步骤旋转一下用上下两个摄像头再采集一遍)


以下是我们机器人的大致模型:


                          


摄像头装配完了之后,如何让摄像头找到魔方色块并识别是很大的问题,这里我了解到一般是两种情况,一种是直接通过固定摄像头和魔方的位置,采集固定矩形内的色块的图像分类的;另外一种是我们采用的方案,不固定摄像头的位置,直接在摄像头范围内寻找魔方色块并识别;要论识别稳定性的话第一种肯定优秀一些,应为毕竟是固定的,采集出来的色块很稳定,不存在采集错误的情况;第二种的优秀性体现在不用固定魔方位置,即使有装配误差也能够容忍,而且不用繁杂的寻找位置;两种各有优势,对于识别算法不太强的人来说第一种很方便,但是很不幸的是我一开始就采用的第二种方案,但是还好最后的结果还行;下面我讲一下我的识别算法:


           


1.魔方色块寻找


如何在一副计算机图中寻找到魔方,从几何特征上,无论是一个面还是两个面,在轮廓提取之后每个色块的特征就是都是平行四边形,四个角度上也有特点,相邻边也有限制问题;


我的算法在这里大致分为四部分:1.slobal 算子边缘提取  2.多边形模拟,判断是不是四边形 3.对于四边形轮廓的长宽,相对整个图像的比例,每个角的大致范围,加以限制,去除杂质轮廓,去除明显不是魔方色块的轮廓 4.用聚类算法寻找聚类的点;


前三个算法是非常宽松的条件,应该来说每个魔方色块都能够被筛选入,但是应该还有许多提取出来轮廓和魔方色块轮廓非常像的轮廓,再运用几何特征已经没办法进行区分了


第四步骤算法我采用的是均值漂移(Meanshift)算法,可以注意到的是,无论如何,杂质轮廓都不可能出现在离魔方里面,观察魔方和杂质轮廓的特点可以得出,一般都是聚集在一起的18个或者9个点,然后相对较偏远的地方有几个杂质点,有非常明显的聚集特征,用聚类算法能够找到聚集在一起魔方色块点;


应当注意的是,提取出来得到魔方的轮廓很可能有双边缘,导致 同一个色块有两个轮廓对应,应当剔除;


在边缘提取的时候应当尽量多提取,保留尽可能多的边缘特征,这里只是一个粗筛选


总结:这一套算法下来即使在干扰比较严重的地方依旧表现良好,但是还是有不足的地方(如果杂志点距离魔方特别近困难导致聚类算法得到19个点,多余的点也有明显的几何特征,虽然也可以用算法剔除但是没必要),考虑到摄像头位置相对固定,在截取图像的时候可以主要截取魔方所在的地方作为感兴趣区域,干扰会减少很多。


2.魔方色块的识别


魔方色块的识别有很多方法,分为三种:


1.通过转化到HSV空间通过HSV值的限制判断颜色


优点:简单,原理上H分量与亮度无关,是可以很好的区分颜色


缺点:那些相对很近的比如黄色和红色很容易被误识别,稳定性很差


2.通过RGB或者HSV空间用聚类算法识别


如果把RGB空间各个色块的点放到Matlab上分析不难看出,其实颜色与颜色之间还是有明显的区分的,每个颜色带因为亮度不同都呈带状分布,可以通过转变观看的角度,让每个颜色的空间被区分的很明显,再通过聚类算法得到六种颜色;最小类间距体现了整个识别的稳定性,可以通过调整光照或者调整曝光来增大最小类间距让识别更加可靠;


优点:稳定性很好,适应不同颜色的魔方,允许魔方有色差;只要是六种不同颜色色块的魔方都能识别;


缺点:整个过程很复杂,如果引入负反馈来增大最小类间距就更复杂了


3.用SVM图像分类直接训练分类器识别


不知道哪里听来这句话,“我们日常很大一部分的分类单单靠SVM分类器就足够了”,事实上确实是这样,用SVM对于很多数据已经可以做到无脑分类了。


优点:稳定性较好,整个过程相对2简单很多,对于不同光照适应效果主要取决于训练样本,由于事先已经训练好了,识别非常快;亲测:在极端情况下,只要人还能通过图像区分两种颜色,SVM分类器就能区分


缺点:如果不是正常颜色的魔方识别出现困难


三种方案各有利弊,我采用的是第三种方案:


首先是SVM分类器的训练:用第二部得到的算法画出20*20的小矩形,在不同光照情况,不同位置采集到每个颜色大概100张图片;人工把颜色分类好,打上标记,送入分类器分类;训练得到分类器;


保存分类器文件;




之后每一次识别调用分类器识别即可;

暂时先写这么多把,源码等我比赛参加完再发,现在比赛不方便就不发了,之后还会写一篇步骤转换算法部分的一篇,如果觉得这个博客有帮助就点赞评论一下吧,也第一次写博客,不成熟之处请指教;

如果有更好的处理方案更好的算法想和我交流可以发邮箱到939117440@qq.com