基于openmv的多色块识别并返回色块顺序

一、效果

该代码能够实现扫描依次排开的三个红绿蓝色块,并将它的颜色顺序返回

实际效果图(123分别对应红绿蓝)

效果图
在这里插入图片描述

二、程序

程序中加入了大量的注释,对程序的语法和逻辑都做出了一些解释。

# Titled - By: DingYF - 周三 2月 17 2021

import sensor, image, time    #引入三个库

red = (48, 74, 18, 127, -26, 73)          ###
green = (9, 87, -67, -11, -18, 66)          ## 定义三个颜色的lab值范围格式为(Lmax,Lmin,Amax,Amin,Bmax,Bmin)
blue = (47, 74, -9, 13, -10, -35)           #  以及一个颜色组colour
colour = [red,green,blue]                 ###  对应颜色的lab阈值信息,可以通过IDE中的工具→机器视觉→阈值编辑器自行调整和获取

red_blob = None                                 ###
green_blob = None                                 ## 定义三个空的变量,用来盛放下面寻找到的色块的信息
blue_blob = None                                  #  以及定义一个色块组blobs_group
blobs_group = [red_blob,green_blob,blue_blob]   ###

Name_list = ['R','G','B']           ###
Order_list= [1,2,3]                   ##定义一个名字列表,它的顺序和上面的colour顺序是一致的,目的是为了给抓取到的相应色块是命名。
tool = []                             # 定义一个顺序列表,我们规定1是红色,2是绿色,3是蓝色。tool是工具数组,用来盛放不同色块的中心点x坐标信息
i,j,t= 0,0,2                        ### 定义三个变量并赋值,最后比较色块x坐标大小时会用到

sensor.reset()                              ###
sensor.set_pixformat(sensor.RGB565)           ## 这些是关于摄像头的设置
sensor.set_framesize(sensor.QVGA)             #  星瞳科技官网,'10分钟快速上手'里有详细的注释
sensor.skip_frames(time = 2000)               #
sensor.set_auto_gain(False)                   #
sensor.set_auto_whitebal(False)               #
clock = time.clock()                        ###

def Find_group():                                                       ###
    t = 0                                                                 ## 这里是重点,定义一个发现色块组的函数
    while t < 3:                                                          #  find_blobs函数会寻找对应阈值内颜色的色块,例如t=0时寻找的是红色,并将
        blobs_group[t] = img.find_blobs([colour[t]])                      #  它找的信息赋值给blobs_group中的red_blobl
        if len(blobs_group[t]) > 0:                                       #  判断是否找到色块,找到色块会对色块进行一系列操作
            for b in blobs_group[t]:                                      #  先判断色块的b[4],即像素数,对应的b几代表什么可以在星瞳科技的'10分钟快速上手'里找到
                if  12000 > b[4] > 3000:                                  #  利用画图函数,根据寻找到的色块的信息,分别画出外边框,中心十字,在左上角写对应色块的名称
                    img.draw_rectangle(b[0:4])                            #  然后将b[5]追加到tool中储存起来。最后会让t+1,就会对绿色的色块进行这一系列操作
                    img.draw_cross(b[5], b[6])                            #  这个函数的目的就是依次寻找红绿蓝色块
                    img.draw_string(b[0], b[1], Name_list[t])             #
                    tool.append(b[5])                                     #
        t+=1                                                            ###

while (True):                                                                ###
    clock.tick()                                                               ## 这是一个大的循环,可以说前面的都是准备工作,主要是为这个循环
    img = sensor.snapshot()                                                    #  逻辑是,抓取画面,然后用前面定义的好的Find_group函数抓取出画面中的色块
    Order_list= [1,2,3]                                                        #  if语句里的内容是,判断是否抓取到三个色块,因为受光线影响有时候并不能直接抓取三个色块
    tool = []                                                                  #  可能会出现某一色块抓取不到的情况,相应的这个时候tool中的数据也就是错误的
    Find_group()                                                               #  如果成功抓取到三个色块,就会用两个for循环对tool中的数据进行从小到大的排序
    if len(tool) == 3 :                                                        #  在openmv中坐标原点是左上角,x轴向右,y轴向下。因为要识别顺序的三个色块是从左到右依次排开的
        for i in range(0,2):                                                   #  所以对tool中数据进行排序的同时,也根据tool中数据顺序的变化更改Order_list对应的数据顺序
            j=i+1                                                              #  这样我们就得到了排列好的Order_list的顺序,即三个色块的排列顺序
            for j in range(1,3):                                               #  有三个需要注意的点:1.为了避免循环程序时,会对已经排序好的Order_list再次进行排序,
                if tool[i]>tool[j] :                                           #  所以在循环里声明 Order_list=[1,2,3],相当于每次循环重置一下,但是当最后一行有break时则不用。
                    tool[i],tool[j] = tool[j],tool[i]                          #  2.为了避免循环的时候不停的给tool追加数据,以及一开始没有找到色块信息,后来又找到色块信息,
                    Order_list[i],Order_list[j] = Order_list[j],Order_list[i]  #  带来的数据出错,所以每次循环重新将tool定义为空数组。3.因为最后一句是break,会出现
                j+=1                                                           #  根本没看到给抓取到色块画的外边框和中心十字,程序就已经结束了,但是不要担心,程序运行是正常的
            i+=1                                                               #  在调试的时候把break注释掉就行了。
        print(Order_list)                                                      #
        break                                                                ###

## 程序的不足之处,偶尔运行的时候会提醒内存溢出,具体哪个地方出问题我还没有找到
## 希望此程序对你的学习有所帮助




三、后记

2月23日下午,将代码写完,在此之前出现了各种各样的问题,和难题,都被一 一解决,感谢@湖工大闸蟹 同学将他的代码开源供大家学习,感谢我的好朋友在此期间提供帮助,我才得以将代码写完,为此我将代码分享在csdn上供大家参考,希望能让初学者少走弯路,当然代码中肯定有很多不足之处,还望指正。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值