Robomaster2019自动射击算法视觉小记

Robomaster2019自动射击算法视觉小记

  • ZZU-WG_SPARK
    • 功能实现
    • 代码流程
      • 图像处理

ZZU-WG_SPARK

2019赛季已经结束,很遗憾,我们ZZU还是未能在小组出线
这一年我们队伍老师没有给一分钱,全凭学生自己兴趣去做这个比赛。同时,我们还没有技术积累,视觉上一届算法还需要用滤片,算法也是官方开源的那种,极其低效和复杂。
RM没钱没积累怎么玩?我们只能凭借一腔热血去做。
今年一年,我们电控组研发出了小陀螺,机械组的步兵从不卡弹,且各个兵种都实现了功能。强队可能是4-5个人负责一辆车,而我们今年一个人一辆车。而且后期大家都没了多少热情,整个队伍二十几号人,可能只有8-9个人能作为技术担当去做这个比赛。

功能实现

今年我们用的处理器还是妙算1,摄像头是淘宝买的200一个,单目。

我做的是视觉图像处理部分,实现了3米内全角度稳定识别,3-5米内会有跳动,但不会有误判出现,同时能适应复杂环境,在实验室测试时效果完美,同时在分区赛时没有出现什么问题。由于处理器有限,我们只能实现640*480帧率的处理,曾经想使用决策树或者SVM去对数字进行识别,但是单线程情况下帧率太低,多线程多个线程的通信又不好做,而且也会影响速度,就这样作罢。而一些轻量化的神经网络我们也考虑过,不过不及形态学的效果和帧率好,就放弃了。
由于没有对数字进行识别,为了稳定,我选择对大装甲和小装甲分开进行识别,设置了两个模式。
视觉跟踪与通信是我的另外一个同学在做,同时他也负责了裁判系统的管理和维护使用。他一个人负责的东西真的很多。
我们采用的是二阶KCF滤波算法进行跟踪,预测采用的是帧差预测。二阶卡尔曼滤波最大的问题就是他会在目标突变的时候进行跳动,我们设立了一些方法,将这个问题简单解决了,效果还可以。
今年我们的摄像头最高帧率是120帧,我们处理的速度是60帧。
一共600块钱的摄像头做到这种效果,我觉得今年我们没丢人了。当然识别的效果不能和强队比emmmm,哈工大一个车上的摄像头3万块,比我所有处理器+摄像头还要贵3倍了,这怎么玩?
给我一个TX2,我给你撸个330帧emmmmm

代码流程

我认为,对于装甲板的自动识别与跟踪,可以分为三个方面,图像处理,跟踪预测,通信。

图像处理

今年我们的图像处理部分流程主要是这样:
首先进行二值化
二值化的方法很多,如inrange之类的,有许多相关的论文,都实现了多通道下的二值化。不过这些方法对最基本的RM装甲板来说,有些过于慢了。如irange,一行代码需要我们用10-20ms的速度去处理,这对追求帧率的RM是不可想象的。
所以opencv的经典cvtcolor+threshold才是王道,我写了如下的函数,在vs上测试只用了不到1ms

Mat Armorfind::p_img(Mat& src)
{

    Mat out;
    cvtColor(src, out, COLOR_BGR2GRAY);
    Mat element1, element2;

    threshold(out, out,hsv_threshold , 255, THRESH_BINARY);
    element1 = getStructuringElement(MORPH_RECT, Size(1, 5));
    erode(out, out, element1);
    element2 = getStructuringElement(MORPH_RECT, Size(5, 9));

    dilate(out, out, element2);

    return out;
}

这个方法对rm比赛真的很友好,可以借鉴一下。

二值化完了后就该图像处理了,这里使用的是寻找轮廓之类的方法,这些都大同小异,就不再叙述了。
在这之后就是处理轮廓,通过一系列的阙值,最后使得算法能对装甲板进行识别。
同时再通过一些算法,实现对鼠标中心点与装甲板面积拟合出一个函数,再进行处理。话不多说了,直接贴代码吧。

希望ZZU的RM越来越好,开源一点对这个比赛做出一点贡献吧。

ZZU_WH 于2019年6月3日 5:29记

你可能感兴趣的:(Robomaster2019自动射击算法视觉小记)