1、前言
近期我们在做2017年的B题板球系统,选择这个选题的主要原因是这个项目属于比较简单,但综合的一个项目,最关键是手上刚好有现成的材料,以及部分支架由我们队负责机械部分的同学进行建模和设计机械结构,而我这边opencv主要是进行板子上的九个点以及橙色小球的坐标传回。(目前也正在试试能不能通过opencv计算出小球的速度,目前有个光流法的思路,但是不确定行不行,而且也在网上搜了好多,并找到能够计算到速度的似乎只有yolo识别车辆的速度的方法,再学一段时间看看咋的整)
2、板球系统思路的讲解
首先先从摄像头拿到图像,对彩色的图像进行特征分析,在板球系统中,我的特征无非就是九个黑点和一个橙色小球,只需要通过设置阈值来识别即可,但是在实际处理起来其实会遇到挺多问题的,也就是一些细节导致最终画面的稳定性差,或者识别效率欠佳。讲讲我的思路分成黑点和橙色小球两部分讲解。
2.1 黑点识别思路
首先设置好ROI区域,将ROI区域的画面转为HSV,然后用cv2.inrange设置好上下限阈值(这个阈值你需要去取出来,通过各种方法,我是通过GPT生成的一个HSV的上下限的颜色检测脚本来取出的),这时候你的这个图像被设置阈值后会变成二值化的画面,但是这个时候仍然会在一定范围内波动变化,尤其是会极度受光照影响,除非关照特别稳定,否则识别断断续续的,想要解决这个问题就要去根据此时的光强来寻找最合适的阈值,这里我有两个方案思路提供,一个是在开机时,对中心点等待3s然后再去设置好此时中心黑点的阈值,这种方法的好处就是能够自动适应此时的光照强度而且在开机后就不能更换环境了,最关键的是如果光照不均匀,那么就很可能出现中心点的阈值和周围的阈值差距过大,可以通过补光灯来解决这个问题,这个思路我觉得挺不错的,但是并没有选择它。
我的第二思路,在使用完阈值后得到二值化图像后,用到了opencv的一个自适应阈值的算法,OTSU处理(大津法),他会自动找到当前灰度图的最佳的那个可以过滤的阈值,而且受光照影响很小,即使在很暗或者很亮的情况下也能做到比较高识别度。但是也有它的缺点,很明显,容易被噪点干扰,因为它的寻找是在灰度图下进行的,不像在HSV空间上有颜色信息,灰度图只有梯度0~255这样子,所以会导致有时候对颜色不敏感,也就是说这种方法只适合颜色单一的图像处理,并不能用比较多色处理,这也是它的弊端,但是在这个项目里,它的优点比缺点更值得我去使用它,因为确实出现了在训练场景下如果有人走来走去或者实验室内多个光源的影响,导致9个点有些点的亮度相差太多了,只是用固定的阈值实际上很难去识别的稳定,使用这个算法的时候最好先使用高斯滤波,把整个画面进行滤波在把它进行OTSU处理,效果会好很多,防止环境过暗导致噪点过多造成误识别,而且适用的场景真的特别的宽。
经过上面的处理得到的二值化图像后,然后就是正常的加卷积核膨胀,这里不选择腐蚀,因为识别的不是动的而且形状很均匀,如果加了腐蚀也行,只是效果几乎一致。然后就是正常的寻找所有轮廓,然后记录中心点,然后写个函数把这9个中心点进行按题目的排序来划分区域,(这个排序的函数,我通过各种途径找到的排序都没办法按照题目的要求的那样1~9进行排序,于是自己直接暴力排序,把在画面哪个区域内的定为1这样)然后就是把1~9点的坐标依次串口发出。
2.2 橙色球的处理
这个处理思路就比较简单,转HSV空间然后设置好橙色阈值然后正常的腐蚀膨胀得到二值化图像,然后就开始寻找轮廓,然后遍历轮廓然后进行标注它的坐标,我在这个坐标的输出使用了一个卡尔曼滤波这样子它的输出就不会那么跳了,然后也是通过串口发出,这样橙色小球的部分就解决了。