openmv4系列7----寻找色块
openmv4系列7----寻找色块
1、find_blobs函数
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)
参数解释:
- thresholds是颜色的阈值,注意:这个参数是一个列表,可以包含多个颜色。如果你只需要一个颜色,那么在这个列表中只需要有一个颜色值,如果你想要多个颜色阈值,那这个列表就需要多个颜色阈值。注意:在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。
- 示例
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)
img=sensor.snapshot()
red_blobs = img.find_blobs([red])
color_blobs = img.find_blobs([red,blue, yellow])
roi是“感兴趣区”。示例:
left_roi = [0,0,160,240]
blobs = img.find_blobs([red],roi=left_roi)x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10:
blobs = img.find_blobs([red],x_stride=10)y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5:
blobs = img.find_blobs([red],y_stride=5)invert 反转阈值,把阈值以外的颜色作为阈值进行查找
area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉
merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。- 示例
all_blobs = img.find_blobs([red,blue,yellow],merge=True)
red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs =img.find_blobs([yellow],merge=True)
- margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。
2、阈值
一个颜色阈值的结构是这样的:
red = (minL, maxL, minA, maxA, minB, maxB)
元组里面的数值分别是L A B 的最大值和最小值。
获取阈值步骤:工具 → 机器视觉 → 阈值编辑器 → 帧缓冲区
然后拖动六个滑块,可以实时的看到阈值的结果,我们想要的结果就是,将我们的目标颜色变成白色,其他颜色全变为黑色。
3、blob色块对象
blob有多个方法:
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)。如果色块类似一个铅笔,那么这个值为0180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0360°,也可以通过blob[7]来获取。
blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:
blobs = img.find_blobs([red, blue, yellow], merge=True)
如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。
blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。
blob.area() 返回色块的外框的面积。应该等于(w * h)
blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。
比如,识别一个红色的圆,返回的blob.pixels()是目标圆的像素点数,blob.area()是圆的外接正方形的面积。
4、blobs
find_blobs对象返回的是多个blob的列表。(注意区分blobs和blob,这只是一个名字,用来区分多个色块,和一个色块)。
列表类似与C语言的数组,一个blobs列表里包含很多blob对象,blobs对象就是色块,每个blobs对象包含一个色块的信息。
blobs = img.find_blobs([red])
blobs就是很多色块。
可以用for循环把所有的色块找一遍。
for blob in blobs:print(blob.cx())
5、参考代码
1. 寻找同种颜色的色块
import sensor, image, timethreshold = [(4, 48, 28, -128, 28, 87)] #暗黄色的阈值sensor.reset() #初始化传感器
sensor.set_pixformat(sensor.RGB565) #传感器色彩
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000 ) #开机跳过一些时间
sensor.set_auto_whitebal(False) #关闭白平衡clock = time.clock() #获取时钟while(True):clock.tick()img = sensor.snapshot() #拍照blob = img.find_blobs(threshold, area_threshold=300, margin=10)#寻找对应阈值的色块,阈值小于300像素的色块过滤掉,合并相邻像素在10个像素内的色块if blob: #如果找到了目标颜色FH = bytearray([0xb3,0xb4]) for b in blob:#迭代找到的目标颜色区域img.draw_cross(b[5], b[6]) #画十字 cx,cy
# blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
# blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。img.draw_edges(b.min_corners(), color=(0,255,0))#画框
blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
blob.cy()返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。
2. 多颜色跟踪示例
# 寻找不同颜色的色块
import sensor, image, time# 颜色跟踪阈值(L Min, L Max, A Min, A Max, B Min, B Max)
# 下面的阈值跟踪一般红色/绿色的东西。你不妨调整他们...
thresholds = [(47, 68, 55, 103, 25, 63), # red_thresholds(60, 75, -80, -40, 30, 50), # green_thresholds(29, 49, -5, 25, -63, -35)] # blue_thresholdssensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
sensor.set_vflip(True)
sensor.set_hmirror(True)
clock = time.clock()# 只有比“pixel_threshold”多的像素和多于“area_threshold”的区域才被
# 下面的“find_blobs”返回。 如果更改相机分辨率,
# 请更改“pixels_threshold”和“area_threshold”。 “merge = True”合并图像中所有重叠的色块。while(True):clock.tick()img = sensor.snapshot().lens_corr(1.8) for blob in img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200):img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())print(clock.fps())
openmv4系列7----寻找色块相关推荐
- openmv4系列2----镜头讨论
openmv4系列2----镜头讨论 1.镜头的选择 openmv常见的使用的镜头有OV7725.OV2640.OV5640.OV9640.MT9V034这几种. OV7725:是一款30W像 ...
- 用python的OpenCV库写一个寻找色块的代码
使用OpenCV库写一个寻找色块的代码可以通过以下几步实现:1.导入OpenCV库:2. 读取图像并转换成HSV格式:3. 设定色块的颜色范围:4. 根据设定的颜色范围,使用inRange函数来判断每 ...
- 递归算法学习系列之寻找第K大
概述 国人向来喜欢论资排辈的,每个人都想当老大,实在当不成,当个老二,老三,老K也不错,您一定看过这样的争论: 两个人吵架,一个人非常强势,另外一个忍受不住了便说:"你算老几呀?" ...
- libjpeg库的简单使用,rgb565与rgb888互转,以及色块的寻找
最近用的摄像头OV2640摄像头,支持RGB565.JPEG.YUV和YCbCr格式的输出,想要对采集的图像进行色块识别,这样一般需要用到RGB格式的输出会比较好处理,数字图像处理中常用的采用模型是R ...
- 华为P50系列再曝“坏消息”:疑似再度延期至7月份
华为的新一代P50系列旗舰的发布时间已经多次延期,此前据称已被推迟至6月份,不过现在又一次传来坏消息,P50系列的发布可能会继续延期到7月份. 据知名名数码博主@菊厂影业Fans 最新防擦不的信息显示 ...
- 强化学习(二)--动态规划寻找最优策略
动态规划是强化学习里面最基础的部分,其核心思想-通用策略迭代(Generalized Policy Iteration,GPI) 注意: 动态规划(Dynamic Programming)要求一个完全 ...
- SDUT_人活着系列
SDUT2929_人活着系列之芳姐和芳姐的猪 解题报告 求出所有最短路,枚举一个猪圈求出到有猪的猪圈的总路程最短. #include <queue> #include <cstdio ...
- OPenMV识别颜色识别物块及检测二维码的进阶应用
OPenMV摄像头入门与识别颜色物块及二维码的进阶应用 OpenMV简介 简单的来说,它是一个可编程的摄像头,通过MicroPython语言,可以实现你的逻辑. 而且摄像头本身内置了一些图像处理算法, ...
- 滚球经验总结(PID)
1.正点原子STM32F407探索者 + openmv3--串口通信 最近在用stm32f407探索者做滚球,一开始使用的摄像头是openmv3(openmv4太贵)--实时检测小球坐标(x,y),然 ...
最新文章
- bootsrap Glyphicons 字体图标
- 支付系统的对账处理与设计--转
- Nginx 反向代理及 Cookie 相关问题
- channelread0会被调用两次_值得一看:C#同步方法中如何调用异步方法?
- vscode较详细注释的汇编语言hello world 输出程序,第一个汇编程序
- c语言数据结构kmp中next计算,数据结构——关于KMP算法中next函数的详细解析
- 使用LXCFS实现容器资源的视图隔离
- [转]『TensorFlow』读书笔记_TFRecord学习
- 2021-08-10基于人脸识别的学生签到系统
- 推荐24款好用的数据可视化分析工具,个个堪称神器!
- 解决FTP服务器FileZilla server中文乱码问题
- 使用ROS或Iptables作为ADSL上网路由器时,部分网站无法打开的问题
- 主力吸筹猛攻指标源码_通达信主力吸筹副图指标公式,通达信主力追踪副图源码...
- 游戏策划在游戏的开发过程中扮演什么角色?——游戏策划入门
- Latex Beamer 入门教程
- 全网最简单的方法QQ透明头像设置方法(小白教程)几分钟搞定
- 计算机五个盘,我的电脑分区分了5个盘。怎么办?
- 20190401工作计划
- (翻译)峰终定律(Peak-end rule)
- MATLAB学习第二天(基础语法、变量、命令以及新建自己文件)
热门文章
- D-link des-3828三层交换机入门设置
- TP5对接免签FM支付接口
- sorce insight 4.0 编辑程序不更新下载如何设置
- java方法及变量的调用
- 后台管理系统vue-i18n中英文切换功能
- [机器学习导论]—— 第四课——决策树
- R语言read.csv乱码问题UTF-8 BOM X.U.FEFF
- 如何理解机器人学习和研究中的存量和增量
- 51单片机STC89C52控制LED闪烁(将延时程序写成子函数有形参)
- springboot+微信小程序大学校园网上图书馆信息管理系统的设计与实现毕业设计源码091535