基于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

相关文章

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

统一返回JsonResult踩坑的记录

《统一返回JsonResult踩坑的记录》:本文主要介绍统一返回JsonResult踩坑的记录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录统一返回jsonResult踩坑定义了一个统一返回类在使用时,JsonResult没有get/set方法时响应总结统一返回

MyBatis设计SQL返回布尔值(Boolean)的常见方法

《MyBatis设计SQL返回布尔值(Boolean)的常见方法》这篇文章主要为大家详细介绍了MyBatis设计SQL返回布尔值(Boolean)的几种常见方法,文中的示例代码讲解详细,感兴趣的小伙伴... 目录方案一:使用COUNT查询存在性(推荐)方案二:条件表达式直接返回布尔方案三:存在性检查(EXI

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Python验证码识别方式(使用pytesseract库)

《Python验证码识别方式(使用pytesseract库)》:本文主要介绍Python验证码识别方式(使用pytesseract库),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1、安装Tesseract-OCR2、在python中使用3、本地图片识别4、结合playwrigh

Python函数返回多个值的多种方法小结

《Python函数返回多个值的多种方法小结》在Python中,函数通常用于封装一段代码,使其可以重复调用,有时,我们希望一个函数能够返回多个值,Python提供了几种不同的方法来实现这一点,需要的朋友... 目录一、使用元组(Tuple):二、使用列表(list)三、使用字典(Dictionary)四、 使

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

SpringBoot中配置文件的加载顺序解读

《SpringBoot中配置文件的加载顺序解读》:本文主要介绍SpringBoot中配置文件的加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot配置文件的加载顺序1、命令⾏参数2、Java系统属性3、操作系统环境变量5、项目【外部】的ap

Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案

《Vue3组件中getCurrentInstance()获取App实例,但是返回null的解决方案》:本文主要介绍Vue3组件中getCurrentInstance()获取App实例,但是返回nu... 目录vue3组件中getCurrentInstajavascriptnce()获取App实例,但是返回n