本文主要是介绍基于openmv的多色块识别并返回色块顺序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 一、效果
- 二、程序
- 三、后记
一、效果
该代码能够实现扫描依次排开的三个红绿蓝色块,并将它的颜色顺序返回
实际效果图(123分别对应红绿蓝)
二、程序
程序中加入了大量的注释,对程序的语法和逻辑都做出了一些解释。
# Titled - By: DingYF - 周三 2月 17 2021import 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_bloblif 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上供大家参考,希望能让初学者少走弯路,当然代码中肯定有很多不足之处,还望指正。
这篇关于基于openmv的多色块识别并返回色块顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!