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

相关文章

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的

基于Spring实现自定义错误信息返回详解

《基于Spring实现自定义错误信息返回详解》这篇文章主要为大家详细介绍了如何基于Spring实现自定义错误信息返回效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景目标实现产出背景Spring 提供了 @RestConChina编程trollerAdvice 用来实现 HTT

Pytorch微调BERT实现命名实体识别

《Pytorch微调BERT实现命名实体识别》命名实体识别(NER)是自然语言处理(NLP)中的一项关键任务,它涉及识别和分类文本中的关键实体,BERT是一种强大的语言表示模型,在各种NLP任务中显著... 目录环境准备加载预训练BERT模型准备数据集标记与对齐微调 BERT最后总结环境准备在继续之前,确

讯飞webapi语音识别接口调用示例代码(python)

《讯飞webapi语音识别接口调用示例代码(python)》:本文主要介绍如何使用Python3调用讯飞WebAPI语音识别接口,重点解决了在处理语音识别结果时判断是否为最后一帧的问题,通过运行代... 目录前言一、环境二、引入库三、代码实例四、运行结果五、总结前言基于python3 讯飞webAPI语音

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为