【手拉手 带你准备电赛】单色块识别(基于openmv)

目录

文章背景

openmv介绍

openmv色块识别原理

openmv色块识别代码

最终结果

疑惑细解:

关于阈值的设置:

关于自动增益和白平衡


文章背景

        我们都听说过什么图像识别、色块识别,并且在2021年电赛——智能送药小车中也使用到了相关技术,那么你知道相关的原理和实现方法吗?接下来小蛋糕带你一探究竟。

openmv介绍

        首先我要为大家介绍一下,本篇文章的硬件平台——openmv。openmv并不仅仅是一个摄像头,它搭载了STM32的系列芯片,并且封装好了大量可供用户直接调用的函数,这些函数已经可以满足我们对于图像处理的大部分需求。在openmv的操作中,我们使用python调用相关函数进行编程。

openmv色块识别原理

        openmv实现色块的识别使用过一个非常容易理解的原理实现的——数值比较。这个原理是这样的:首先我们设置色彩的范围阈值(在这个数值范围内都被视为是这个颜色),然后我们捕获每一帧图片之后,把图片中的像素色彩数值与我们之前设置好的色彩阈值进行对比,在阈值的范围内则被视为是这个颜色,然后确定好色块之后,我们使用线框将色块框出,这样就完成了色块识别的工作。

openmv色块识别代码

        小蛋糕可是老代码人了,话不多说,我们在代码中给大家带来进一步的解析。

        1.首先设置色彩阈值(这要根据我们要识别的色彩具体设置,设置方式一是看界面右侧LAB色彩空间色彩信息的最小值和最大值;二是使用工具菜单栏中的–机器视觉–阈值编辑器,获得我们要识别色彩的阈值数据)。

#threshold_index = 0    #用于多色块识别(说明识别出来的色块编号信息)     
thresholds = [(57, 100, -128, 15, -42, -13)]

        2.然后我们进行相关函数的调用。在这步中,我们要初始化摄像头,设置摄像头格式和分辨率,同时确定留给摄像头进行准备工作的时间。

sensor.reset()  #初始化摄像头
sensor.set_pixformat(sensor.RGB565)    #设置摄像头格式
sensor.set_framesize(sensor.QVGA)      #设置像素格式
sensor.skip_frames(time = 2000)        #减少捕获到无效信息,所以我们跳过一段时间再进行后续的工作

        3.然后我们关闭白平衡和自动增益(开启这两个功能容易增大我们识别过程中的误差)。

sensor.set_auto_gain(False)    #关闭自动增益
sensor.set_auto_whitebal(False)     #关闭白平衡

        4.然后我们设置处理器时间。

clock = time.clock()

        5.接下来便到了我们程序中最重要的部分——识别色块,并将色块框出。贼这部分中我们首先需要将图片捕获,然后在每一帧捕获的图片上进行操作;然后我们在使用find.blobs函数找到色块,然后我们将寻找到的色块框出。

        img = sensor.snapshot()    #捕获图片
#使用遍历的方式进行色块的寻找
        for blob in img.find_blobs([thresholds[0]], pixels_threshold=200, area_threshold=200, merge=True):

        if blob.elongation() > 0.5:
            #下面三行代码分别是使用不同的颜色画出方框、中心十字、和横线,这三行代码可有可无不做要求
            img.draw_edges(blob.min_corners(), color=(255,0,0))
            img.draw_line(blob.major_axis_line(), color=(0,255,0))
            img.draw_line(blob.minor_axis_line(), color=(0,0,255))
       
        #下面的代码是稳定的,也就是不需要我们再次进行参数的设置
        img.draw_rectangle(blob.rect())    #画出矩形框
        img.draw_cross(blob.cx(), blob.cy())    #画中心位置的十字
       
        img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)

        6.最后我们将帧率打印出来即可(其实这里不打印也没有问题,这里主要是便于进行观察数据)

print(clock.fps())

最终结果

        通过上述代码我们就可以实现色块识别,识别结果如下图所示:

疑惑细解:

关于阈值的设置:

        在此之前我们接触的阈值大多是以点的形式(即只是一个孤立的数值,而不是一个范围),那么我们在这里为什么将阈值设置包括最大值与最小值组成了一个范围呢?

        对于这种设置方式我们有两个角度的考量:

        1.首先,这是由色彩自身的特点决定的,在RGB,每种色彩对应了一段的数据。

        2.其次,这是为了减少在图片捕获过程中,光线等影响了物体色彩的显示,以减小误差。

关于自动增益和白平衡

        自动增益

        摄像机输出的视频信号必须达到电视传输规定的标准电平,即为了能在不同的景物照度条件下都能输出的标准视频信号,必须使放大器的增益能够在较大的范围内进行调节。这种增益调节通常都是通过检测视频信号的平均电平而自动完成的,实现此功能的电路称为自动增益控制电路,简称AGC电路。具有AGC功能的摄像机,在低照度时的灵敏度会有所提高,但此时的噪点也会比较明显。这是由于信号和噪声被同时放大的缘故。

        白平衡

        它指的是在图像处理的过程中, 对原本材质为白色的物体的图像进行色彩还原, 去除外部光源色温的影响, 使其在照片上也显示白色。

        好的,关于色块识别我们就分析到这里,你学废了吗?下篇文章见!

来源:一口吞掉小蛋糕

物联沃分享整理
物联沃-IOTWORD物联网 » 【手拉手 带你准备电赛】单色块识别(基于openmv)

发表评论