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

2023-10-11 06:20

本文主要是介绍基于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的多色块识别并返回色块顺序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/186163

相关文章

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

struts2中的json返回指定的多个参数

要返回指定的多个参数,就必须在struts.xml中的配置如下: <action name="goodsType_*" class="goodsTypeAction" method="{1}"> <!-- 查询商品类别信息==分页 --> <result type="json" name="goodsType_findPgae"> <!--在这一行进行指定,其中lis是一个List集合,但

Clion不识别C代码或者无法跳转C语言项目怎么办?

如果是中文会显示: 此时只需要右击项目,或者你的源代码目录,将这个项目或者源码目录标记为项目源和头文件即可。 英文如下:

[数据结构]队列之顺序队列的类模板实现

队列是一种限定存取位置的线性表,允许插入的一端叫做队尾(rear),允许删除的一端叫做队首(front)。 队列具有FIFO的性质 队列的存储表示也有两种方式:基于数组的,基于列表的。基于数组的叫做顺序队列,基于列表的叫做链式队列。 一下是基于动态数组的顺序队列的模板类的实现。 顺序队列的抽象基类如下所示:只提供了接口和显式的默认构造函数和析构函数,在派生类中调用。 #i

[数据结构]栈之顺序栈的类模板实现

栈的数组实现形式,采用动态分配数组,不够时可以调整栈的大小。 Stack.h文件:主要定义栈的抽象基类,提供公共的接口函数。 #ifndef STACK#define STACK//栈的抽象基类template<class T>class Stack{public:Stack(){}~Stack(){}virtual void Push(const T& x)=0;virt

C++中类的构造函数调用顺序

当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的 构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。 简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是 要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时, 如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序