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飞镖制导一种思路相关推荐

  1. ThreeJS 测距功能

    文章目录 选点绘线 绘制标签 1.使用 TextGeometry 创建标签文字 2. 使用 CSS2DObject 创建标签 动态绘制点.线和标签 绘制辅助线 撤销操作   测距功能,也就是选择两点, ...

  2. (jQuery,SVG)使用jQuery和svg仿QQ地图测距功能(抛砖引玉)

    不久前看到了QQ地图的测距功能,觉得挺好玩的,就思考模仿一下.本来想通过canvas来画图,可惜对canvas不是很熟悉,就准备用svg了,其实我对svg也不是很熟,纯粹是学习. 代码只是简单的生成图 ...

  3. 高德地图JSAPI测距功能优化

    文章目录 前言 测距实现思路 使用测距插件 开启测距 关闭测距 前言 高德提供了一个距离测量插件可直接使用,但是没有完全满足需求.在测距过程中只会显示新增节点到起始点的总长度,而不会在鼠标移动过程中显 ...

  4. 使用Google地图的测距功能

    使用google地图API的测距功能 首先需要引入对应的Google地图的库(drawing,geometry,spherical) 引入方法在 <script src="https: ...

  5. QML QtLocation地图应用学习-2:实现测距功能

    1.实现思路 参照百度or高德地图的测距功能,主要由两种元素组成,标记点和连线. 其中连线很好解决,Qt 提供了 MapPolyline 类型,可以用来绘制折线,并且提供了增删的便捷函数: 对于标记点 ...

  6. 百度地图 测距功能 DistanceTool 在不同浏览器下标注不一致的解决办法,打开新地图测距不生效的解决办法

    1. 在项目中用到百度地图的测距功能,在主页面的地图中用没问题,如果从主页的地图跳转到详情页的地图,在返回到主页,打开地图的测距功能,测距一直不显示.下面是解决办法 将测距功能的工具类函数下载到本地, ...

  7. 实现MapX的移屏测距功能(转)

    本文转载自hi.baidu.com/redpanda/blog/category/Mapx/index/1 实现MapX的移屏测距功能(转) 前一段时间想利用业余时间把MapX的一些功能写出来,特别是 ...

  8. 实现MapX的移屏测距功能

    前一段时间想利用业余时间把MapX的一些功能写出来,特别是移屏测距的功能. 刚开始想的是仿MapInfo的测距功能,打算使用符号工具.折线工具和平移功能实现. 后来经过验证那样的测距方案行不通,主要表 ...

  9. fmcw matlab仿真,基于SIMULINK的FMCW雷达测距功能仿真.pdf

    基于SIMULINK的FMCW雷达测距功能仿真.pdf 全国空气动力测控技术交流会论文集 基于SlMUUNK的FMCW雷达测距功能仿真 也esimulation function ofFMCW dis ...

最新文章

  1. microsoft 为microbit.org 设计的课程
  2. 在Clojure中使用class
  3. 线性回归与梯度下降法
  4. Nacos外部mysql数据库支持(推荐做)
  5. mysql bitmap redis_Redis中bitmap的妙用
  6. arp协议的主要功能是_程序员需要掌握的一些网络协议汇总
  7. 5.SpringMVC
  8. I Got a Matrix!
  9. Pub / Sub本地模拟器
  10. 不知道自己是否适合做产品经理
  11. ​Cell:粟硕/施莽团队利用宏转录组揭示“野味”动物携带和人类疾病密切相关的多种病毒...
  12. 基于高斯分布的异常检测代码实现
  13. ViewFlipper的简单使用
  14. hdu 4057(ac自动机+状态压缩dp)
  15. 188.买卖股票的最佳时机IV
  16. MATLAB dsolve 函数求解偏微分方程一例
  17. 福建金森重组_立案调查11个月面纱揭开 福建金森重组涉嫌造假
  18. 用VC2013编译了一个程序,在Windows 8、Windows 7(64位、32位)下都能正常运行。但在Win XP,Win2003下运行时,却报错不能运行
  19. 蓝桥杯历年省赛真题汇总及题目详解
  20. 基于ZFC公理系统的无穷小微积分学

热门文章

  1. 解决python画图坐标轴数据太密集的问题(显示部分刻度值)
  2. PDF文件太大怎么变小?分享几个PDF压缩技巧
  3. Andersen Global在阿塞拜疆增加合作公司
  4. 关于爬虫平台的架构设计实现和框架的选型(二)--scrapy的内部实现以及实时爬虫的实现
  5. ajax轮询需要注意的地方
  6. 小程序中的button按钮
  7. Centos7 下载chrome浏览器,建快捷方式
  8. 高性能图片压缩 —— libjpeg-turbo 的编译与集成
  9. 内定抽奖小程序_微信小程序抽奖可以内定吗
  10. 荒岛求生html5地图,《荒岛求生》各种物品使用方法及资源分布一览