OpenMV实现多色块监测功能、测距功能---robomaster飞镖制导一种思路
OpenMV简介
简单的来说,它是一个可编程的摄像头,通过MicroPython语言,可以实现你的逻辑。而且摄像头本身内置了一些图像处理算法,很容易使用。OpenMV只有30万的像素,通常使用320_240的分辨率来处理图像,OpenMV3 Cam M7采集图像采集图像分辨率最高可以达到640_480,无法获得更高的像素。这使得它支持一些简易的识别算法,而对一般复杂的算法无法提供更多的硬件支持
项目简介
接触到OpenMV是因为团队在robomaster的飞镖系统实现上的一种构想,如果没有外部因素如场地的风、无人机的机翼等因素的干扰,计算模型直接打靶不知道行不行···反正OpenMV很轻便,如果通过识别可以让飞镖进行姿态调整的话也是极好的2333由于目前还没开学!很多想法得不到实验呜呜呜!
代码
目前随便写了个多色块识别(貌似有指示灯),剩下的只能等开学再更了···
# 色块监测 例子
#
# 这个例子展示了如何通过find_blobs()函数来查找图像中的色块
# 这个例子查找的颜色是深绿色import sensor, image, time
from pyb import UART
import json# 颜色追踪的例子,一定要控制环境的光,保持光线是稳定的。
green_threshold = (0, 100, -74, -40, 11, 58)red_threshold = (0, 100, 33, 106, 11, 64)#green_threshold = (45, 70, -60, -40, 20, 60)
#设置绿色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA,
# maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需
#设置(min, max)两个数字即可。sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些
sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡
sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
sensor.set_auto_whitebal(False)
#关闭白平衡。白平衡是默认开启的,在颜色识别中,一定要关闭白平衡。
clock = time.clock() # 追踪帧率
K = 6000
uart = UART(3,115200)while(True):clock.tick() # Track elapsed milliseconds between snapshots().img = sensor.snapshot(1.8) # 从感光芯片获得一张图像blobs = img.find_blobs([green_threshold,red_threshold],pixels_threshold = 24,area_threshold = 5,merge = True)#blobr = img.find_blobs([red_threshold],pixels_threshold = 24,area_threshold = 5,merge = True)#bloba = blobr.add(blobg)if blobs:#如果找到了目标颜色output_str = json.dumps(blobs)for b in blobs: #循环效果不好,会有很多误识别,采用单个矩形采样方便返回坐标#迭代找到的目标颜色区域x = b[0]y = b[1]width = b[2]height = b[3]# Draw a rect around the blob.img.draw_rectangle([x,y,width,height]) # rect#用矩形标记出目标颜色区域img.draw_cross(b[5], b[6]) # cx, cy#在目标颜色区域的中心画十字形标记print('send:',output_str)uart.write(output_str+'\n')Lm = (b[2]+b[3])/2length = K/Lmprint(length)print(clock.fps()) # 注意: 你的OpenMV连到电脑后帧率大概为原来的一半#如果断开电脑,帧率会增加
首先和大家说下!OpenMV的官方里的资料非常的全,绝大多数的问题里面都已经写好教程了,或者可以查阅技术文档
https://book.openmv.cc/
剩下就是代码之间整合一下就OK了,建议大家去下载下OpenMV的环境,很方便,加快开发速度。
比如说这个阈值编辑器,很方便的就可以获取到想要的阈值有木有
然后说下思路8····
我们要实现的是双色检测,即红色和绿色,所以我们需要定义这俩颜色对应的阈值
green_threshold = (0, 100, -74, -40, 11, 58) red_threshold = (0, 100, 33, 106, 11, 64)
然后就是参数的配置,这里在识别颜色的时候一定要关闭白平衡!!否则会出现很多误识别。
sensor.snapshot(1.8)去鱼眼化
接下来就是核心的算法 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)
这个图像的一个类方法,它返回的是很多个色块对象,可以看作是一个list
roi为感兴趣区域
x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2
y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1
invert 反转阈值,把阈值以外的颜色作为阈值进行查找
area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉
merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。
margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并
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)。如果色块类似一个铅笔,那么这个值为0~180°。如果色块是一个圆,那么这个值是无用的。如果色块完全没有对称性,那么你会得到0~360°,也可以通过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()是圆的外接正方形的面积
blobs = img.find_blobs([green_threshold,red_threshold],pixels_threshold = 24,area_threshold = 5,merge = True)
这里我们选择两种颜色,所以需要拼接这两个阈值,使用pixels和area综合来过滤掉细小的像素识别。
然后画出矩形,采用上面的blobs方法可以获取到矩形的中心坐标cx,cy
然后采用JSON传输数据并返回在串行终端里。
output_str = json.dumps(blobs)
因为后期可能需要实现测距功能,我这里提前把测距给写了,运用到的是简单的比例关系,推导在官方文档有。
距离=常数/像素直径
K = 6000
Lm = (b[2]+b[3])/2
length = K/Lm
这三行是主要的测距代码,其中K为常数,是需要测算的。
可以先把测算的物体固定在一个给定距离的位置上,然后再乘以打印出来的小球像素值,即可得到K值。
这里的K值需要不同场景重新测算一遍嗷!!
关于这个像素直径,用勾股定理来算也是可以的。
忘记了···最后附上运行的录屏,串口的json数据就不放上来了···有兴趣想看的同学或者觉得我说的不对的同学可以私信我呀!
OPENMV多色识别
看到这里不容易祝你完事都如意
看到这儿的小伙伴有空的就点个赞吧!不是同一个时间,但是是同一个博客,期待你我下次再会!
OpenMV实现多色块监测功能、测距功能---robomaster飞镖制导一种思路相关推荐
- ThreeJS 测距功能
文章目录 选点绘线 绘制标签 1.使用 TextGeometry 创建标签文字 2. 使用 CSS2DObject 创建标签 动态绘制点.线和标签 绘制辅助线 撤销操作 测距功能,也就是选择两点, ...
- (jQuery,SVG)使用jQuery和svg仿QQ地图测距功能(抛砖引玉)
不久前看到了QQ地图的测距功能,觉得挺好玩的,就思考模仿一下.本来想通过canvas来画图,可惜对canvas不是很熟悉,就准备用svg了,其实我对svg也不是很熟,纯粹是学习. 代码只是简单的生成图 ...
- 高德地图JSAPI测距功能优化
文章目录 前言 测距实现思路 使用测距插件 开启测距 关闭测距 前言 高德提供了一个距离测量插件可直接使用,但是没有完全满足需求.在测距过程中只会显示新增节点到起始点的总长度,而不会在鼠标移动过程中显 ...
- 使用Google地图的测距功能
使用google地图API的测距功能 首先需要引入对应的Google地图的库(drawing,geometry,spherical) 引入方法在 <script src="https: ...
- QML QtLocation地图应用学习-2:实现测距功能
1.实现思路 参照百度or高德地图的测距功能,主要由两种元素组成,标记点和连线. 其中连线很好解决,Qt 提供了 MapPolyline 类型,可以用来绘制折线,并且提供了增删的便捷函数: 对于标记点 ...
- 百度地图 测距功能 DistanceTool 在不同浏览器下标注不一致的解决办法,打开新地图测距不生效的解决办法
1. 在项目中用到百度地图的测距功能,在主页面的地图中用没问题,如果从主页的地图跳转到详情页的地图,在返回到主页,打开地图的测距功能,测距一直不显示.下面是解决办法 将测距功能的工具类函数下载到本地, ...
- 实现MapX的移屏测距功能(转)
本文转载自hi.baidu.com/redpanda/blog/category/Mapx/index/1 实现MapX的移屏测距功能(转) 前一段时间想利用业余时间把MapX的一些功能写出来,特别是 ...
- 实现MapX的移屏测距功能
前一段时间想利用业余时间把MapX的一些功能写出来,特别是移屏测距的功能. 刚开始想的是仿MapInfo的测距功能,打算使用符号工具.折线工具和平移功能实现. 后来经过验证那样的测距方案行不通,主要表 ...
- fmcw matlab仿真,基于SIMULINK的FMCW雷达测距功能仿真.pdf
基于SIMULINK的FMCW雷达测距功能仿真.pdf 全国空气动力测控技术交流会论文集 基于SlMUUNK的FMCW雷达测距功能仿真 也esimulation function ofFMCW dis ...
最新文章
- microsoft 为microbit.org 设计的课程
- 在Clojure中使用class
- 线性回归与梯度下降法
- Nacos外部mysql数据库支持(推荐做)
- mysql bitmap redis_Redis中bitmap的妙用
- arp协议的主要功能是_程序员需要掌握的一些网络协议汇总
- 5.SpringMVC
- I Got a Matrix!
- Pub / Sub本地模拟器
- 不知道自己是否适合做产品经理
- ​Cell:粟硕/施莽团队利用宏转录组揭示“野味”动物携带和人类疾病密切相关的多种病毒...
- 基于高斯分布的异常检测代码实现
- ViewFlipper的简单使用
- hdu 4057(ac自动机+状态压缩dp)
- 188.买卖股票的最佳时机IV
- MATLAB dsolve 函数求解偏微分方程一例
- 福建金森重组_立案调查11个月面纱揭开 福建金森重组涉嫌造假
- 用VC2013编译了一个程序,在Windows 8、Windows 7(64位、32位)下都能正常运行。但在Win XP,Win2003下运行时,却报错不能运行
- 蓝桥杯历年省赛真题汇总及题目详解
- 基于ZFC公理系统的无穷小微积分学
热门文章
- 解决python画图坐标轴数据太密集的问题(显示部分刻度值)
- PDF文件太大怎么变小?分享几个PDF压缩技巧
- Andersen Global在阿塞拜疆增加合作公司
- 关于爬虫平台的架构设计实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现
- ajax轮询需要注意的地方
- 小程序中的button按钮
- Centos7 下载chrome浏览器,建快捷方式
- 高性能图片压缩 —— libjpeg-turbo 的编译与集成
- 内定抽奖小程序_微信小程序抽奖可以内定吗
- 荒岛求生html5地图,《荒岛求生》各种物品使用方法及资源分布一览