openmv 学习笔记(24电赛笔记)

寻找特定目标

        这个功能主要应用在,机器人寻找色块,无人机跟踪特定颜色,生产线上检测物体进行分类,还有人机交互等等功能应用。

相关函数  

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

        这个函数在openmv中是用来查找颜色块的函数,通过阈值检测图像中的颜色块,完成之后返回列表,列表中包含所有检测到的颜色块。

thresholds参数

        这个参数用来确定检测什么颜色,每个颜色阈值为一个元组,使用LAB颜色表示颜色阈值范围,(L_min ,L_max , A_min , A_max , B_min ,B_max),要检测什么颜色,就要填什么颜色的颜色阈值。

import sensorsensor.reset()
sensor.set_framesize(sensor.QVGA)
sensor.set_pixformat(sensor.RGB565)thresholds = [(30,100,15,127,15,127)]while (True):image = sensor.snapshot()red_blobs = image.find_blobs(thresholds)

       但是这个参数需要注意的是,thresholds参数是一个列表(list),里面元素是需要检测,颜色的元组组成的, 如果没有定义对,就会报错了。

        上面的代码,检测红色,但是对返回列表没有什么操作,也就视频上没有什么显示。

roi参数

        这个参数用来设置感兴趣的区域,或者说只检测的区域,区域之外的颜色不检测,roi =  [x ,y, w, h]   四个参数起始x y 检测区域宽度 w   检测区域高度 h ,使用代码检测左半区的红色,同时框选出来。

import sensor, image# 初始化摄像头
sensor.reset()
sensor.set_framesize(sensor.QVGA)  # 设置帧大小为QVGA (320x240)
sensor.set_pixformat(sensor.RGB565)  # 设置像素格式为RGB565
sensor.skip_frames(time=2000)  # 跳过一些帧,使设置生效# 定义颜色阈值 (这里假设要检测红色区域)
thresholds = [(30, 100, 15, 127, 15, 127)]# 定义左边ROI
left_roi = [0, 0, 160, 240]  # 定义图像左半部分的感兴趣区域while True:img = sensor.snapshot()  # 捕捉图像# 在左边ROI中寻找颜色块red_blobs = img.find_blobs(thresholds, roi=left_roi, pixels_threshold=200, area_threshold=200, merge=True)# 如果找到颜色块if red_blobs:for blob in red_blobs:# 绘制矩形和十字标记img.draw_rectangle(blob.rect(), color=(255, 0, 0))  # 红色矩形img.draw_cross(blob.cx(), blob.cy(), color=(255, 0, 0))  # 红色十字print("Red blob found at: (%d, %d) with area %d" % (blob.cx(), blob.cy(), blob.area()))img.draw_rectangle(left_roi,color = (255,0,0))  #将检测区域使用红色框选出来

        上面的代码因为设置了roi,所以值检测左半部分区域内的红色,有半部分的红色不检测,同时检测出红色使用,十字和画框进行标出,显示。

x_stride参数

        这个参数用来设置,在调用find_blobs函数,指定水平方向上,搜索颜色块的步长,设置为1每个像素都检查,设置为2每隔一个像素进行检查是检测颜色最小宽度的设置,这个参数设置可以帮助,减少处理时间,通过跳过一些参数。

        同时如果不配置默认为2

y_stride参数        

       用来查找y方向上的最小宽度像素,默认为1,如果设置为8,是检测颜色最小长度的设置,如果设置为8,就是只检测8个像素以上的,需要检测的颜色。

invert 参数

        这个参数用来翻转阈值,检测颜色是thresholds,如果加入这个参数会检测,除设定检测颜色以外的所有颜色,两个取值 True  False  前者开启翻转。

area_threshold面积阈值

        参数用来设置,检测颜色的最小面积阈值,出现检测颜色,同时检测颜色超过这个阈值,不会被过滤出去,否则将会过滤出去。

pixels_threshold像素阈值

        像素阈值参数,同样的像素个数小于这个值会被过滤出去,不会被检测。

merga参数

        当检测颜色块重叠的时候,会自动合并颜色块,当设置为True的时候,不论是检测多个颜色块,还是单个颜色块,当检测颜色被分为多个小块的时候,merga这个参数可以合并为整体。

        如果检测多个颜色,且颜色在图像中出现重叠,merga = True 这个参数会将,图像合并,为一个颜色块无论这些颜色是否相同。

import sensor, image, time# 初始化摄像头
sensor.reset()
sensor.set_framesize(sensor.QVGA)  # 设置帧大小为QVGA (320x240)
sensor.set_pixformat(sensor.RGB565)  # 设置像素格式为RGB565
sensor.skip_frames(time=2000)  # 跳过一些帧,使设置生效# 定义颜色阈值 (假设要检测红色和蓝色区域)
red_thresholds = (30, 100, 15, 127, 15, 127)
blue_thresholds = (0, 30, -128, 0, -128, 0)
thresholds = [red_thresholds, blue_thresholds]# 创建一个时钟对象来跟踪帧率
clock = time.clock()while True:clock.tick()  # 跟踪FPSimg = sensor.snapshot()  # 捕捉图像# 在图像中寻找颜色块,设置merge为Trueblobs = img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200, merge=True)# 如果找到颜色块if blobs:for blob in blobs:# 绘制矩形和十字标记img.draw_rectangle(blob.rect(), color=(255, 0, 0))  # 红色矩形img.draw_cross(blob.cx(), blob.cy(), color=(255, 0, 0))  # 红色十字print("Blob found at: (%d, %d) with area %d" % (blob.cx(), blob.cy(), blob.area()))print("FPS: %f" % clock.fps())  # 打印FPS

        检测红色和蓝色,当红色和蓝色出现重叠的时候,会自动合并为一起。

        到此这个函数的多有参数详解就描述完了,在调用函数的时候,参数如果没有填写,那么就会使用默认值进行调用,最少参数只使用检测颜色的LAB值,就可以完成调用。

#函数返回对象属性

        前面有提到过,find_blobs()函数是有返回对象的,这个返回对象是一个列表,列表里面的成员变量是表示单个颜色块的对象 ,这些对象是有属性和函数,也就是说,列表里面的对象可以调用函数进行操作。      

        blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。

        blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。

        blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。

        blob.rotation() 返回色块的旋转角度(单位为弧度)(float)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过blob[7]来获取。

blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。

import sensor, image, time# 初始化摄像头
sensor.reset()
sensor.set_framesize(sensor.QVGA)  # 设置帧大小为QVGA (320x240)
sensor.set_pixformat(sensor.RGB565)  # 设置像素格式为RGB565
sensor.skip_frames(time=2000)  # 跳过一些帧,使设置生效# 定义颜色阈值 (假设要检测红色区域)
thresholds = [(30, 100, 15, 127, 15, 127)]# 创建一个时钟对象来跟踪帧率
clock = time.clock()while True:clock.tick()  # 跟踪FPSimg = sensor.snapshot()  # 捕捉图像# 在图像中寻找颜色块blobs = img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200, merge=True)# 如果找到颜色块if blobs:for blob in blobs:# 绘制矩形和十字标记img.draw_rectangle(blob.rect(), color=(255, 0, 0))  # 红色矩形img.draw_cross(blob.cx(), blob.cy(), color=(255, 0, 0))  # 红色十字# 输出颜色块的属性信息print("Blob found at:")print("  Coordinates: (x=%d, y=%d)" % (blob.cx(), blob.cy()))print("  Area: %d" % blob.area())print("  Rectangle: (x=%d, y=%d, w=%d, h=%d)" % blob.rect())print("  Pixels: %d" % blob.count())print("  Density: %f" % blob.density())print("  Rotation: %f" % blob.rotation())print("  Major Axis Line: %s" % str(blob.major_axis_line()))print("  Minor Axis Line: %s" % str(blob.minor_axis_line()))print("  Compactness: %f" % blob.compactness())print("  Elongation: %f" % blob.elongation())print("FPS: %f" % clock.fps())  # 打印FPS

                欢迎指正,希望对你,有所帮助!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/386508.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【从0制作自己的ros导航小车:上位机篇】02、ros1多机通讯与坐标变换可视化

从0制作自己的ros导航小车 前言一、ros1多机通讯二、rviz可视化小车坐标系 前言 上节课完成了里程计数据与坐标变换发布,但是还没有测试,本节进行测试,测试之前需要知道一件事,上位机也就是开发板一般不做可视化用,因…

【JavaScript】详解JavaScript语法

文章目录 一、变量和数据类型二、运算符三、条件语句四、循环语句五、函数六、对象和数组七、ES6新特性八、实际应用案例 JavaScript是一门广泛应用于Web开发的编程语言。掌握JavaScript语法是成为前端开发者的第一步。本文将详细介绍JavaScript的基本语法,包括变量…

[ARC105E] Keep Graph Disconnected题解

题目 考虑加任意一条边时都会输的图的状态:图被分成两个强联通分量,每一个强联通分量都是一个完全图。 也就是说,假设一开始节点 1 1 1 和节点 n n n 不联通,那么还可以加 n ( n − 1 ) 2 − m − c n t 1 ( n − c n t 1 ) \…

Overlay网络

Overlay 介绍 Overlay网络是将已有的物理网络(Underlay网络)作为基础,在其上建立叠加的逻辑网络,实现网络资源的虚拟化。 传统网络带来了以下一些问题: ● 虚拟机规模受 网络规格限制在传统二层网络环境下&#xff0…

删除的视频怎样才能恢复?详尽指南

在日常生活中,我们有时会不小心删除一些重要的视频文件,或者在整理存储空间时不慎丢失了珍贵的记忆片段。这时候,我们可以通过一些数据恢复工具和技巧,找回这些被删除的视频。本文将详细介绍几种常见且有效的视频恢复方法&#xf…

如何用PostMan按照规律进行循环访问接口

①设置动态变量 步骤一: 设置环境变量 1. 创建环境变量集合 在 Postman 左上角选择 "环境",然后点击 "添加" 来创建一个新的环境变量集合。给它起一个名称,比如 "uploadDemo". 2. 添加初始变量 在新创建的环境变量集…

C语言边界互通传送迷宫

目录 注意事项开头程序程序的流程图程序输入与输出的效果结尾 注意事项 程序里有关字符’\033’的输出都关于Sunshine-Linux的其中一篇博客——《printf函数高级用法设置打印字体颜色和背景色等》 开头 大家好,我叫这是我58。今天,我们来看一下我用C语…

微服务面试-分布式 注册中心 远程调用 保护

标红的原理还是不太熟悉 重新看 分布式事务 CAP理论 Consistency(一致性) Availability(可用性) Partition tolerance (分区容错性) BASE 理论 就是做取舍 cap三选二 AT模式脏写 TCC模式 注册中…

4nm点状激光模组的应用让未来科技走向潮流

在科技发展时代,激光技术以其高精度、高效率的特性,正逐步成为众多行业不可或缺的核心技术之一。其中,4nm点状激光模组作为激光技术领域的佼佼者,凭借其卓越的性能和广泛的应用前景,正引领着科技发展的新潮流。接下来我…

UnityShaderUI编辑器扩展

前言: 当我们在制作通用Shader的时候,避免不了许多参数混杂在一起,尽管在材质面板已经使用过Header标签来区分,但是较长的Shader参数就会导致冗余,功能块不够简约明了,如图: 对于Shader制作者来…

用spingboot+vue实现酒店管理系统的不同角色登录功能(附源码)

酒店管理系统 一、项目介绍 1、项目用到的技术栈 开发工具:idea 语言:java、js、htmlajax 数据库:MySQL 服务器:Tomcat 框架:mybatis、jQuery、springboot、vue 2、项目实现功能 管理员和用户登录和退出功能以及用…

WSL for Windows

1、安装 超详细Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04(带桌面环境)_wsl安装ubuntu20.04-CSDN博客https://blog.csdn.net/weixin_44301630/article/details/122390018 注意,安装之后首次启动 Ubuntu 时&…

NC 删除有序链表中重复的元素-I

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 删除给出链表…

用依赖倒置和控制反转,突破Golang循环调用限制之后的思考

在软件开发中,随着项目规模的扩大和业务逻辑的复杂化,重构代码变得越来越重要。本文将介绍如何在既有代码基础上,通过依赖倒置(DIP)和控制反转(IoC),实现新增加的代码可以循环引用到…

初学Mybatis之动态 SQL

动态 SQL 是指根据不同的条件生成不同的 SQL 语句 动态 SQL 详情请看链接 搭建环境: mysql 建立博客表 CREATE TABLE blog(id VARCHAR(50) NOT NULL COMMENT 博客id,title VARCHAR(100) NOT NULL COMMENT 博客标题,author VARCHAR(30) NOT NULL COMMENT 博客作者…

SolidWorks 2022安装包下载(图文详细安装教程)

SolidWorks 2022提供了强大的工具和功能,旨在帮助工程师和设计师进行产品设计和工程分析。它具有直观的用户界面和用户友好的操作,使得用户可以快速上手并进行复杂的设计任务。 主要特点和功能包括: 三维建模和装配:SolidWorks 20…

电脑没有摄像头怎么用手机当摄像头?虚拟摄像头使用的详细教程来了(全)

随着科技水平以及全球化经济的快速发展,视频会议、在线课程和直播已经成为日常办公或者生活中必不可少的一个环节。然而,在如今仍有许多台式电脑和一些老旧的笔记本电脑并没有内置摄像头,亦或者自带的摄像头质量不够理想,这使得视…

《python语言程序设计》2018版第6章第19题几何问题点的位置,利用4.31显示如何测试一个点是在一条有向线的左、右还是刚好在线上

# 这个是4.31的代码,一个函数里包含了。在线上,在线左,在线右 def judgePoint(x0, y0, x1, y1, x2, y2):juMethod ((x1 - x0) * (y2 - y0)) - ((x2 - x0) * (y1 - y0))if juMethod > 0:print("p2 is on the left side of the line f…

学习笔记:MySQL数据库操作5

1. 触发器(Triggers) 触发器是数据库的一种高级功能,它允许在执行特定数据库操作(如INSERT、UPDATE、DELETE)之前或之后自动执行一段代码。 1.1 创建商品和订单表 商品表(goods) gid: 商品编号…

Web3.js 4.x版本事件监听详解:从HTTP到WebSocket的迁移

项目场景 在一个使用以太坊区块链技术的项目中,需要监听智能合约的事件,以便在事件触发时能够及时响应。项目中使用了web3.js库的4.x版本,节点使用Geth启动,并通过HTTP与节点进行通信。 问题描述 合约DataStorage.sol文件已经定…