• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

手拉手 准备电赛单色块识别openmv

武飞扬头像
一口吞掉小蛋糕
帮助1

目录

文章背景

openmv介绍

openmv色块识别原理

openmv色块识别代码

最终结果

疑惑细解:

关于阈值的设置:

关于自动增益和白平衡


文章背景

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

openmv介绍

openmv色块识别原理

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

openmv色块识别代码

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

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

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

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

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

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

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

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

clock = time.clock()

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

  1.  
    img = sensor.snapshot() #捕获图片
  2.  
    #使用遍历的方式进行色块的寻找
  3.  
    for blob in img.find_blobs([thresholds[0]], pixels_threshold=200, area_threshold=200, merge=True):
  4.  
     
  5.  
    if blob.elongation() > 0.5:
  6.  
    #下面三行代码分别是使用不同的颜色画出方框、中心十字、和横线,这三行代码可有可无不做要求
  7.  
    img.draw_edges(blob.min_corners(), color=(255,0,0))
  8.  
    img.draw_line(blob.major_axis_line(), color=(0,255,0))
  9.  
    img.draw_line(blob.minor_axis_line(), color=(0,0,255))
  10.  
     
  11.  
    #下面的代码是稳定的,也就是不需要我们再次进行参数的设置
  12.  
    img.draw_rectangle(blob.rect()) #画出矩形框
  13.  
    img.draw_cross(blob.cx(), blob.cy()) #画中心位置的十字
  14.  
     
  15.  
    img.draw_keypoints([(blob.cx(), blob.cy(), int(math.degrees(blob.rotation())))], size=20)
学新通

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

print(clock.fps())

最终结果

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

学新通

疑惑细解:

关于阈值的设置:

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

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

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

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

关于自动增益和白平衡

        自动增益

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

        白平衡

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

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkgca
系列文章
更多 icon
同类精品
更多 icon
继续加载