基于OpenMV颜色快识别系统的设计与实现(源码+万字报告+部署讲解等)

目录
摘 要 1
Abstract 2
前 言 3
第一章 绪 论 4
1.1 研究背景 4
1.2 国内外现状 4
1.3 本文主要研究内容 5
第二章 OpenMV颜色块识别系统设计的分析 7
2.1 颜色块识别与追踪系统的分析与原理 7
2.2 颜色块测距系统的分析与原理 9
第三章 Python代码的编写 11
3.1 Micro Python语言简介 11
3.2 识别与追踪系统流程图与代码编写 11
3.3 测距系统流程图与代码编写 14
第四章 系统的实现与误差比较 16
4.1 颜色块识别与追踪系统的实现 16
4.2 颜色块测距系统的实现 20
第五章 总结与展望 24
5.1 课题总结 24
5.2 研究展望 24
参考文献 25
致 谢 27

第一章 绪 论

1.1 研究背景
在计算机技术和电子技术的飞速发展的今天,图像作为人类观察世界、了解世界的最主要手段,据统计,人类认知世界有70%-80%的信息是通过图像获取的[1]。随着数字图像处理技术快速发展,OpenCV(Open Source Computer Vision Libraray,开源计算机视觉库)成为在图像处理和计算机视觉方面的热门技术,OpenCV是由C函数以及一部分不多的C++类组成,来实现计算机视觉方面和图像处理的通用算法如3D重建、目标分割、目标识别、特征检测、运动分析、特征跟踪等的由Intel公司资助的开源视觉库[2],也是国内外爱好者使用的视觉模块方便快捷的技术。而OpenMV作为一个集成了一部分OpenCV核心算法的单片机视觉模块,也受到了广大视觉研究爱好者的喜爱。
OpenMV是一个功能强大的机器视觉模块,它相比其他视觉模块,具有开源并且成本低的有点。OpenMV以STM32F767CPU芯片以及OV7725摄像头芯片为核心,在硬件模块看上去很小巧情况下,通过C语言卓效地实现了机器视觉的核心算法。OpenMV还提供Python编程接口,所以可以使用自己编写的Python语言来实现想要的OpenMV的各种不同的机器视觉功能[3]。
寻找色块、人脸检测、眼球检测、边缘检测、目标跟踪等都是OpenMV上的机器视觉算法。这些算法可以用来实现多种功能,包括入侵检测、跟踪标记的目标、残次品筛选、人脸识别跟踪等。一些简单的Python程序的编写,就可以使OpenMV完成各种的任务。轻便灵巧的设计让OpenMV可以应用在更多意想不到的地方,比如设计出具有人脸识别功能的机器人,设计出具有视觉巡线的小车,能感知周边的摄像头等[3]。
本文研究的是基于OpenMV的颜色块识别、追踪与测距系统的设计与实现。

1.2 国内外现状
目前对OpenMV视觉模块的研究,国内外发展势头都很迅猛。
在国内,2010年4月王小波,刘慧英在VC++6.0的环境下,用OpenCV的编程获得了较为理想的车辆轮廓线,实现了的对车辆轮廓的检测[4]。2011年尹俊超、刘直芳对基于OpenMV的运动目标检测和追踪方案进行了研究,最终实现了对一个场景中的多个不同目标同时检测和追踪,提取目标特性并标记出目标的运动轨迹[5]。同年7月,秦小文、温志芳、乔维维等人在研究了OpenCV的特点及结构,并通过图像形态学和平滑处理为例介绍了OpenCV在数字图像处理上的应用[6]。2012年,黄佳提出了基于OpenNI、OpenCV、OpenGL视觉库的检测与跟踪动态目标的检测系统[7]。2013年12月,赵健和张东泉通过分析和优化基于OpenCV的手势识别算法,最终0~9的简单手势识别率可以超过97%[8]。同年12月份,雷建锋和汪伟实现了基于OpenCV的图像阈值分割[9]。2016年,杜聪阐述了OpenCV的特点、运行环境、操作、应用领域等,强调了OpenCV在图形处理技术领域中的重要作用[10]。2016年,郭中华,苑俊英,伍冯洁等人对基于OpenMV人脸识别进行了研究,并将人此技术应用在了智能社区的门禁系统上[11]。同年9月份,李华琛进行了基于OpenCV的图像边缘检测技术的三种不同算子实现边缘检测算法的对比研究[12]。同年11月份,吕昆和金晅宏进行了基于OpenMV的车牌识别的研究并提出了一种很实用的方法[13]。
国外对OpenCV以及OpenMV的研究则更加深入,YAMAMOTO Kenji、SENOH Takanori、KURITA Taiichiro在2010年通过OpenCV成功实现了2D和3D的转换[14]。同年2月,Jun Burden、Malcolm Cleland等人进行了基于OpenCV和Python在自行车赛道上进行团队转换时跟踪单个骑车人的研究[15]。Nvidia也在同年为OpenCV应用程序开发添加GPU加速[16]。2012年,Coombs Joseph、Prabhu等人克服了将OpenCV移植到TI嵌入式ARM + DSP平台的挑战[17]。Kirll Kornyakov在2013年研究了在IOS上使用OpenCV并发布了教学手册[18]。2015年2月,I Wayan Agus Suryawibawa 等人发表了基于Android的OpenCV草药识别[19]。2018年,L Triyono、E H Pratisto等人使用OpenCV的手语翻译器应用程序[20]。

1.3 本文主要研究内容
本文的主要内容是基于OpenMV的颜色块识别、追踪与测距系统的设计与实现。
课题实施主要分为:
1.资料收集以及当前研究现状分析;
2.了解OpenMV视觉模块和Python语言的基本原理;
3.颜色块识别追踪与测距算法的研究;
4系统调试与实验结果分析;
5完善课题设计。
图1-1的设计系统流程图阐述了我在设计这些系统时所采用的算法、各个系统之间的关系以及系统所产生的一些问题。

图1-1 设计系统流程图
第二章 OpenMV颜色块识别系统设计的分析

2.1 颜色块识别与追踪系统的分析与原理
要实现基于OpenMV的颜色块识别与追踪系统的设计,经过查阅资料,我将系统的设计归结于以下几点。
要识别颜色块,首先利用阈值进行二值化,二值图像是经过二值化后的图像亮度值只(0)黑和(255)白两种状态。二值化在图像识别与分析中的地位是十分重要的,这种简单的图像模式,在空间上使它对像素的关系有很好的表现力。因为我们要识别的图像是彩色的,我所使用的是Lab(CIE(Commission International Eclairage,国际照明委员会) 1976(L*,a*,b*)色彩空间的非正式缩写)颜色空间,Lab颜色空间中,L分量代表Luminosity,即照明度,L的取值范围是[0,100],0表示纯黑色,100则代表纯白色;a和b则是两个不同颜色的颜色轴,a的取值范围是[-128,127],-128代表绿色,127代表红色;b的取值范围是[-128,127],-128代表蓝色,127代表黄色。所以我们有(minL, maxL,minA, maxA, minB, maxB)这三个阈值,一共六个值。
图2-1是Lab颜色空间的示意图:

图2-1 Lab颜色空间示意图[21]

然后,进行联通域检索,连通域检索运用八连通域算法,通过对图像进行的逐行逐列的扫描,按照算法一定的规则标记连通区域,来得到对象的个数,同时统计每一个区域所包含的像素个数,再用标尺转换最后就可以得到想要测得的区域面积,在阈值编辑器上使自己想要的目标显示出来,就可以识别所需要的目标颜色块。
实现颜色块的追踪所采用的是CamShift(Continuously AdaptiveMeanShift,不断适应变化)算法,它是由Mean-Shift 算法为基础,在Mean-Shift算法上做了改进,改进后,它能够自主调节搜索窗口的大小以此来适应目标的大小,CamShift算法可以跟踪视频中目标尺寸的变化而进行变化。它是一种半自动追踪算法,需要手动标记出需要追踪的目标。CamShift算法是以视频或者图像中运动目标的颜色信息当做特征作为基本思想,对拍摄的图像的每一张分别用Mean-Shift的的算法运算,而且将上一张图像搜索窗口的大小和目标的正中心作为下一步Mean-shift的搜索窗口大小和中心的起点,再一步一步迭代,最终实现OpenMV对目标颜色块的追踪。因为CamShift算法每一步实施搜索之前就会将搜索窗的大小以及位置设置成目标色块当前的中心的大小和位置,而目标颜色块通常在这区域附近,所以CamShift算法会使搜索时间缩短;另外,当颜色块目标的运动时,颜色每一帧的改变并不会太大(除非发生重大事故),所以CamShift算法的鲁棒性十分良好。图2-2就是CamShift追踪算法的基本流程:

图2-2 CamShift跟踪算法流程

2.2 颜色块测距系统的分析与原理

要实现基于OpenMV的颜色块测距系统,首先得要在2.1颜色块识别与追踪系统的基础上再做出测距的公式加入程序才能获得测距功能。
首先识别颜色块,利用阈值进行二值化,识别彩色图像,使用Lab颜色空间,在OpenMV IDE上得出(minL, maxL,minA, maxA, minB, maxB)六个值。
然后,进行联通域检索,在阈值编辑器上使自己想要的目标显示出来。
接着,用CamShift算法实现颜色块追踪,因为要得出目标颜色块的实时距离,所以得在目标变化的情况下也能测距,所以要在识别和追踪的基础上进行测距。
测距的基本模型原理图如图2-3所示:

图2-3 测距原理模型
图中我们可以发现:
(2.1)
这里为摄像头视角的一半;为纸板高度;为纸板令画面满屏时距离镜头的距离;为摄像头画面上的高度;为假想的画面与镜头的距离。
由公式(2.1)我们可以作变换得:
(2.2)
图中我们还可以得到:
(2.3)
这里是小球边缘与镜头的水平线夹角;是画面中小球的半径;是小球的实际半径;是小球距离镜头的距离,也就是我们要测得的距离。
由公式(2.3)我们可以变换得到:
(2.4)
将公式(2.2)带入公式(2.4)可以得到:
(2.5)
由于在一定情况下是一个定值,所以我们把设为,则公式(2.5)可以变形为:
(2.6)
根据公式(2.6),我们只要设置出的值,并且在识别图像的时候让OpenMV识别出的值,就可以比较轻松地测得OpenMV视觉模块与目标颜色块的距离。
第三章 Python代码的编写
3.1 Micro Python语言简介
Python是一种面向对象的解释型计算机程序设计语言,它由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。设计者开发时总的指导思想是,对于一个特定的问题,只要有一种最好的方法来解决就好了。
Python是纯粹的自由软件,源代码和解释器CPython遵循 GPL(GNU General Public License)协议。
Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写。但是在使用扩展类库时需要考虑平台问题,某些可能不能跨平台的实现。
Python在设计上坚持了清晰划一的风格,这使得Python成为一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。
2017年7月20日,IEEE发布2017年编程语言排行榜:Python高居首位。
Micro Python语言是Python中的一种精简和高效的实现编程语言,它包含了Python标准库的一个小子集,并且进行了在微控制器和受限环境中的运行上的优化。借助Micro Python,用户可以通过编译Python脚本语言来实现硬件底层的访问和控制,比如控制LED灯泡、LCD显示器、访问SD卡、读取电压以及控制电动机等。

3.2 识别与追踪系统流程图与代码编写
根据基于OpenMV的颜色块识别与追踪系统的分析和原理,设计代码实现所需要的程序流程图,如图3-1所示。首先引入摄像头、图像和时间模块,然后设置目标颜色的Lab阈值,接着重置摄像头,调整像素格式、窗口分辨率、摄像头等待时间并关闭白平衡,再开始计时,拍摄图像,调用的snapshot()函数返回一个image对象,如果找到了目标颜色块,就迭代目标并标记出来,最后计算开始计时后到标记目标的时间,并转化为帧率即可。

图3-1 识别与追踪系统流程图

Pyhon设置目标阈值代码的描述:

Pyhon设置摄像头过程代码的描述:

Pyhon计时函数代码的描述:

3.3 测距系统流程图与代码编写
根据基于OpenMV的颜色块测距系统的分析和原理以及前面所说的颜色块识别与追踪的分析和原理,设计出代码实现所需要的程序流程图,如图3-2所示。前面的引入模块和对摄像头的调整都与3.2的识别与追踪系统一样,开始计时后,我们需要用(2.6)所得的距离公式来让OpenMV测出距离,首先设置K 的值,并用识别与追踪系统识别并计算出目标半径,再带入公式(2.6),即可测出目标与摄像头的距离

图3-2 测距系统流程图

Pyhon计时函数代码的描述:

第四章 系统的实现与误差比较

4.1 颜色块识别与追踪系统的实现
首先将编写完成的颜色块识别与追踪的代码并放入OpenMV IDE里,打开摄像头,将目标放在一个背景颜色差异明显的桌面上,如图4-1所示:

图4-1 放置目标

接着我们用矩形框将要识别追踪的目标色块标记,如图4-2所示:

图4-2 用矩形框将标记要识别追踪的目标色块

我们可以看到,图像下方的白色、黄色和蓝色波形就是图像在Lab颜色空间中的表现形式,如图4-3所示

图4-3 图像在Lab颜色空间中的表现形式

然后我们用阈值编辑器进行图像的处理,打开工具 Tool -> 机器视觉 Machine Vison -> 阈值编辑器 threshold editor,将图3-2上Lab的阈值在阈值编辑器里表示出来,我们可以看到,在Lab阈值范围在(60, 77, 0, 18, -58, -25)时,图像已经可以较为清晰地显示出来,且没有什么背景混在图形里,如图4-4所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值