大家好,我是杰杰。

实在不好意思,最近比较忙,之前说的连载现在才更新出来。

从上一篇openmv的学习中openmv学习之旅①
我们可以很简单运用micropython在openmv上做我们想做的事情。

Python这个东西用起来是很简单的,,下面来说说改善色块追踪的算法

先做个改善前的分析吧:

改善前:


API:find_blobs

  • thresholds是颜色的阈值。这个参数是一个列表,可以包含多个颜色。在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。

  • roi是“感兴趣区”。

  • x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2。

  • y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1。

  • area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉。

  • pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉

  • merge 合并,如果设置为True,那么合并所有重叠的blob为一个。 注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。

    1blobs = img.find_blobs([red])

find_blobs对象返回的是多个blob的列表。

而一个blobs列表里包含很多blob对象,blobs对象就是色块,每个blobs对象包含一个色块的信息。

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会对应每一个阈值。

    (上面的知识在openmv的官网上都有说明)

下面是说说调用find_blobs来做色块的追踪的原理

它是全幅图像扫描,它有优点也有缺点

先说说优点吧:信息全面,全幅图像的搜索,把所有色块都搜索进来了

但是缺点也不少:①:运算的速度,是很慢的,有些地方我们根本不需要扫描它。

②:色块的数量,很多时候,会有很多延时差不多的色块过来干扰,导致追踪失败。

源码:

 1import sensor, image, time
 2red_threshold_01 = (0, 35, 0, 50, -10, 40)
 3sensor.reset()
 4sensor.set_pixformat(sensor.RGB565)
 5sensor.set_framesize(sensor.QVGA)
 6sensor.skip_frames(10)
 7sensor.set_auto_whitebal(False)
 8clock = time.clock()
 9while(True):
10    clock.tick()
11    img = sensor.snapshot()
12    blobs = img.find_blobs([red_threshold_01],
13                             area_threshold=150)
14    if blobs:
15    #如果找到了目标颜色
16        print(blobs)
17        for b in blobs:
18        #迭代找到的目标颜色区域
19            # Draw a rect around the blob.
20            img.draw_rectangle(b[0:4]) # rect
21            #用矩形标记出目标颜色区域
22            img.draw_cross(b[5], b[6]) # cx, cy
23            #在目标颜色区域的中心画十字形标记
24    print(clock.fps())


效果图:

运算速度:

从拍摄完到扫描完,每秒只能处理二十多帧图像,而且是简单的处理。

虽然脱机运行速度可以快一倍。但是还是比较慢的。

肯定要改进啊。

以下是改进扫描算法的思想:

①:首先做一次全幅图像的扫描,找到我们需要的色块。

②:我们得到色块的信息:如色块的长、宽、及色块的位置

③:我们只扫描色块周围的区域(ROI)

④:假设在新的ROI找不到我们需要的色块,就重新来。

这个方法类似于飞思卡尔的边缘检测。

其实这个改进是非常简单的。因为我们需要的东西在microPython中全部都有。

只需要拿到find_blobs的返回的东西就好啦。

算法示意图

绿色的是我们追踪的色块,

而红色的框是我们第一次全局扫描得到的东西

那么我们只需在红色的框之外做一次扫描就能得到绿色块啦

实现的源码

 1import sensor, image, time
 2#red_threshold_01 = (45, 100, -60, 80, 34, 91)
 3red_threshold_01 = (21, 29, -72, 6, -11, 17)
 4sensor.reset()
 5sensor.set_pixformat(sensor.RGB565)
 6sensor.set_framesize(sensor.QVGA)
 7sensor.skip_frames(20)
 8sensor.set_auto_whitebal(False)
 9#关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡
10clock = time.clock()
11img = sensor.snapshot()
12blobs = img.find_blobs([red_threshold_01],
13                         area_threshold=150)
14last_blobs = blobs
15while(True):
16    clock.tick()
17    img = sensor.snapshot()
18    if last_blobs:
19         for b in blobs:
20            x1 = b[0]-7
21            y1 = b[1]-7
22            w1 = b[2]+12
23            h1 = b[3]+12
24            #print(b.cx(),b.cy())
25         roi2 = (x1,y1,w1,h1)
26         print(roi2)
27         blobs = img.find_blobs([red_threshold_01],
28                                    roi = roi2,
29                                    area_threshold=1000)
30         last_blobs = blobs
31    else:
32        blobs = img.find_blobs([red_threshold_01],
33                                    area_threshold=1000)
34        last_blobs = blobs
35    if last_blobs:
36        #如果找到了目标颜色
37        #  print(blobs)
38        for b in last_blobs:#迭代找到的目标颜色区域
39            img.draw_rectangle(b[0:4])
40            img.draw_cross(b[5], b[6])
41    print("帧率 : ",clock.fps()) 

改善后的帧率的确是快了不少的:基本能快一倍以上,当然,物体在图片越大,处理的速度会越慢。

帧率达到了  45  ,并且,对于运动中的物体,也能很好的追踪出来,减少无关物体的干扰。

按照这个思想,我们还能把这个物体分成四条边来扫描:

那么是不是只需要扫描到这个物体的四条边,并且证明四条边的点都有重合,那么,我们就能知道这个物体是一个整体从而得到物体的位置。。。。

当然,这只是想法。对于程序员任何的功能想法的实现都需要代码的实现,这代码我就不实现了,有兴趣的可以试试。。。

openmv学习之旅②之色块追踪算法的改善相关推荐

  1. 我的Java开发学习之旅------Java经典排序算法之希尔排序

    一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名. Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔 ...

  2. 我的Java开发学习之旅------Java经典排序算法之二分插入排序

    一.折半插入排序(二分插入排序) 将直接插入排序中寻找A[i]的插入位置的方法改为采用折半比较,即可得到折半插入排序算法.在处理A[i]时,A[0]--A[i-1]已经按关键码值排好序.所谓折半比较, ...

  3. 论文学习-卫星视频与目标追踪-1-融合KCF跟踪器和三帧差算法

    论文学习-卫星视频与目标追踪-1 大家好,近来一直在研究基于视频卫星的目标追踪领域.为了更好地梳理自己的论文学习过程,故采用博客的方式记录下来.接下来我会将此领域一些我觉得典型的有意义的论文,以我自己 ...

  4. Unity人工智能学习—确定性AI算法之追踪算法三

    CSDN个人博客地址,凯尔八阿哥栏http://blog.csdn.net/zhangxiao13627093203,转载请注明出处 接下来就是要进行更为精准更智能的追踪.因此,在接下来的代码演示De ...

  5. 2019电赛--OpenMV学习笔记

    此文章在我的博客链接:https://sublimerui.top/archives/f10b0e1a.html NOTES:2019电赛结束啦~辛辛苦苦4天后,现已经写成了针对题目的OpenMV总结 ...

  6. hadoop学习之旅1

    大数据介绍 大数据本质也是数据,但是又有了新的特征,包括数据来源广.数据格式多样化(结构化数据.非结构化数据.Excel文件.文本文件等).数据量大(最少也是TB级别的.甚至可能是PB级别).数据增长 ...

  7. 基于设计模式的学习之旅-----访问者模式(附源码)

    基于设计模式的学习之旅-----访问者模式 1.初始访问者模式 2.什么是访问者模式 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 3.模 ...

  8. 大数据技术 学习之旅_数据-数据科学之旅的起点

    大数据技术 学习之旅 什么是数据科学? (What is Data Science?) The interesting thing about Data Science is that it is a ...

  9. 大数据技术 学习之旅_为什么聚焦是您数据科学之旅的关键

    大数据技术 学习之旅 David Robinson, a data scientist, has said the following quotes: 数据科学家David Robinson曾说过以下 ...

最新文章

  1. Spring Cloud微服务笔记(一)微服务与云概念
  2. 机器学习导论(张志华):正定核性质
  3. go语言编程小游戏--贪吃蛇
  4. YBTOJ洛谷P4068:数字配对(网络流)
  5. C++ STL 容器之 deque简单使用
  6. GIT和GitHub的使用总结
  7. 亚信安全中标南方电网网络架构优化调整项目 智能联动抑制未知威胁
  8. mysql neatbean_使用MySQL的NetBeans中的SQL语法错误
  9. hadoop工作流引擎azkaban
  10. java中将Excel转图片
  11. svm 10折交叉验证 matlab,怎么用10折交叉验证程序?
  12. 高考方向计算机基础试题题库,计算机基础考试题库 计算机基础考试题库(含答案).doc...
  13. SPSS中系统聚类操作案例
  14. 信息系统项目管理师考试论文写作复习笔记(4)-范围管理论文2
  15. ae渲染出现错误是什么问题_AE 渲染输出 “H264”时出现这个错误是什么意思?...
  16. 工作队列模式(任务队列)| RabbitMQ系列(二)
  17. %f 与 %lf的区别
  18. 批量识别图片文字并存为Excel,几行Python轻松实现!
  19. 一名大学毕业生的反思_反思我大学毕业时的软件工程师的第一年
  20. NMOS管与PMOS管区别

热门文章

  1. 2019 年最佳 Linux 笔记本电脑发行版 top10
  2. h5 使用canvas实现电子签名和图片的保存
  3. Vue2 Element | 一文带你快速搭建网页界面UI
  4. ORACLE updata是提示违反唯一约束条件
  5. Fail to allocate bitmap
  6. ansys 服务器无响应,ansys链接不到本地服务器
  7. ES7和 ES8 一览
  8. 解决OBS录屏软件窗口采集不全的问题
  9. SWFAddress实现Flex深度链接(不同模块具有不同的URL)
  10. docker(5、网络2) 1、容器间通信的三种方式 2、 容器如何访问外部 3、 外部如何访问容器