基于MATLAB的战术手势识别功能的设计与实现

摘 要

手势识别技术是人们生活中常见的一类图像处理技术,也是目前比较火热的研究领域之一,手势识别可以用于人们生活中各种场景,比如利用手势进行电视信息交互,只需要通过手势就能实现对电视机的控制;在很多的VR游戏中,利用手势可以完成各种各样的游戏动作。总之手势识别技术在图像处理高速发展的情况下,变得越来越成熟,识别率以及识别速度也逐步提高,相信在不久的将来,手势识别技术一定会发挥更大的作用。

为便于官兵在训练中加强对手语的记忆掌握,根据不同的战术背景不同的手语需要,本文通过对手势识别算法的研究,开发出了基于MATLAB的战术手势识别功能。针对手势识别的实现,本文中首先研究了图像的预处理技术,通过对采集的战术手势图像的预处理,为后续的战术手势图像处理打下基础。接着研究手势图像的分割算法,本文中主要针对手势图像的连通域进行分析,从而将手势图像从背景中分割出来。而后将分割出的战术手势图像进行特征提取,采用手势图像的Hu不变矩以及空间几何特征作为图像的特征。最后利用BP神经网络训练图像特征,得到最终识别结果。算法高效且准确,同时开发了基于MATLAB的GUI界面,用户交互良好,界面美观,具有一定的实用价值。

关键词:MATLAB;图像处理;手势识别;GUI

目 录

摘 要 I

ABSTRACT III

目 录 V

图 目 录 IX

表 目 录 XI

第一章 绪 论 1

1.1 选题背景与研究意义 1

1.2 国内外研究现状 2

1.3 本文研究内容 3

1.4 本文研究组织结构 4

第二章 相关概念和技术 5

2.1 MATLAB语言相关概念 5

2.2 图像处理相关原理 6

2.2.1 图像处理基本概念 6

2.2.2 图像识别基本方法 7

2.3 图像处理基本方法 8

2.3.1 图像颜色空间转换 8

2.3.2 图像二值化法 8

2.3.3 图像的形态学操作 9

2.4 图像分割基本方法 10

2.4.1 常用的图像分割法 10

2.4.2 基于二值化图像的连通域分析 11

2.5 手势图像识别相关原理 12

2.5.1 手势识别基本概念 12

2.6 人工神经网络基本原理 13

2.6.1 基于BP神经网络的图像识别 15

2.7 图形用户界面GUI相关原理 16

2.8 本章小结 16

第三章 基本框架与功能设计 17

3.1 需求分析 17

3.2 可行性分析 18

3.2.1 技术可行性 18

3.2.2 经济可行性 18

3.2.3 操作可行性 18

3.3 战术手势识别功能基本框架与功能设计 19

3.3.1 战术手势识别框架设计 19

3.3.2 战术手势识别功能设计 22

3.4 GUI用户使用界面基本框架与功能设计 22

3.4.1 GUI用户使用界面框架设计 22

3.4.2 GUI用户使用界面功能设计 24

3.5 本章小结 25

第四章 图像处理和手势识别的实现 27

4.1 战术手语的编成和设计 27

4.2 手势图像预处理 30

4.2.1 手势图像颜色空间转换 30

4.2.2 图像二值化 31

4.2.3 形态学操作 32

4.2 图像分割 32

4.2.1 基于连通域的手势图像分割 33

4.3 图像特征提取 34

4.3.1 几何不变矩-Hu矩 35

4.3.2 空间几何特征 36

4.4 BP神经网络训练 36

4.5 本章小结 38

第五章 GUI用户使用界面的实现 39

5.1 GUI设计相关参数和函数 39

5.2 创建GUI图形用户界面 43

5.2.1 GUI图形用户界面创建 44

5.3 设计和实现战术手势识别用户使用界面 48

5.3.1 用户识别界面的构建 48

5.4 本章小结 56

第六章 战术手势识别功能的测试与分析 59

6.1 系统的测试与分析 59

6.2 战术手势识别功能测试 59

6.2.1 战术手势识别功能测试(一) 59

6.2.2 战术手势识别功能测试(二) 67

6.3 测试结果分析 76

6.4 本章小结 76

第七章 总结与展望 79

7.1 总结 79

7.2 展望 79

致 谢 81

附 录 83

附录一 功能完整设计与实现代码 83

附录二 手势图像训练代码 88

附录三 手势图像处理代码 90

参考文献 95

个人简历和在学期间的研究成果 97

图 目 录

图2-1 连通域示意图 11

图2-2 生物神经元结构 13

图2-3 神经元模型结构 14

图2-4 单层的神经网络图 15

图3-1 战术手势识别总体框架 19

图3-2 战术手势识别简化后框架 20

图3-3 MATLAB神经网络 21

图3-4 MATLAB神经网络(翻译后) 21

图3-4 MATLAB神经网络框图 22

图3-5 GUI用户使用界面框架 23

图4-1 HSV处理后的手势图像 30

图4-2 二值化后手势图像 31

图4-3 形态学操作后的手势图像 32

图4-4 连通域示意图 33

图4-5 手势分割图像 34

图4-6 图像的几何特征 36

图4-8 神经网络训练结果 37

图5-1 新建GUIDE文件选择界面 44

图5-2 GUI主窗口 45

图5-3 GUI基础设计流程 45

图5-4 GUI基础设计属性 46

图5-5 GUI基础设计代码1 46

图5-6 GUI基础设计代码2 47

图5-7 处理结果图 47

图5-8 初步搭建用户使用界面 49

图5-9 初步搭建用户使用界面展示 49

图5-10 战术手势识别系统用户使用界面 50

图5-11 进入读取视频按钮回调函数 51

图5-12 打开图片回调函数 51

图5-13 选择视频文件对话框 52

图5-14 读取手势视频后结果 54

图5-15 录入视频识别成功 54

图6-1 第一组测试视频 60

图6-2 第二组测试结果 60

图6-3 第三组测试结果 61

图6-4 第四组测试结果 61

图6-5 第五组测试结果(mp4) 62

图6-6 第五组测试结果(avi) 62

图6-7 第五组视频属性对比 63

图6-8 第五组分割后图像属性对比 64

图6-9 第六组测试结果 65

图6-10 断点运行后结果 66

图6-11 第二次训练结果 66

图6-12 第六组修正后训练结果 67

图6-13 排列组合结果 67

图6-14 100组测试视频 68

图6-15 100组测试音频(截取部分) 68

图6-16 有效测试数组(97组)测试时间分布图 74

表 目 录

表4-1 战术手语表 27

表4-2 战术手语编成表 29

表5-1 GUI函数属性表 40

表6-1 第一组数组测试结果(1-20) 69

表6-2 第二组数组测试结果(21-40) 70

表6-3 第三组数组测试结果(41-60) 71

表6-4 第四组数组测试结果(61-80) 72

表6-5 第五组数组测试结果(81-100) 73

第一章 绪 论

1.1 选题背景与研究意义

武警部队作为国家重要武装力量,履行着国家赋予的神圣使命,在执行解救人质、捕歼暴恐分子等任务时,确保良好的通信联络是分队行动中通信保障的重点。低劣的通信质量在实战中将导致分队无法及时得到上级行动命令、失去对战场情况的把控,指挥部无法及时了解作战情况,造成整个行动指挥的失控,最终导致丢失战场控制权,进而完全丧失战斗力。

随着现代技术的发展,各种无线、有线通信联络方式飞速发展,有效保障了分队行动中的良好通信联络。但是,战场环境的多变导致依靠无线电波等技术的通信联络具有较高的不确定性,其受地形、天气等要素的影响较多,同时也易遭到敌方势力的电子对抗打击从而降低甚至破坏我方通信联络效能。故此,作为分队行动中的战术手势通信不可或缺。

战术手势识别主要是以战术手势几何特征检验为前提,是通过探究对应的手势图像几何形状轮廓,结合相关特性来判断战术手势所蕴含的意义。就好比人在对另外一个战术手势进行识别的时候,往往需要访问自己大脑里面的记忆库,对相应的特征进行比对之后,如果与相关记忆库识别比对成功,就能够识别出战术手势的含义,如果该对象的特征无法被匹配,那么说明无法识别。

在民用领域中,识别人手部动作并给予相应反馈的手势识别研究,应用前景及潜藏的经济价值不可估量。如果能将该技术运用在军事方面,可以有效的提升部队现代化水平,提高部队对于信息的反应和处理能力,进而进一步提升单兵作战能力,减少物资和人员的消耗,全面提升战斗力。对于武警部队而言,分队战术手势识别技术可以广泛的被应用在反恐作战、防卫作战、处突维稳、日常执勤、看押看守等各个方面,分队战术手势识别的研究处于模式识别、图像处理、机器学习和计算机语言等多学科领域交叉地带,综合性很强。战术手势研究典型的应用领域有:智能控制、运动分析、虚拟现实等。通过战术手势识别技术的发展,可以实现人机通过手势变换进行交互,通过手势直接无线控制PC等电子产品;在文体活动中,手势识别也大放异彩,通过运动分析及手势分析可以极大地提高运动与舞蹈训练水平;手势分析同样可以帮助视频会议达到更好的效果,降低人物动画制作成本,或者帮助世界上不同区域的人利用互联网组成一个线上工作团队。

围绕武警部队在各类战斗、任务中的战术手势的重要性,每一名战斗在一线官兵都应该对战斗中所使用的战术手语非常熟悉,以真正达到传递信息、通信联络的作用。而常用的、熟悉的战术手语已经不具备较好的保密性和安全性,所以每一场战斗或者任务都应该将新编战术手语作为一项重要的准备工作来完成。那么设计规定好战术手语后,提高官兵的记忆效率,确保战斗或者执行任务过程中战术手语的有效正确运用便至关重要。选题即围绕战术手势的识别功能,以MATLAB为基础展开研究和设计。为便于官兵在训练中加强对手语的记忆掌握,根据不同的战术背景不同的手语需要,针对特战小队在实际任务中可以运用到的手语联络方式进行设计研究,通过自拟暗语进行训练测试,完成了基于MATLAB的战术手语的识别功能的设计与实现。

1.2 国内外研究现状

手势识别的研究起步于20世纪末,由于计算机技术的发展,特别是近年来虚拟现实技术的发展,手势识别的研究也到达一个新的高度。熵分析法是韩国的李金石、李振恩等人通过从背景复杂的视频数据中分割出人的手势形状,然后计算手型的质心到轮廓边界的距离从而识别手势的方法,该方法具有较好的识别率,在对6个实验样本的测试中,结果显示其正确识别率近乎百分百。印度人米娜克氏在基于视觉手势识别的基础上进一步研究,提出一种基于结构特征的手势识别算法。该算法包括去除背景、方向检测。手指检测以及手指的数量进行检测,最终确定手势。于成龙等采用基于视觉的组合特征进行手势识别,通过手掌的大小长度、质心、长宽比等人手的属性值结合使用,使得识别率得到极大提升。

对于手势识别的研究不仅仅限于大学或者是研究院等机构,众多的大型公司机构也纷纷加入到手势识别研究以及应用的行列。在多伦多2014年举行的“计算机人机互动大会”上,微软向世界展示了一款运动传感键盘,该键盘实现了对用户悬空手势进行的识别。该款键盘被命名为Type-Hover-Swipe键盘,它集成了64个传感器,每个传感器位于键盘的格子中间。当用户将手指悬停在键盘上方时,键盘会根据用户手指的运动进行识别,这样就可以实现用户以一种舒服的姿势进行手势操作。而Xbox则是微软比较成熟的商业化手势甚至是身体的识别。作为芯片生产巨头,Intel公司也积极参与到手势识别的大军中来。其中开源的图像处理OpenCV类库以及Realsense设备都是他们在此领域的研究成果。

国内高校及研究院对于手势识别也有着许多成就,哈尔滨工业大学的吴江琴、高文等人通过ANN与HMM的混合方法的手语训练识别方法,增加了识别方法的分类特征,同时使得模型的估计参数大幅减少,提高了效率。在实际运用中,使用ANN-HMM混合方法的中国手语识别系统中,孤立词语的识别率为90%,简单语句的识别率为92%。另外,天津大学的研究人员通过对操作者的体态动作图像信息进行处理使其能够控制机器人的运动、答复等状态。清华大学的研究人员将识别率较高的手势类型(例如数字手语)作为人机交互的信号,并将其应用于电脑游戏中,取得了成功。

1.3 本文研究内容

为提升提高官兵的记忆效率,确保战斗或者执行任务过程中战术手语的有效正确运用,最终使武警作战分队在执行任务过程中达到相互协同、信息交流及作战分队与指挥部的实时信息交互,确保各种条件下的精确稳定的信息传递,提高指挥部对作战的整体把握,保证任务圆满完成,针对武警作战分队在实际执行任务中的手势口令进行交流,立足于高保密性,高反馈性以及高实用性,研究设计和实现了基于MATLAB的作战手语战术手势识别功能,以实现手语向文字、语音结果的转化。本文着重介绍了MATLAB图像处理和手势识别的相关原理,设计的研究和实现,GUI用户使用界面的设计和实现,测试实验结果和结果分析四个方面。

(1)深入研究了MATLAB图像处理和手势识别的相关原理,介绍了计算机图像的基本概念以及MATLAB在图像处理方面的基本原理,阐述了MATLAB图像处理的几种基本方法,为设计的研究和实现提供了理论基础。

(2)设计实现了基于MATLAB的战术手势图像的处理和识别,并对本文中测试的十个手势图像及其结合语句赋予意义,通过图像处理基本方法对获取的手势图像进行处理,而后对结果进行匹配识别并进行语音播放,基本实现了预期设计目的。

(3)针对用户使用实际需求,利用MATLAB的GUI相关功能,设计实现了用户使用界面,对整个设计进行整理组合,达到了精简、便于使用的目的。

(4)进行了战术手势口令识别的相关测试。对图像以及设计使用环境进行了详细介绍,对设计整体进行测试,对设计的不足以及改进空间进行了深入分析。

1.4 本文研究组织结构

本文重点在MATLAB环境下研究和设计实现图像的处理和手势识别、并结合MATLAB本身具备的功能设计实现了用户使用平台。在研究过程中,着重实现用户可以进行自编暗语并进行识别测试,并且便于操作使用的战术手势识别功能,对识别结果进行文字以及语音形式的转化。

第一章,介绍了论文中运用到的主要技术的研究背景和本文研究设计的意义,通过阅读大量文献进行归纳总结,并对本文预期目的和将要进行的工作做简要介绍。

第二章,主要研究了需要用到的相关概念和技术,MATLAB语言相关概念、图像处理相关概念方法、手势识别相关概念方法和GUI相关原理等知识。

第三章,首先从功能需求介绍了基于MATLAB的战术手势识别功能的设计目标,给出了战术手势识别功能的的基本框架设计,并对图像处理和手势识别基本流程,GUI用户界面的构建目标进行了介绍。

第四章,在对系统的功能需求、框架、流程等进行研究后,在本章对作战手势进行简易化并设计出以数字型手语为基准的战术手势,并对其图像处理以及手势识别的实现进行详细介绍。

第五章,在对GUI用户使用界面的预期效果进行研究后,在本章对GUI设计的方法、流程等基础知识进行分析研究,并对最终完成GUI用户使用界面的设计与实现进行介绍。

第六章战术手势识别功能的测试分析。对本文设计与实现的战术手势识别功能进行了测试,对测试结果进行分析,对设计的不足以及有待改进的地方进行进一步阐述。

第七章,总结论文在写作和功能的设计实现方面完成的主要工作,针对论文的写作和功能的设计实现方面出现的问题进行列举,给出改进意见,并对设计进行展望。

在文章的最后将本论文中所用到、借鉴的参考文献进行了罗列。

第二章 相关概念和技术

本章主要对实现基于MATLAB的战术手势识别功能所使用的编程平台、基本原理、基本方法等进行介绍。此功能设计以MATLAB为平台,应用了图像处理、神经网络手势识别,同时为了满足用户的实际使用需要,以GUI为基础搭建了用户使用界面。为了使读者更容易理解本设计的实现过程和原理,本章将会对上述提到的相关软件和技术进行介绍。

2.1 MATLAB语言相关概念

2.2 图像处理相关原理

通过对MATLAB语言基本概念的了解,下面将结合本文设计所使用图像处理、手势识别以及GUI用户使用界面的相关概念进行介绍。

2.2.1 图像处理基本概念

2.3 图像处理基本方法

2.4 图像分割基本方法

2.5 手势图像识别相关原理

通过对图像处理的研究分析,在采取手势图像特征提取的基础上,结合设计的需要以BP神经网络作为手势图像识别的方法,本节即对手势识别基本概念和基于BP神经网络的图像识别进行详细介绍。

2.5.1 手势识别基本概念

手势识别(Gesture Recognition)指通过跟踪人类手势、识别并其转换为语义上有意义的命令的过程。手势图像识别的总体目标是通过计算机对获取的手的位置、姿势或形态等信息进行处理识别,并得出语义的解释或执行相应的操作。手势图像识别技术性并不是很强,其难点和重点主要是对大量数据信息的训练和处理。

手势的完成是一个动态的过程,这个过程包括了手指弯曲引起的手的形状和手在空间中的位置和方位的变化两个方面,在实际识别过程中,根据手势的时间特征,可以将手势分为静态手势和动态手势两种。相对而言,对于静态手势的识别,可以将其视为静态图像,将时间特征设定为统一值,对手势的空间特征进行研究,而动态手势则需要将时间和空间两个要素同时参考,以随时间变化的空间特征为属性对手势进行描述。静态手势的研究,可以利用手的关节、指间等特征值进行表示,而动态手势的研究则需要取一段时间内手的各种空间特征的测量序列值进行表示。同时,由于人手具有的自由度较多,运动较为复杂,导致相同的手势动作在不同的人操作时会呈现不同的运动,从而导致特征值的差别。

为了检测手的姿势或形态,可以使用通用分类器或模板匹配器进行识别。当对视频进行手势识别时,由于视频中手势含有轨迹,使其被赋予时间特征,那么就需要相应的技术诸如隐藏马尔可夫模型(HMM)等进行该特征的处理,从而使得动态的手势识别最终转化为静态的手势识别。

目前,作为比较流行的手势识别技术有模板匹配法、特征提取和BP神经网络算法。模板匹配法:作为最接近人本身对事物的识别的方法,模型匹配法是将传感器输入的原始数据与预先存储的模板进行匹配,通过测量两者之间的相似度来完成识别,相应的,模型匹配法需要大量的基础数据作为匹配对象来确保识别率,所以受到噪声、光照等复杂环境影响较大,并且识别速度慢。但是,模板匹配法具有简单、易掌握,普及程度高的优点。特征提取:指通过对输入数据的特征进行提取,并分析转化形成具有实际含义的特征属性,从而形成训练数据库,在对手势图像进行识别时,以训练数据库的特征为基础进行识别。特征提取方法缩小了基础数据的需求量,但依旧容易受到噪声、光照等复杂环境的影响,识别速度较慢。BP神经网络是一种前向传播的多层网络,BP神经网络算法是一种按误差逆传播算法训练的多层前馈网络。它的学习规则是使用最速下降法,通过反向传播来调整网络的权值和阈值,使得网络的误差平方和最小。

本文中结合运用了特征提取法和BP神经网络算法进行战术手势图像的识别,基本实现了较高的识别率同时识别速度较快。

2.6 人工神经网络基本原理

针对人工神经网络有一个经典的定义:“神经网络是由具有适应性的简单单元组成的广泛并行互连网络,它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应”

神经元模型是模拟生物神经元结构而被设计出来的。典型的神经元结构如下图所示:

图2-2 生物神经元结构

神经元大致可以分为树突、突触、细胞体和轴突。树突为神经元的输入通道,其功能是将其它神经元的动作电位传递至细胞体。其它神经元的动作电位借由位于树突分支上的多个突触传递至树突上。神经细胞可以视为有两种状态的机器,激活时为“是”,不激活时为“否”。神经细胞的状态取决于从其他神经细胞接收到的信号量,以及突触的性质(抑制或加强)。当信号量超过某个阈值时,细胞体就会被激活,产生电脉冲。电脉冲沿着轴突并通过突触传递到其它神经元。

同理,我们的神经元模型就是为了模拟上述过程,典型的神经元模型如图2-3所示。

图2-3 神经元模型结构

这个模型中,每个神经元都接受来自其它神经元的输入信号,每个信号都通过一个带有权重的连接传递,神经元把这些信号加起来得到一个总输入值,然后将总输入值与神经元的阈值进行对比(模拟阈值电位),然后通过一个“激活函数”处理得到最终的输出(模拟细胞的激活),这个输出又会作为之后神经元的输入一层一层传递下去。

为了更好的理解人工神经网络是如何作用的,这里以最小二乘法线性回归问题进行类比,在求解数据拟合直线的时候,我们是采用某种方法让预测值和实际值的“偏差”尽可能小。同理,BP神经网络也做了类似的事情,即通过让“偏差”尽可能小,使得神经网络模型尽可能好地拟合数据集。

2.6.1 基于BP神经网络的图像识别

BP网络是一种前向型的神经网络,参数前向传递,而误差则是反向传递,神经网络通常由三层组成,输入层,隐含层和输出层,其基本思想就是输入层输入需要训练的图像特征,经过隐层节点的训练得到输出层的结果,计算输出层结果与预期期望值的差值,如果差值在误差范围内,则训练结束,如果差值不在误差范围内,则反向传递误差,继续训练,训练过程中不断地调整隐层节点的权值和阈值,直到输出层的结果达到预想的期望值。单层的神经网络图如下:

图2-4 单层的神经网络图

图中的P是输入列变量,b是相应偏移,a是网络输出,f是激活函数,W是网络权值。当输出结果a与期望值不相符的时候,误差沿着隐藏层进行反向传播,并将误差按照权重进行分配,使得每一个隐藏层都承担一定的误差,通过调整参数,权值优化,达到输出误差最小的目的。

神经网络图像识别技术是一种比较新型的图像识别技术,是将神经网络算法与传统的图像识别方法相融合,实现了更高效率的识别的图像识别方法。神经网络指人类通过对人体和动物的神经网络进行研究后,模仿其神经网络的构造和功能,人工生成的神经网络。在神经网络图像识别技术中,最经典的神经网络图像识别模型是遗传算法与BP神经网络算法相融合,应用面非常广。

BP网络是一种前向型的神经网络,参数前向传递,而误差则是反向传递,神经网络通常由三层组成,输入层,隐含层和输出层,其基本思想就是输入层输入需要训练的图像特征,经过隐层节点的训练得到输出层的结果,计算输出层结果与预期期望值的差值,如果差值在误差范围内,则训练结束,如果差值不在误差范围内,则反向传递误差,继续训练,训练过程中不断地调整隐层节点的权值和阈值,直到输出层的结果达到预想的期望值。

2.7 图形用户界面GUI相关原理

图像处理平台是为了实现将多个单独的图像处理算法集成在一个平台中,方便用户进行操作和使用,在MATLAB中通常使用GUI来实现图像处理平台的搭建。图形用户界面(graphical user interfaces,GUI)是MATLAB软件中的一个重要模块,具有窗口、图标、菜单和文本说明等多个图形对象,由菜单控件、按钮控件、坐标轴控件、滚动条控件、面板控件等对象控件构成,是采用图形方式显示的用户操作界面。GUI的设计可以实现图像处理过程的交互和可视化,提高了图像处理算法的综合效率,具有开发周期短、操作方便、界面友好的特点,有利于更方便快捷地控制仿真程序。搭建MATLAB GUI进行图像处理,可以充分发挥MATLAB在图形可视化方面的优势,为用户使用提供便利。

通过MATLAB GUI进行战术手势识别功能用户使用界面的设计,提供了较好的功能展现形式,使得编程工作量降低,开发效率提高。在GUI中进行图形用户界面设计的基本步骤如下:

(1)确定设计需求,根据需求目标和任务需要,绘制和设计基本框图;

(2)确定设计中需要的各个控件的布局并完成控件位置的设置;

(3)设置各个控件的属性,尤其设置唯一标识值Tag属性以实现对控件的控制;

(4)进入各个控件的回调函数,编写实现回调函数相关功能的代码;

(5)运行guide进行测试,并修改程序。

2.8 本章小结

本章首先介绍了MATLAB语言的相关概念,之后对MATLAB的图像处理和手势识别的基本概念和方法进行了阐述。并根据本文实际需要,针对基于神经网络的手势图像识别进行进一步阐述。这些概念和基础为实现基于MATLAB的战术手势识别功能的设计与实现提供了良好的基础。

第三章 基本框架与功能设计

本章主要完成了对基于MATLAB的战术手势识别功能的需求分析以及基本框架的设计。通过对整个功能实现的流程的分析,结合MATLAB本身性能和优势,,对功能实现应该具备的性能展开需求分析,阐述关键技术、操难度作以及可行性,而后依据需求分析对对系统的细分功能模块进行设计并搭建基本框架,为后期功能设计与实现打下基础。

3.1 需求分析

基于MATLAB的战术手势识别功能的设计实现能很好的提高基层官兵在训练中对手语学习的记忆和掌握。根据不同的战术背景不同的手语需要,结合特战小队在实际任务中可以运用到的手语联络方式进行设计研究,从而建立的手语库能够更好的涵盖实战的各个方面,提高训练的全面性。同时,为训练成果的检验提供了一种更为智能化的方式。

根据基层现状可知,官兵日常训练任务较重,时间安排较满,官兵日常需要背记的条令条例等固化知识较多,思维活跃受到了较大限制,使得官兵在对多变、复杂的手语进行训练记忆时,往往没有较好的效果。故此如何提高训练的质量和效益成为一个关键性问题。而在记忆学中,图像放映式记忆效果显著,通过类似播放电影的方式对手语记忆进行训练,能极大的提高训练的效果,同时,其富有的生动性、形象性能够激发官兵学习热情,促使学习过程中精力更为集中,进一步的提高训练的质量。

基于这些问题,建立一个战术手势识别功能平台是相当有必要的。通过利用MATLAB的各种功能组合设计出一个具备手势识别功能和具有用户使用界面的一个平台,应用于官兵在训练中对手语的记忆,能很好的提高训练的效果和质量,大大降低训练的时间,从而减轻基层官兵的压力。同时也为管理者对所属人员训练情况进行考核提高了平台和条件。

3.3 战术手势识别功能基本框架与功能设计

基于MATLAB的战术手势识别功能需要具备图像处理和手势识别两大模块的功能,预期实现的功能包括手势视频的读取分割、手势图像的处理识别以及GUI的用户使用界面这三个部分。

3.3.1 战术手势识别框架设计

在对MATLAB的基本操作、原理进行深入学习后,立足于MATLAB高效便捷的特点,使用MATLAB神经网络库以及GUI用户界面做支撑,研究设计了基于MATLAB的图像处理和手势识别功能,该设计总体可以分为手势视频分解、手势图像处理与识别、GUI用户使用界面三个部分,其总体框架如图3-1所示。

图3-1 战术手势识别总体框架

在图3-1中,将基于MATLAB的战术手势识别功能的实现的完整流程进行展示,通过框图的设计,将整个设计划分为手势视频分解、手势图像处理与识别、GUI用户使用界面三个部分的内容,在本小节将针对手势视频分解、手势图像处理与识别进行详细介绍。

(1)手势视频分解

战术手势的识别的设计与实现围绕贴近实战、便于直观的输入和输出,在手势图像处理识别的基础上,增加了手势视频分解的功能,用于将实际运用的连贯的手势动作输入后得到对应的事先规定好的文字结果,从而最终达到战术手势识别的基本功能。

(2)手势图像处理与识别

MATLAB的图像处理与识别是战术手势识别的设计与实现的主要部分,根据设计目标和功能需求,研究了MATLAB灰度图像处理、图像的二值化处理、高斯滤波处理等等图像处理方法,通过综合分析和实际测试运用,最终确定以图像分割和特征提取作为本文的基本图像处理方法。

神经网络识别方法是一种比较新型的图像识别技术,是在传统的图像识别方法和基础上融合神经网络算法的一种图像识别方法。当录入图像时,利用MATLAB的定位模块提取手势的信息,并对处理后手势图片进行训练,测试时根据录入图片的手指的弯曲、伸直等等信息进行识别,并显示最终的结果。

通过调用MATLAB的神经网络,可以最大限度的简化识别流程,从而初步达到预期效果如图3-2所示。

图3-2 战术手势识别简化后框架

在图3-2的战术手势识别简化后框架中,将整个基于MATLAB的战术手势识别功能的手势图像处理识别过程划分为四个部分,第一列为图像的导入,也就是视频图像经过分割处理后的三个手势图像,将他们分别进行第二列中的处理和识别过程。第二列中,对于手势图像的处理识别过程进行了深层解析,将其划分为图像处理、特征提取、神经网络三个部分,并且,三个部分有着严格的先后顺序,一环扣一环最终实现手势图像的处理和识别过程。第三列是每单个手势图像分别经过处理识别之后产生的结果,在MATLAB的运算过程中,每个图像的识别结果以一个对应的数字的形式存在,以便于进行下一步的运算,并且,在实际设计实现过程中,对单个图像的数字结果进行了忽略,着重以三个数字为一组的语句作为结果呈现,并最终在GUI用户使用界面上,以一个整体的文字、语音结果对用户进行展示。

MATLAB中所调用的BP神经网络库的基本属性和相关内容如图3-3所示:

图3-3 MATLAB神经网络

下图为通过软件进行翻译后的图片:

图3-4 MATLAB神经网络(翻译后)

通过对图3-3、3-4可以知道,MATLAB神经网络库的相关内容和基本属性,在MATLAB中,神经网络是利用两层前馈神经网络来求解输入和输出的问题。它的基本原理是通过神经拟合来帮助选择数据、创建和训练网络,并使用均方误差和回归分析来评估性能。

它的基本构图如下:

图3-4 MATLAB神经网络框图

3.3.2 战术手势识别功能设计

针对战术手语的多变性、短时效性,根据不同地域、类型部队的实际运用习惯,采用神经网络算法实现的手势识别,能够实现自编手势的便捷录入和新结果的便捷输出,达到简便实用、高效的预期效果。

以上即为整个设计过程中手势视频分解、手势图像处理与识别的介绍,下面将对整个设计的第三个部分GUI用户使用界面基本框架与功能的设计进行介绍。

3.4 GUI用户使用界面基本框架与功能设计

GUI用户界面的搭建能够使设计更加贴近用户的使用和操作,通过在GUI界面中设计各个功能控件,来达到对整个功能设计的整合和提升。

3.4.1 GUI用户使用界面框架设计

GUI用户使用界面包括视频录入并播放模块、分解手势图像展示模块、识别结果文字呈现模块、识别结果音频呈现模块以及重置模块。在兼顾GUI用户使用界面的美观和各个模块的功能实现两个方面的情况下,初步排版并设计了GUI的用户使用界面如图3-5所示。

图3-5 GUI用户使用界面框架

在GUI用户使用界面框架设计中,Axes作为一个展示控件,在GUI界面中为轴,能够根据设计的需要或者导入的文件不同展示对应的图表、线性图、图像、视频等,在使用方面较为简便,能够清楚得将对象呈现给用户。经过对市面上各大软件的界面进行分析研究,结合人们对用户使用界面的喜好,采取如图3-5所示的设计理念。以较大面积的Axes轴作为视频文件的展示区(图中为Axes1),使得整个视频在播放的时候,更为清晰、引人注目,该效果能有效加强人的印象。再以较小面积的Axes轴作为视频文件分割后产生的三个手势图像的展示区(图中为Axes2、Axes3、Axes4),考虑到本文功能实现的目的为提高提升提高官兵的记忆效率,确保战斗或者执行任务过程中战术手语的有效正确运用,故此将手势视频分割后形成的三个分图像进行展示,以此来加强记忆,同时便于发现错误的环节从而进行针对性整改。

同样的,根据人视觉美学的需要,结合人们对用户使用界面的喜好,在GUI用户使用界面框架设计中,将用户进行点击、操作的按钮设计为圆形。但在实际设计过程中发现,GUI本身设定中的按钮形状为矩形,通过研究发现,将GUI按钮形状调整为圆形的过程具有一定难度,并且需要较大的工作量和繁琐的逻辑考虑,所以,在考虑实用性以及实际情况后,在实际设计中,按钮形状按照GUI本身设定不予更改。

在结果呈现模块上,根据实际情况,通过最基础的文本框样式进行文字结果的呈现,同时,在文字结果呈现后,其结果对应的音频自动进行播放,通过这种方式实现手势识别结果的视觉、听觉冲击,有效加强官兵使用过程中的记忆,同时,考虑到界面的整洁和操作的便利性,针对音频的播放采取自动播放的模式。

3.4.2 GUI用户使用界面功能设计

根据战术手势识别的功能需要,在建立美观简洁的GUI用户界面的基础上,实现战术手势视频的录入、自动分割功能,并对识别结果进行文字呈现和语音呈现。同时,设计重置按钮,使得用户在一轮使用后能够将程序归位。结合整体GUI用户使用界面的功能设计,将其分为视频录入并播放模块、分解手势图像展示模块、识别结果文字呈现模块、识别结果音频呈现模块以及重置模块。

(1)视频录入并播放模块

视频和图像的呈现模块,主要功能为手势视频的录入并进行播放,主要设计条件为GUI界面中控件的设置,通过对GUI中轴(Axes)的设计以及按钮控件callback的回调函数编写,从而实现整个手势视频的读取、录入、播放。

同时,在视频录入并播放模块中,通过MATLAB的运行和计算,对录入的手势视频进行处理,将每一段手势视频划分为帧数,每隔一定帧数进行一次图像保存,获取完成后将所有图像分为三段,再在每一段中取中位数,最终获得手势视频分割后得到的手势图像并在分解手势图像展示模块中进行呈现。

(2)分解手势图像展示模块

基于MATLAB的战术手势识别功能的设计目的为提高提升提高官兵的记忆效率,确保战斗或者执行任务过程中战术手语的有效正确运用。基于这个考虑,将手势视频分割后形成的三个分图像进行展示,以此来加强记忆,同时便于发现错误的环节从而进行针对性整改。

分解手势图像展示模块的主要设计条件与视频录入并播放模块相同,通过对GUI中轴(Axes)的设计,对手势视频分割后产生的三个图像自动进行获取并按顺序展示在对应的Axes轴中。不同的是,在分解手势图像展示模块中需要完成对三个手势图像的处理和识别过程,在获取相应的手势图像后,MATLAB按照既定的算法和方法,对获取的三个手势图像进行处理和识别,通过图像的处理和BP神经网络的识别,得到基本的数组识别结果,再与编成的战术手语库进行匹配,最终得到整个手势视频的识别结果,并将结果于识别结果文字呈现模块中呈现。

(3)识别结果文字呈现模块

识别结果文字呈现模块,主要功能为手势视频处理识别结果的文字结果呈现。在GUI设计界面中,将手势视频经处理识别后产生的数组结果与定义好的文字结果进行匹配,而后将对应的文字结果于设置好的文本展示位置进行呈现。该功能主要设计条件为数组的一一对应和匹配,通过对MATLAB代码中,各个组合进行定义并赋予意义,最终实现手势视频识别结果的匹配。

(4)识别结果音频呈现模块

识别结果音频呈现模块,主要功能为通过识别结果文字呈现模块得到手势视频对应的文字结果后,依据文字结果匹配对应的音频文件并自动播放。

(5)重置模块

重置模块的主要功能为清空当前设计页码的所有数据,复原整个手势识别用户使用界面,用户即可按照同样的顺序读取新的视频进行新一轮的处理和识别过程。

3.5 本章小结

本章首先描述了本文设计的基于MATLAB的战术手势识别功能需要达到的目标和实现的功能,详细介绍了该设计的总体框架和总体功能,最后给出了该设计的功能模块设计,并对所有功能模块的设计流程进行了图文阐述。

第四章 图像处理和手势识别的实现

手势识别是基于图像处理实现,本章节主要介绍相关的手势图像处理识别算法,主要包括图像的预处理部分,图像分割部分以及手势识别部分。图像预处理是算法的前置环节,能够为后续图像算法提供高质量图像,图像分割是将对象从背景中分离出来,便于后续手势图像识别。对于手势图像识别采用BP神经网络的方式,提取手势图像特征,利用HU-不变矩特性,输入神经网络进行训练,达到识别的效果。

4.1 战术手语的编成和设计

根据人手五指的分指和弯曲度特征,同时借鉴我们日常生活中惯用的手指语言表示方法,在现有数字手语1、2、3、4、5、6、7、8、9、0的基础上,针对各个手势的动作进行重新赋值,并根据实战中常用的、必要的指挥类口令,赋予每个手势特定的定义,从而得到一组自编战术手语,具体见表4-1:

表4-1 战术手语表

手势图片 对应数字结果 对应文字结果
1 前方
2 发现
3 散开
4 搜索
5 趴下
6 两侧进攻
7 弱火力点
8 强火力点
9 敌人已消灭
10 集合

以武警部队特战中队为例,在针对暴恐分子的捕歼战斗中,每个战斗小组根据任务划分的不同,通常处于不同的执行区域,并且,由于各组接受任务的明确性,在实际作战中,即便各组之间位置临近,往往也需要运用手语进行下一步行动的联络和指挥,在实际作战中,往往采用三个以上的连贯手势动作组成的手语来表达一个行动命令,尤其体现在明确进攻战法、躲避敌人攻击等高度紧张情况下。根据以上情况,结合表4-1中编成的单个战术手语表,以每三个手势为一个组合进行编成,并对构成的三个手势对应的意思进行组合,从而得到了对应的文字结果,如下表所示:

表4-2 战术手语编成表

手势图片 对应数字结果 对应文字结果
1 2 3 前方发现敌人,所有人散开
1 7 6 前方敌人弱火力点,进行两侧进攻
2 8 5 发现敌人重火力点,迅速趴下
9 1 4 敌人已消灭,前方展开搜索
4 2 8 报告!搜索发现强火力点
1 8 9 报告!前方强火力点已消灭

为便于研究测试,按照中文中主语、谓语、宾语、动词的组合要求和基本模式,本文将表4-1中编成的十个单独的战术手势,以每三个手势为一个组合编成了六组战术手语,并根据每组手语的单个手势意思赋予其实际意义。在实际使用过程中,根据表4-1中编成的单个战术手语或者重新建立一个新的单个战术手语表,而后再按照新的规则以三个一组、四个一组等等模式进行组合并赋予意义,都可以形成新的战术手语组合。通过这样的战术手语建立形式,能够极大程度的提高作战中手语联络的安全性以及迷惑性,从而有效为作战联络服务。

4.2 手势图像预处理

手势识别属于数字图像处理过程,在数字图像处理过程中,大部分的图像都来源于现场摄像机拍摄采集,由于摄像机性能的千差万别以及现场环境的不同,得到的图像往往都不是最高质量的图像,大多数图像都存在噪声,光照等环境因素的干扰。所以通常都需要进行图像的预处理过程,去除图像中主体目标之外的干扰因素,降低图像的像素大小,减小图像的数据量,从而很大程度上简化系统预算过程,优化处理速度,提升图像处理的准确性。

4.2.1 手势图像颜色空间转换

图像的表示方法有很多种方式,目前常见的图像色彩表示模式有RGB模式,CMKY模式,HSV图像模式,位图,灰度图等模式,不同的场景所采用的图像表示模式不尽相同。HSV表示图像的色调,饱和度,明度,基于人类对于颜色的感知情况而建立的模型,是十分重要的一种颜色表示模型。本设计中采用HSV颜色模型进行颜色空间转换处理。通过HSV处理后的手势图像如下所示:

图4-1 HSV处理后的手势图像

Matlab中将RGB图像转换成HSV图像是通过rgb2hsv函数完成,由图像可以看出,RGB模型虽然是常用的图像表示模型,但是RGB模型反应的是物体真实存在的状态,也方便计算机处理,但是对于人来说并不是很直观,HSV模型则很直观的反应出图像的颜色,饱和度以及亮度信息。经过HSV转换的图像,背景部分和手掌部分区分明显,只需要在下一步中设置好合适的图像分割阈值,就能将手势图像从背景中区分开来。

4.2.2 图像二值化

本文针对手势图像背景较为单一的情况,在HSV空间选择固定的阈值进行图像二值化,二值化结果如下:

图4-2 二值化后手势图像

经过多次调节参数后,选择了合适的阈值(0.09<hsv<015)进行二值化,二值化后的图像手掌部分为白色,值为1,背景部分为黑色,用0表示,二值化后的图像手势部分和背景部分过渡十分明显,从1到0或者是从0到1的部分都是手势的边缘,而全部都是0的图像部分就是图像的背景,全部为1的部分就是手势部分。这一点可以作为后续的手势图像分割的依据。

4.2.3 形态学操作

图像二值化后,手势图像与背景图像区分较为明显,背景部分为黑色,手势部分为白色,但是由于阈值选择问题以及图像主题与背景连接较为紧密,导致部分图像存在孔洞以及图像边缘不够平滑,采取形态学操作能够填充图像的孔洞以及平滑手势边缘,去除边缘毛刺。

经过形态学操作的手势图像处理结果如下,通过结果可以看出,原来手势图像的孔洞部分得到了很好的填充。

图4-3 形态学操作后的手势图像

经过形态学操作后的图像,整体手势图像变得完整,原二值化图像中,手指甲部分由于阈值不一样的原因,部分指甲部分分割不全,导致存在孔洞的现象,经过形态学操作,填充了图像的孔洞,平滑了图像边缘,为后续的图像分割以及特征提取提供了高质量的图像。

4.2 图像分割

图像分割也是图像处理任务中常用的一种方法,该方法主要目的是将采集的图像进行前景和背景的分离,分割出的前景部分也就是手势部分用于后续的特征提取过程。图像分割的方法也有很多,近年来随着图像处理以及深度学习的快速发展,很多热门学科诸如神经网络,深度学习等都被用作图像分割处理,大大提高了图像分割的准确率。

4.2.1 基于连通域的手势图像分割

在进行图像预处理后,原本复杂的图像变得简单,也滤除了很多的其他干扰因素,此时需要进行图像分割操作,将手势图像从原始图像中分割出来,便于后续的特征提取操作。

从二值化的图像可以看出,手势图像与背景界线较为明显,且手势图像内部没有孔洞,图像较为纯净,因此本系统采用基于连通域的图像分割法分割手势区域。

连通域的分析是基于二值图像的,即提取二值图像中的连通区域,对每个独立连通域的分析,就能进一步得到该区域的面积,质心,轮廓等参数。在图像处理中,最小的图像处理单位是图像像素,即构成图像的每个独立区域,不同的像素按照位置关系可以分为4邻接和8邻接,4邻接是指单个像素的上下左右四个位置,8邻接除了这4个位置之外,还有包含对角线的位置。如下图所示,图像左边为4邻接点,右边为8邻接点。

图4-4 连通域示意图

像素A与像素B如果位置处于邻接点,则该像素所属区域之间连通,遍历图像,就能得到很多的连通区域,由于之前的二值化图像得到的图像较为纯净,所以选择连通域中的最大值,就能得到手势分割图像,分割图像如下:

图4-5 手势分割图像

由图像可以看出,手势部分是一个整体,这得益于上一步的图像形态学操作过程,使得手势图像中间没有断开或者断裂的部分,如果存在断裂部分的话,则图像分割时会将手势图像分割成为多个部分,完整的手势图像,整个手势部分都是一个连通域,手势中的每个像素不论是八连通区域还是四连通区域,都能找到其他的手势部分,对图像进行遍历,判断连通域,就能够从背景中将手势图像分割出来。

4.3 图像特征提取

图像特征提取是描述图像区域的有效方法,不同的图像包含着不同的特征,常见的特征有颜色特征,纹理特征,几何特征等等,这些特征又能进一步细分,有的图像特征描述的是图像的整体特征,有的描述的图像局部特征,要根据不同的图像处理任务选择合适的图像特征。本文采用几何不变矩-Hu矩以及空间几何特征作为手势图像的特征。

4.3.1 几何不变矩-Hu矩

矩的应用十分广泛,矩的概率来自物理学,主要用于表现物体空间分布,譬如力矩,扭矩等,后来逐渐被用于其他学科,比如在统计学中,一阶矩表示期望,二阶矩表示方差等等。图像处理中,可以将图像看作是二维矩阵,矩则表示概率分布。几何不变矩-Hu矩是常用的图像特征之一,是非线性特征组合而成的,具有旋转平移伸缩不变性。

假设图像用f(x,y)表示,则p+q阶原点矩和中心矩可分别用如下公式表示:

p+q阶原点矩表达式如式4-1所示:

(4-1)

中心矩表达式如式4-2所示:

(4-2)

以上两个矩并不能很准确的表示图像的特征,所以在此基础上,可以构造出7个矩的不变量用于图像的特征描述。

具体公式如下:

(4-3)

(4-4)

(4-5)

(4-6)

(4-7)

(4-8)

(4-9)

通过以上公式构造出7个矩的不变量,从而对图像的几何特征进行初步的描述。在完成图像识别的过程中,空间几何特征也是较为直观的一种方式,下面就空间集合特征进行详细描述。

4.3.2 空间几何特征

空间几何特征是描述图像特征的方式之一,也是较为直观的一种方式。常见的几何特征有图像的面积,图像的周长,图像的轮廓,图像的中心等等。本文选取手势图像的矩形度,圆形度,偏心率作为图像的几何特征。

图4-6 图像的几何特征

如图所示,手势图像的面积即白色部分表示的区域,手势图像经过二值化和形态学操作后,与背景图像明显分离,只需要对图像进行扫描,计算白色区域的面积即可得到手势图像的面积。手势图像的周长指的是图像中白色部分轮廓的周长,通过连通域计算可以得到该长度。图像的黑色部分轮廓即为图像的最小外接矩形,矩形度可以通过(H1+H2)/(W1+W2)得到,矩形度体现了一个图像的对其外接矩形的充实程度,通过这个特征参数可以分离图像方形部分。圆形度通过手势面积乘上4π除以周长的平方得到,这个参数描述的是手势图像与圆形图像的相似程度。离心率表示的是手势图像的形状,以O点作为圆心计算得到。

通过得到的几何特征与不变矩-Hu矩特征结合起来,即得到了手势图像的形状特征。

4.4 BP神经网络训练

BP神经网络的训练过程如下:

(1)神经网络初始化。根据训练图像任务的要求,选择合适的神经网络输入层的个数,隐层的权值和阈值以及输出层的个数,合理的参数往往能达到不错的训练效果。本文针对10个手势图像进行训练,每个手势图像有10个特征值,包括7个Hu矩特征,3个空间特征(矩形度,圆形度,偏心率),所以本神经网络的输入层为10,代表10个特征值,隐层节点为1,输出层神经元个数为10,代表10个阿拉伯数字。

(2)特征输入与输出。将图像特征输入神经网络进行训练,经过隐层后输出训练结果。

(3)误差计算。计算网络的输出层与期望值之间的差值。

(4)权值和阈值更新。将误差反向传递,根据误差调整隐层的权值和阈值。

(5)结束条件判断。训练结束与否取决于误差值是满足条件,若满足,则结束训练,若不满足,则重复第二步的操作。

经过以上步骤的训练,手势识别神经网络的训练结果如下:

图4-8 神经网络训练结果

由训练结果可以看出,训练网络的input有10个变量的输入,output部分有10个变量的输出,中间有一个隐藏层,网络训练方式采用的是学习率自适应的梯度下降BP算法,BP神经网络能够根据训练结果自动调整步长以及权值;中间的progress显示了每次训练的进度,图像经过了37轮的训练,validation check为泛化能力检查,由训练结果可以看出,神经网络连续6次训练误差不降反升,满足了训练结束的调节,所以训练结束。

4.5 本章小结

本章通过结合需求分析和设计说明,详细介绍了本文中图像处理和手势识别的基本流程,依次对战术手语的编成和设计、图像预处理、图像分割、图像特征处理、BP神经网络识别进行详细的设计与实验情况的介绍,并给出了实现的相关算法和界面截图。

第五章 GUI用户使用界面的实现

本章根据设计的需要,在实现图像处理和手势识别的基础上,实现对GUI用户使用界面的设计,着重介绍MATLAB环境下的GUI设计相关属性和技术。通过对GUI的基本功能的使用介绍和演示,使用户对GUI的搭建基础有进一步的了解。最后根据前文提出的设计需要,对基于MATLAB的战术手势识别功能的用户使用界面进行设计实现,并给出核心代码和流程图。

5.1 GUI设计相关参数和函数

图形用户界面(graphical user interfaces,GUI)是MATLAB软件中的一个重要模块,具有窗口、图标、菜单和文本说明等多个图形对象,由菜单控件、按钮控件、坐标轴控件、滚动条控件、面板控件等对象控件构成,是采用图形方式显示的用户操作界面。完成GUI界面的对象设定和界面设计后,会自动生成一个包含所有对象属性值的fig文件和包含函数代码的m文件。在m文件中,包含了GUI的主函数、Opening函数、Callback函数以及Output函数等,通过对这些函数的编写,可以实现不同的功能需要。

在GUI中,所有的对象都有对应的基本函数和属性来对它们的特征进行定义,正是通过对这些基本函数和属性的设定,从而实现了GUI界面中各类控件、图像、轴的展现方式。尽管较多的一般属性是所有的对象都具备的,不具有特殊性,但与每一种对象类型(比如坐标轴,线,曲面)相关的属性和函数都是独一无二的。对象属性可包括诸如对象的位置、颜色、类型、父对象、子对象及其它内容。每一个不同对象都有和它相关的函数和属性,可以通过单独的改变这些函数和属性而不影响同类型的其他对象。

下面对GUI中常用的基本函数属性进行列举介绍:

表5-1 GUI函数属性表

函数 属性
Figure 创建图窗窗口
Axes 创建笛卡尔坐标区
Uicontrol 创建用户界面控件
Uitable 创建表用户界面组件
Uipanel 创建面板容器对象
Uibuttongroup 创建用于管理单选按钮和切换按钮的按钮组
uitab 创建选项卡式面板
Uitabgroup 创建包含选项卡式面板的容器
Uimenu 创建菜单或菜单项
Uicontextmenu 创建上下文菜单
Uitoolbar 在图窗上创建工具栏
uipushtool 在工具栏上创建普通按钮
uitoggletool 在工具栏上创建切换按钮
actxcontrol 在图窗窗口创建Microsoft ActiveX控件

在GUI用户使用界面的研究和设计中,各个控件的使用和定义都需要基于回调函数的调用,通过对每个控件下的回调函数下根据需要进行的相应代码的编写来实现所要达成的效果,在战术手势识别的研究和设计中,针对战术手势视频的录入、战术手势图像的分解、识别结果的展示和音频播放、重置五个功能进行了回调函数的设置,下面首先针对GUI中常用的回调函数的属性和使用规则进行总结讲述。

(1)Callback函数

通常作为主回调函数,包含函数句柄、元胞数组、字符向量等基本属性,MATLAB 在基础工作区计算此表达式。该函数用于普通按钮点击、滑块移动或复选框选中执行用户交互功能,整个GUI界面的操作的完成基本上都通过Callback函数来控制完成。对于Callback函数的执行情况,通常在定义组件、更改回调函数值时执行相应的操作。当Callback控件为按钮或滑块时,点击按钮、拖动滑块操作后对应的Callback函数就会执行。概况而言即为,当对控件进行默认操作时,其对应的Callback函数便会被调用并执行。在战术手势识别的研究与设计中,实现点击按钮正确录入手势图像以及点击按钮不录入手势图像时显示对话框的核心代码如下:

% --- Executes on button press in pushbutton1.

function pushbutton1_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

[filename,pathname]=uigetfile({'*.*';'*.bmp';'*.jpg';'*.tif';'*.jpg'},'选择图像');%返回文件名,文件路径

if isequal(filename,0)||isequal(pathname,0)

errordlg('请选择图片','提示');%如果没有输入,则创建错误对话框

return;

else

im=[pathname,filename];%合成路径+文件名

image=imread(im);%读取图像

%set(handles.axes1,'HandleVisibility','OFF');%关闭坐标,方便操作

axes(handles.axes1);%%使用图像,操作在坐标1

imshow(image);%在坐标axes1显示原图像

%title('手势图像一');

end

(2)ButtonDownFcn函数

ButtonDownFcn函数与Callback函数功能相似,在点击控件时,便会执行该控件下的ButtonDownFcn函数。由于Callback函数同样具备点击后执行的属性,所以通常情况下,ButtonDownFcn函数会被覆盖。

(3)CreateFcn函数

CreateFcn函数的执行是在所有属性设定完成后,程序运行或者控件建立时便会执行,无须进行任何操作。相比较来看,Callback则需要选中或者按下对应的控件,函数才会执行。

(4)DeleteFcn函数

在控件要执行消除或者关闭行为时,在被执行以上行为之前执行这个函数名下的代码。日常见到的诸如各种软件在点击关闭按钮后弹出的“是否确认关闭?”此类的设计即为在该函数下进行的代码设置。

(5)KeyPressFcn函数

当前控件获得焦点且有按键按下时执行。焦点指某控件被鼠标选中或者由tab键轮选选中时,该控件所处的状态即为焦点,可以理解为当前正在使用的窗口。其原理亦可借鉴摄影原理进行分析,在摄影时,镜头聚焦一个点后,其他地方就会呈现虚化,达不到摄影效果甚至无法识别,KeyPressFcn函数在调用时即是在控件得到这种类似“聚焦”的状态时才能执行。一般情况下,KeyPressFcn下编写的代码还会对按键下面内容进行判断,然后再执行相应的代码。

(6)SelectionChangeFcn函数

SelectionChangeFcn函数用于多个对象互斥,不能同时被选中时,通过按钮的联力建立的函数,类似于单选题。在使用SelectionChangeFcn函数实现单选目的时时,需要添加button group控件,然后在button group中添加radio button按钮,而后再对SelectionChangeFcn函数进行设置最终实现预期目标。

以上即为MATLAB中GUI基本回调函数的概念和使用环境,在实际运用中通常还需要指定回调属性值,其方法主要有三种:

一是指定函数句柄。函数句柄提供了一种以变量表示函数的方法。通过对函数的定义或者在函数名称前规定运算符号,即可创建指定函数句柄。但是在指定的函数句柄中,不会显示引用的任何输入参数,即便如此,在指定函数句柄时,仍然需要在函数的声明中对包含的两个输入参数进行强调,这两个输入参数对于所有指定为函数句柄的回调都是必需的。

二是指定元胞数组,通过元胞数组的指定来使回调函数执行,使得回调函数中可以使用更多的输入参数(以逗号分割多个输入参数,在函数声明中进行定义)。

第三种指定匿名函数,当函数要执行时,如果该函数不满足函数句柄和元胞数组所必需的两个参数,则可以通过指定匿名函数来使得函数正常执行。例如,以下将 Callback 属性指定为匿名函数,利用uicontrol 命令来创建一个普通按钮,规定函数的名称为max,仅用它来定义一个输入参数 x。

b = uicontrol(“Style”,”pushbutton”,”Callback”,@(src,event)max(x));

本节通过对GUI设计中常用的相关参数和函数进行介绍,为实际的GUI设计打下理论基础,下面结合以上原理,以简单的GUI用户界面搭建为例进行GUI用户使用界面设计的介绍。

5.2 创建GUI图形用户界面

根据战术手势识别的功能需要,在建立美观简洁的GUI用户界面的基础上,实现战术手势视频的录入、自动分割功能,并对识别结果进行文字呈现和语音呈现。同时,设计重置按钮,使得用户在一轮使用后能够将程序归位。结合整体GUI用户使用界面的功能设计,将其分为视频录入并播放模块、分解手势图像展示模块、识别结果文字呈现模块、识别结果音频呈现模块以及重置模块。

下面就实际GUI图形用户界面的创建进行详细介绍。

(一)GUI设计一般步骤

在实际应用中,根据所需求的功能以及最终需要实现的目的,第一步应当分析界面所需要的主要功能、明确设计任务,确定好GUI界面需要的控件和工具的类型,宏观上有一个方向和目标;第二步应当绘制界面草图,利用Visio等工具以图形文字的形式绘制界面草图,从使用者角度来考虑确定GUI界面的整体布局、各个控件的位置,在确保功能实现的基础上提高美观度;第三步利用GUI设计工具制作静态界面,制作过程中确定好各个控件应具备的功能,并做好文字注释和标注;第四步编写界面动态功能程序,编写对应的回调函数,最终实现各个控件的功能。

(二)GUI设计基本原则

本文功能实现的目的为提高提升提高官兵的记忆效率,确保战斗或者执行任务过程中战术手语的有效正确运用。故此,在设计时需要依照用户的实际操作体验和功能实现的实际情况。结合GUI用户使用界面的框架设计,本文GUI设计主要遵循以下原则:

1. 简单性:根据人视觉美学的需要,以及人们对用户使用界面的喜好,在设计界面时应当力求简洁直观,体现必要功能和特征,去除冗余的控件、窗口,通过多采用生动形象的图形来代替文字从而加强美观度;

2. 一致性:设计通常追求简洁、精美,为达到这样的效果,需要保持整体界面风格的一致,从颜色到排版都需要保持协调一致,将各对象按照功能和习惯进行排列分组,让用户轻松使用;

3. 安全性:界面的设计需要全面考虑用户的实际体验,当用户不熟悉的时候,往往可能做出错误操作,故此,需要使得用户对界面的操作尽可能可逆,当用户做出错误甚至危险操作时,系统应当给出提示或者警告信息;

4. 其他因素:动态的性能能够给与用户更好的更直接的感官体验,所以在设计界面时,应当注重界面的动态性能;软件的设计皆是为了硬件服务,注重界面的美观的前提是保证良好的功能条件,响应迅速连续,对于持续时间较长应给出等待时间提示,允许用户中断运算等。

5.3 设计和实现战术手势识别用户使用界面

根据基于MATLAB的战术手势识别功能的预期目标和实现需求,在设计战术手势识别用户界面时,需要实现的功能设计包含一个选择控件、一个展示面板、一个结果面板、一个重置控件。通过单击选择控件,会弹出手势视频文件的选择窗口,通过选择对应的手势视频文件读取后,选择控件下的回调函数会执行手势视频的分割、手势图像的处理识别等功能,并将执行后的结果于展示面板中呈现。并且,实现功能演示后,在结果面板中会根据选择的视频将对应的识别文字结果进行展示并播放对应的结果音频文件。完成一个手势视频的处理识别操作后,单击重置控件,使得整个战术手势识别用户使用界面回到初始状态。另外,当单击选择控件,弹出手势视频文件的选择窗口后,用户没有选择手势视频文件进行读取时,将会弹出错误提示窗口。

本节以“1 2 3 前方发现敌人,所有人散开”为实例进行战术手势识别用户使用界面的构建进行详细介绍,当用鼠标单击读取视频按钮选择对应的视频进行读取后,即在主界面中读取并播放该视频,对读取的视频进行帧数分割并将分割图片进行展示,随后通过图像处理和手势识别的算法,实现手势识别结果的呈现。可令初学者直观的感受到不同的图像处理函数的功能。

5.3.1 用户识别界面的构建

基于MATLAB的战术手势识别功能,设计总体可以分为手势视频分解、手势图像处理与识别、GUI用户使用界面三个部分,在GUI用户使用界面的设计中,为便于用户的操作使用以及对手势识别的结果有一个直观的印象,综合分析后设计呈现的步骤为手势视频的录入和分解、手势图像处理与识别、手势识别结果的文字结果呈现和语音结果播放以及程序重置四个部分内容,根据前文兼顾GUI用户使用界面的美观和各个模块的功能实现两个方面所设想的用户使用界面图,结合实际条件和功能实现,初步搭建用户使用界面如下图:

图5-8 初步搭建用户使用界面

在实际使用中,通过按扭的使用,将文件中的视频录入并在axes4这一图像处理轴上呈现,并实现了自动播放。在视频截取结果框图中,设计了三个axes轴来展示手势视频分解后的手势图像,在图像处理和手势识别完成后,文字的结果呈现于设置好的静态文本框中,并同步自动播放对应的音频文件。当手势视频的录入和分解、手势图像处理与识别、手势识别结果的文字结果呈现和语音结果播放三个部分全部完成后,设计的程序重置按钮能清空程序内运行完成的图像、文字等内容,以进入第二次的运行。通过对各个控件的拖动设计,初步实现了预期效果,其展示形式如下:

图5-9 初步搭建用户使用界面展示

在初步设计出战术手势识别用户使用界面后,结合实际运用的需要,将该界面的背景、控制按钮字体、颜色等内容进行优化保证美观。在设计中,视频图片截取结果中采用了三个axes轴来展示手势视频分解后的手势图像,但在实际运用中,为保证手势图片像素的清晰度和准确度,实际拍摄的图片的长度和宽度通常难以保持相应的纵横比,故此,在考虑到整个用户使用界面的美观度的同时,对这三个axes轴进行了隐藏式处理。

在对用户使用界面的背景进行设计时使用的代码如下:

% --- Executes during object creation, after setting all properties.

function figure1_CreateFcn(hObject, eventdata, handles)

% hObject handle to figure1 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles empty - handles not created until after all CreateFcns called

ha=axes('units','normalized','pos',[0 0 1 1]);

uistack(ha,'down');

ii=imread('beijing.png');

image(ii);

colormap gray

set(ha,'handlevisibility','off','visible','off');

最终效果如下:

图5-10 战术手势识别系统用户使用界面

在完成战术手势识别系统的用户使用界面后,根据预期需要实现的功能和目标,针对各个控件的功能和axes轴需要展示的内容进行设计,在各个控件中对其回调函数进行设置,如下图

图5-11 进入读取视频按钮回调函数

选择查看GUI读取视频按钮的Callback回调函数后进入如下界面:

图5-12 打开图片回调函数

在GUI读取视频按钮的Callback回调函数中,通过文件名(filename)和路径(pathname)的设置,使得用户在界面单击读取视频按钮后,直接弹出选择视频文件对话框,直接采用选中视频打开读取的方式进行手势视频的录入,方便简洁,其效果如图:

图5-13 选择视频文件对话框

在录入视频后,根据本文中规定的手势识别规则,以每三个手势图片为一组进行识别并得出结果,所以需要对录入的视频进行分割处理,在录制并测试多个手势视频后,最终采取以帧数分割的形式来得到所需要的手势图片。其思想为,正常播放一个完整的手势视频,每隔五个帧数的图片进行一次图片保存,获取完成后将所有照片分为三段,再在每一段中取中位数,将获得的图片保存至对应文件夹。通过实际研究测试,按照人手势的使用习惯,在录成视频时每个手势持续时间差不多,故此以5为基数进行的帧数分割能保证最大概率获得准确的手势图像。

手势视频帧数分割代码如下:

for t = 1: numFrames

if 5*t<numFrames

frame = read(obj,5*t);%隔5张保存一张图像

I=frame;

%保存每一帧图片

imwrite(I,strcat('E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(t),'.jpg'),'jpg');

end

end

通过对手势视频的帧数分割获得相应的手势图片后,需要对获取的手势图片进行调用并呈现在对应的axes轴上,在对axes轴的CreateFcn回调函数进行设置的过程中,通过建立一个数组(文中为imageindex)对分解的图像进行定位,而后在Imread调用图片路径中以num2str(imageindex1)作为图片的文件名。通过该算法的计算和数组的运用后,用户读取的手势视频经分割处理后的三组准确图像就能准确的呈现在对应的axes轴上。其代码如下:

for i = 1

imageindex1 = (2*i-1)*sumnum1/2;%定位标签

imageindex2 = (2*(i+1)-1)*sumnum1/2;

imageindex3 = (2*(i+2)-1)*sumnum1/2;

end

imageindex1 = round(imageindex1);

imageindex2 = round(imageindex2);

imageindex3 = round(imageindex3);

Image{1}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex1),'.jpg']);%图像存入数组

Image{2}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex2),'.jpg'])

Image{3}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex3),'.jpg'])

set(handles.axes1,'HandleVisibility','ON');%打开坐标,方便操作

axes(handles.axes1);%%使用图像,操作在坐标1

imshow(Image{1}); %显示每一帧图片

set(handles.axes2,'HandleVisibility','ON');%打开坐标,方便操作

axes(handles.axes2);%%使用图像,操作在坐标1

imshow(Image{2}); %显示每一帧图片

set(handles.axes3,'HandleVisibility','ON');%打开坐标,方便操作

axes(handles.axes3);%%使用图像,操作在坐标1

imshow(Image{3}); %显示每一帧图片

针对设计中运用到的axes2轴和axes3轴进行设置后,就能实现读取手势视频后,对视频进行自动的分割成三张手势图片从而进入下一步的图像处理和手势识别过程。

图5-14 读取手势视频后结果

通过读取手势视频并对视频进行的分割呈现,顺利获得了按照本文设定的战术手语所规定的三组手势图像。在获取手势图像后,对获得的手势图像进行图像处理并代入神经网络库进行识别,从而得出了对应的文字识别结果并弹出识别成功对话框。

图5-15 录入视频识别成功

根据第四章中设定好的战术手语编成内容,在MATLB中规定并编写了对应的数组,其中,规定各组战术手势对应的文字结果为一个数组(文中为strvalue),各组战术手势对应的数字结果为一个数组(文中为re_mat),保持两组数组的一一对应顺序,确保识别结果的准确。

其代码如下:

load('net.mat');%数据初始化

load('class_name.mat');

strvalue = {'前方发现敌人,所有人散开','前方敌人弱火力点,进行两侧攻击','发现敌人重火力点,迅速趴下','所有人散开,至前方集合','报告!搜索发现强火力点','敌人已消灭,前方展开搜索'};

re_mat= [123,176,285,914,428,3110];

regc = 0;

将读取的手势视频分割为对应的三组手势图片后,通过多次实验测试得出,以index=1:3参数进行调试可以达到最为准确的实验结果,通过对获得的手势图片特征归一化处理后,将所得结果建立为数组(文中为fetuer_arr),而后将所得结果存入MATLAB的net神经网络库进行识别,得出识别的各个图像对应的数字结果,最终识别匹配出用户读取的视频对应的文字识别结果,其代码如下:

for index=1:3

im =Image{index};%索引数组

fetuer_arr = Shape(im,0);

fetuer_arr = fetuer_arr';

fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征归一化

fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征归一化

fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征归一化

[result] = net(fetuer_arr);

[va,ind] = max(result);

ind = str2double(class_name{ind});

if(ind~=20)

regc = ind+regc*10;

else

regc = regc*100+ind;

end

end

[flag,memindex] = ismember(regc,re_mat);

if flag

%fprintf('识别手势为:%d\n',regc);

value = strvalue(memindex);%文字结果

set(handles.edit1,'string',value)%设置显示结果

end

toc;

msgbox('识别完成','结果');

在完成战术手势的读取和识别后,用户即得到了与其读取视频相对应的文字结果。同时,为了用户在使用时的便利性以及整体设计的生动性,在识别得出文字结果后,通过MATLAB函数的编写,实现同步的文字结果的语音播放,从而使得该GUI用户使用界面的结果展示更加生动形象,能够适应更多人群的需要,其代码如下:

sound_dir = 'E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据';

sound_list = dir([sound_dir,'\*.mp3']);

if flag

%fprintf('识别手势为:%d\n',regc);

sound_file_name = [sound_dir,'/',sound_list(memindex).name];

[y, Fs] = audioread(sound_file_name);

sound(y,Fs);

end

完成对一个手势视频的读取与识别后,通过单击程序重置按钮,复原整个手势识别用户使用界面,用户即可按照同样的顺序读取新的视频进行新一轮的处理和识别过程。其代码如下:

axes(handles.axes1);%清空图像

cla

axes(handles.axes2);

cla

axes(handles.axes3);

cla

axes(handles.axes4);

cla

set(handles.edit1,'string','');%清空结果

5.4 本章小结

本章从用户实际使用的角度出发,结合实际需求分析,依次介绍了GUI设计的基本概念和流程,通过实际设计,详细介绍了本文设计的GUI用户界面的实现过程,并给出了实现的关键代码和相关界面截图。

第六章 战术手势识别功能的测试与分析

为了测试系统的各项功能是否能够正常地运行,对本系统的进行多次测试,并对每个测试进行计时,得出实验结果并针对错误进行改进,以确保系统正常运行。

6.1 系统的测试与分析

系统的测试与分析作为建议系统可靠性和质量的关键步骤,其目的是在完成开发后,通过对开发中各个阶段的需求和功能的实现进行测试检验,通过全面或者特殊的测试用例,来测试运行结果,确保以最少的时间和精力来发现错误。系统的测试与分析作为系统开发的最后阶段工作,是十分重要并不可或缺的,通过测试,能够发现前期设计中忽略的一系列问题,保证了系统或功能的质量和可靠性。一般的,系统的测试与分析需要遵循以下原则:

1. 测试用例应当具备有效合理的特性,并且要有代表性,能够通过该测试例子得出整体设计的普遍规则;

2. 测试工作应当贯穿整个系统或功能的设计与实现的各个阶段,发现问题尽早纠正,以减低后期修改的工作量;

3. 测试过程产生的结果、数据应该整理保存,并作为论文的重要组成部分。

6.2 战术手势识别功能测试

6.2.1 战术手势识别功能测试(一)

针对本文设计的基于MATLAB的战术手势识别功能,结合文中编成的战术手语库,对设计组合的六组战术手语分别进行测试,并记录从读取视频到完成识别的时间,为分析改进提供重要依据。

在测试过程中,运用MATLAB的tic和toc代码,即可完成对整个识别过程的自动计时。

(1)第一组:测试数组为1 2 3。对应识别结果为:前方发现敌人,所有人散开。

在MATLAB运行main代码,读取第一组测试视频后,呈现结果如下图。

图6-1 第一组测试视频

通过测试,第一组视频顺利完成识别,通过tic和toc代码计算得出识别时间为0.765040秒

第二组:测试数组为1 7 6。对应识别结果为:前方发现弱火力点,进行两侧进攻。

针对第二组测试,为提高测试准确度和全面性,第二组测试视频选用了视频及视频分割后形成图像方向为横向的手势视频,从而与其他测试组形成对比分析结果。

单击程序重置按钮重置程序后,读取第二组测试视频后,呈现结果如下图。

图6-2 第二组测试结果

通过测试,第二组视频顺利完成识别,通过tic和toc代码计算得出识别时间为1.415490秒

在测试视频中,第二组视频及图片方向为横向而另外五组视频及图片方向均为纵向,通过第二组的对比测试可以分析得出,视频和图片的方向不影响整体功能测试的完成,整体仍旧能够保持较好的识别速度和效率。

第三组:测试数组为2 8 5。对应识别结果为:发现敌人重火力点,迅速趴下。

单击程序重置按钮重置程序后,读取第三组测试视频后,呈现结果如下图。

图6-3 第三组测试结果

通过测试,第三组视频顺利完成识别,通过tic和toc代码计算得出识别时间为0.661082秒

第四组:测试数组为9 1 4。对应识别结果为:敌人已消灭,前方展开搜索。

单击程序重置按钮重置程序后,读取第四组测试视频后,呈现结果如下图。

图6-4 第四组测试结果

通过测试,第四组视频顺利完成识别,通过tic和toc代码计算得出识别时间为0.639774秒

第五组:测试数组为4 2 8。对应识别结果为:报告!搜索发现强火力点。

针对第五组测试,为提高测试准确度和全面性,第五组测试视频选用了未经模糊化处理的原始视频,并与经过模糊化处理的测试视频进行对比测试,从而形成对比分析结果。

单击程序重置按钮重置程序后,分别读取格式为avi的经模糊化处理的和格式为mp4的第五组测试视频后,呈现结果如下图。

图6-5 第五组测试结果(mp4)

图6-6 第五组测试结果(avi)

通过测试,第五组视频顺利完成识别,通过tic和toc代码计算得出,未经模糊化处理的原始视频识别时间为4.761494秒,而经过模糊化处理的测试视频识别时间为0.655298秒,两者测试时间相差约为7倍。

在对整个识别过程进行分析后,针对影响手势视频识别速率的因素得出以下两个方面的结论:

(1)通过对该组视频的基本属性进行分析,经过模糊化处理的测试视频avi,视频较为模糊,对应的分辨率为272×480;未经过模糊化处理的原始视频MP4,视频较为清晰,对应的分辨率为1080×1920。

通过对比分析得出,视频的帧宽度和帧高度即视频的清晰度会对读取视频后的视频分割造成影响,从而造成整体识别的速率。

图6-7 第五组视频属性对比

(2)通过对读取视频后分割形成的图像属性进行分析,未经过模糊化处理的原始视频MP4,分解形成的图像较为清晰,分辨率为1080×1920,其对应的大小为59.5kb;而经过模糊化处理的测试视频avi,分解形成的图像较为模糊,分辨率为272×480,其对应的大小为6.87kb。

综合以上属性,通过分析得出MATLAB对不同分辨率的图像识别速率不同从而会对设计整体识别速率造成影响。

图6-8 第五组分割后图像属性对比

第六组:测试数组为1 8 9。对应识别结果为:报告!前方强火力点已消灭。

单击程序重置按钮重置程序后,读取第六组测试视频后,呈现结果如下图。

图6-9 第六组测试结果

在第六组测试中,读取的手势视频能够正确分解为对应的三个手势图片,但出现了没有得出识别结果的问题。

针对该问题,在代码的检查完成并确认无误后,为查找无法识别问题的原因,通过在手势识别源代码中进行断点检查的方式进行无法正确识别结果问题的排查。

在综合考虑多个断点查找方法后,决定采取在完成手势识别与手势识别结果呈现这两个部分中间设置断点,从而判断该读取的手势视频实际识别出的数字结果,从而判断问题所在。

在图中所示位置,即代码第337行处设置一断点,而后运行程序,再次读取视频,得到结果如下图。

图6-10 断点运行后结果

通过断点运行后结果可以得出,在该组中读取的视频正确完成了视频分割、图像处理以及图像识别的过程,但是图像识别结果为337,与实际对应数字189不符。根据断点运行后结果初步判断出现无法正确识别出结果的问题为:训练图片数量较少或相似造成的识别混乱。

根据以上分析结果,在对训练图像库进行整理添加后,尤其针对1、3、7、8、9这五个数字的训练图像库进行添加整理,而后运行train代码对训练图像进行第二次训练。

训练完成后结果如下图:

图6-11 第二次训练结果

完成训练后,再次运行main代码,按照同样的步骤读取第六组视频,成功识别出结果。

图6-12 第六组修正后训练结果

通过测试,第六组视频顺利完成识别,通过tic和toc代码计算得出识别时间为1.162034秒

6.2.2 战术手势识别功能测试(二)

通过对本文中规定的六组手势组合进行测试,从而基本分析出了整个功能再实现和运用中可能存在的问题和不足之处,下面,针对整体功能的实现,进行一百组手势数组的实验测试,从而得到每一组数组的测试时间

结合本文对数组的设计背景,以1到10的十个数字为集合,取三个元素为一组进行不重复的排列组合,产生的组合有4320种。

图6-13 排列组合结果

根据设计实验测试的实际需求和需要,在1到10的十个数字为集合产生的4320种组合中,选择出符合语句序列并且贴近实战的100组战术手势语言组合进行战术手势识别功能的第二轮测试。

通过对100组语句序列的挑选分析以及编成,下面将编成的100组战术手语分为5组,每20个语句为一组进行测试并列表。每组测试需要事先拟写的内容包括战术手势语言组合的数字组合、文字含义,需要测试得到的内容为每一组手势语言的识别时间,建立文件夹如图6-14。

图6-14 100组测试视频

相对应的将100组视频的文字结果进行转化得到音频结果如图6-15。

图6-15 100组测试音频(截取部分)

最终通过对100组战术手势语言组合的测试时间的数学分析,得出普遍规律并加以分析。

五组测试结果表如下:

表6-1 第一组数组测试结果(1-20)

序号 数组 文字含义 测试时间
001 1 2 3 前方发现敌人,所有人散开。 0.765040
002 1 7 6 前方发现弱火力点,进行两侧进攻 1.415490
003 2 8 5 发现敌人重火力点,迅速趴下。 0.661082
004 9 1 4 敌人已消灭,前方展开搜索 0.639774
005 4 2 8 报告!搜索发现强火力点 0.655298
006 1 8 9 报告!前方强火力点已消灭 1.162034
007 1 2 5 前方发现敌人,迅速趴下。 0.645282
008 1 2 7 前方发现敌人弱火力点。 0.688214
009 1 2 8 前方发现敌人强火力点。 0.710258
010 1 2 10 前方发现敌人,迅速集合! 0.692015
011 3 1 4 散开,前面展开搜索。 0.625894
012 3 6 8 散开,对敌人强火力点进行两侧进攻。 0.895220
013 3 7 10 散开,至敌人弱火力点处集合。 0.675215
014 3 5 4 散开,趴下进行匍匐搜索。 0.652113
015 1 5 7 前方趴下与敌人弱火力点对峙。 0.642581
016 1 4 8 前方展开搜索而后建立强火力点。 1.158995
017 1 4 7 前方展开搜索而后建立弱火力点。 0.664821
018 1 4 10 前方展开搜索而后集合。 0.642587
019 1 9 10 前方敌人已消灭,集合。 0.641258
020 2 9 7 发现敌人已消灭弱火力点。 0.681204

表6-2 第二组数组测试结果(21-40)

序号 数组 文字含义 测试时间
021 5 8 3 匍匐(趴下)前进,至强火力点散开。 错误识别
022 1 3 5 前方散开,趴下观察。 0.675215
023 5 7 3 匍匐(趴下)前进,至弱火力点散开。 0.669872
024 1 3 4 前方散开,展开搜索。 0.636489
025 9 3 4 敌人已消灭,前方散开进行搜索。 0.642538
026 1 6 8 前方成两侧队形进攻敌人强火力点。 0.723586
027 1 6 7 前方成两侧队形进攻敌人弱火力点。 0.658328
028 7 9 10 弱火力点敌人已消灭,迅速集合。 0.695323
029 2 7 9 发现敌人被摧毁弱火力点。 0.735286
030 8 9 10 强火力点敌人已消灭,迅速集合。 0.953218
031 10 4 8 集合,搜索敌人强火力点。 0.782356
032 1 5 10 前方匍匐(趴下)前进,而后集合。 0.683329
033 5 3 4 匍匐(趴下)散开,展开搜索。 0.728535
034 7 3 6 以弱火力点为准散开,进行两侧进攻。 0.653221
035 8 3 6 以强火力点为准散开,进行两侧进攻。 0.623228
036 2 8 9 发现敌人被摧毁强火力点。 0.782325
037 1 10 4 前方集合,展开搜索。 0.695238
038 2 7 5 发现敌人弱火力点,迅速趴下。 0.786333
039 9 1 10 敌人已消灭,前方集合。 0.953219
040 10 4 7 集合,搜索敌人弱火力点。 0.681234

表6-3 第三组数组测试结果(41-60)

序号 数组 文字含义 测试时间
041 5 1 7 趴下,前方敌人弱火力点。 0.654768
042 5 1 8 趴下,前方敌人强火力点。 0.753875
043 7 1 6 我方弱火力点进行两侧进攻。 1.246547
044 8 1 6 我方强火力点进行两侧进攻。 0.744464
045 9 1 7 敌人已消灭,前方建立弱火力点。 0.764395
046 9 1 8 敌人已消灭,前方建立强火力点。 0.623345
047 10 4 1 密集搜索前方。 0.624367
048 9 10 1 敌人已消灭,集合前进。 0.667467
049 6 1 10 两侧进攻前方敌人聚集地。 0.825476
050 9 10 4 敌人已消灭,集合搜索。 0.676542
051 8 10 4 敌人强火力点集合,而后展开搜索 0.698543
052 7 10 4 敌人弱火力点集合,而后展开搜索 1.243668
053 8 10 5 至(我方)强火力点集合趴下。 0.733656
054 7 10 5 至(我方)弱火力点集合趴下。 0.658643
055 8 10 9 敌方强火力点聚集地敌人已消灭。 0.638757
056 7 10 9 敌方弱火力点聚集地敌人已消灭。 0.643858
057 1 8 10 前方强火力点处集合。 错误识别
058 1 7 10 前方弱火力点处集合。 0.679447
059 1 8 3 前方强火力点处散开。 0.713554
060 1 7 3 前方弱火力点处散开。 0.654768

表6-4 第四组数组测试结果(61-80)

序号 数组 文字含义 测试时间
061 3 7 6 散开,向敌人弱火力点两侧进攻。 0.856234
062 3 8 6 散开,向敌人强火力点两侧进攻。 0.745896
063 1 7 5 前方弱火力点处趴下。 0.763489
064 1 8 5 前方强火力点处趴下。 0.603506
065 1 7 9 报告!前方弱火力点已消灭。 0.865023
066 1 9 4 前方敌人已消灭,展开搜索。 0.642036
067 2 8 10 发现敌人强火力点,集合。 0.960325
068 2 7 10 发现敌人弱火力点,集合。 0.622306
069 2 9 8 发现敌人已消灭强火力点。 0.700630
070 4 2 7 搜索发现敌人弱火力点。 0.830265
071 9 4 1 敌人已消灭,搜索前进。 0.603598
072 9 5 1 敌人已消灭,匍匐(趴下)前进。 0.860325
073 5 4 1 匍匐(趴下)搜索前方。 0.769325
074 5 4 7 匍匐(趴下)搜索敌人弱火力点。 1.103642
075 5 4 8 匍匐(趴下)搜索敌人强火力点。 0.960351
076 1 7 4 前方弱火力点展开搜索。 0.862035
077 1 8 4 前方强火力点展开搜索。 1.225815
078 3 8 4 以强火力点为基准散开进行搜索。 0.730451
079 3 7 4 以弱火力点为基准散开进行搜索。 0.632587
080 8 9 1 敌人强火力点已消灭,前进。 0.964046

表6-5 第五组数组测试结果(81-100)

序号 数组 文字含义 测试时间
081 7 9 1 敌人弱火力点已消灭,前进。 0.765040
082 6 9 10 两侧进攻成功消灭敌人,集合。 1.315490
083 1 6 4 前方展开两侧搜索。 0.561082
084 6 5 7 两侧匍匐进攻敌人弱火力点。 0.639774
085 6 5 8 两侧匍匐进攻敌人强火力点。 0.655298
086 8 10 7 我方强火力点集火敌人弱火力点。 1.162034
087 7 10 8 我方弱火力点集火敌人强火力点。 错误识别
088 8 10 1 强火力点集中攻击前方。 0.688214
089 7 10 1 弱火力点集中攻击前方。 0.710258
090 7 9 4 敌人弱火力点已消灭,展开搜索。 0.692015
091 8 9 4 敌人强火力点已消灭,展开搜索。 0.625894
092 5 1 4 匍匐前进式搜索。 0.895220
093 5 1 6 匍匐前进两侧进攻。 0.675215
094 6 4 7 两侧搜索发现敌人弱火力点。 0.652113
095 6 4 8 两侧搜索发现敌人强火力点。 0.642581
096 6 5 4 两侧匍匐式搜索。 1.058995
097 1 5 4 前方匍匐式搜索。 0.664821
098 10 1 4 集合进行匍匐式搜索。 0.742587
099 6 5 1 两侧匍匐前进。 0.641258
100 7 6 10 弱火力点进行两侧进攻消灭敌人。 0.681204

以上即为基于MATLAB的战术手势识别功能进行的100组战术手势语言组合进行的测试结果。在对分为五组的100组战术手势语言组合进行测试后,通过数学方法对得出的结果进行平均值、方差、极值、识别率等方面的计算并进行分析。

6.3 测试结果分析

通过上一节中针对本文设计的基于MATLAB的战术手势识别功能进行的两组测试,得出的结果分析如下:

(一)在识别时选取的手势视频的格式对整个手势识别过程速率影响较大。通常通过手机、相机等数码设备拍摄获得的手势视频分辨率较高、体积也较大,对识别的速率会产生一定影响。故此,在实际运用时,可以通过蜂窝、格式工厂等相关视频处理软件对手势视频进行模糊化处理,也就是降低分辨率。

(二)视频和图片的方向不影响整体功能测试的完成,整体仍旧能够保持较好的识别速度和效率。故此在拍摄手势视频和手势图片时,不需要考虑方向因素,但是本文设计所使用的视频、图片皆是以二维平面的形式加以使用,所以在实际拍摄时需要考虑手的空间角度。

(三)在对基于MATLAB的战术手势识别功能进行的100组战术手势语言组合进行的测试结中,平均的识别时间为0.76秒,该时间较短,说明整体功能实现和运行较为良好,能够较高效率的实现手势视频的处理和识别过程;

(四)在对基于MATLAB的战术手势识别功能进行的100组战术手势语言组合进行的测试结中,识别时间极大值为1.41秒,极小值为0.56秒,极差为0.85秒,方差为0.031。同时,通过97组有效测试数组的测试时间分布图综合来看,识别时间的极大值和极小值差值较大,整体的波动明显。

(五)在对基于MATLAB的战术手势识别功能进行的100组战术手势语言组合进行的测试结中,数字8、10、7、5、3为高频错误手势,尤其数字8、10有较大的错误率。结合这五组数字对应的手势进行分析,7、8、3数字手势形态相近,特征上具有共同点,在识别过程中容易产生混淆,10、5数字手势作为源手势,是其他数字手势通过变形产生手势的基础手势,广义性比较强,在识别过程中容易出现错误。

(六)综合两轮测试结果,基于MATLAB的战术手势识别整体识别正确率较高,识别时间较短,基本实现了预期目标。

第七章 总结与展望

7.1 总结

随着现代技术的发展,各种无线、有线通信联络方式飞速发展,有效保障了分队行动中的良好通信联络。但是,战场环境的多变导致依靠无线电波等技术的通信联络具有较高的不确定性,其受地形、天气等要素的影响较多,同时也易遭到敌方势力的电子对抗打击从而降低甚至破坏我方通信联络效能。故此,作为分队行动中的战术手势通信不可或缺。

总结全文,个人设计主要完成的工作如下:

(一)基于图像处理和手势识别的功能分析,建立了战术手语库,以十个数字为基准赋予文字意义,并以每三个手势动作为一组进行定义,形成了完整的手势语言。

(二)研究并掌握了MATLAB的图像处理和手势识别并通过学习代码、查询书籍、练习输入代码、上机实践操作等过程深入了解了代码的编写和运用。并通过实际设计运用,选用了相应的图像处理方法和BP神经网络识别方法,实现了对手势图像的处理和识别。

(三)通过对GUI用户使用界面的研究和掌握,设计了基于MATLAB的战术手势识别功能的设计与实现的用户使用模块。并通过代码的嵌入,完成了整体功能的实现。

7.2 展望

通过此次毕业论文的选题、撰写以及整个毕业设计的完成,我从其中受益匪浅。在前期的选题过程中了解到,当前部队尤其是特战作战小队在执行解救人质、捕歼暴恐分子等任务时,需要确保良好的通信联络。否则低劣的通信质量在实战中将导致分队无法及时得到上级行动命令、失去对战场情况的把控,指挥部无法及时了解作战情况,导致行动指挥失控,最终导致丢失战场控制权,进而完全丧失战斗力。故此,为便于官兵在训练中加强对手语的记忆掌握,根据不同的战术背景不同的手语需要,针对特战小队在实际任务中可以运用到的手语联络方式进行设计研究,通过自拟暗语,完成了基于MATLAB的战术手语的识别功能的设计与实现。在学习MATLAB的图像处理和图像识别过程中,遇到复杂的代码、难以理解的概念时,通过导师和身边战友的帮助指导,使得我能够顺利实现MATLAB的编程操作。在学习GUI用户使用界面的过程中,实现了对基本控件的熟悉到整体框架的设计,最后实现的过程,达到了从不会到实现的预期目标。

但是,由于个人能力的局限性,在前期设计路线的制定上出现误区后未及时修正等问题,虽然在功能的设计以及论文撰写方面花了非常多的精力,但后期不得不放弃原先的一些想法,同时系统也难免出现一些漏洞或者错误,使得整体设计效果并不十分紧贴实战,利于实战。

本人深知系统软件的设计与开发并不是一朝一夕就能够做到完美无瑕,只有通过不断的创新与基础知识的学习,拓展更多的功能模块,提高功能的完整性,逐步提高系统的可操作性,实现对系统的进一步优化,也才更能够被广大基层单位认可并采用。

在下一步,我总结还有以下几点需要继续完善的方面:

一是提升整体设计的实战性,在本文的设计中,我采用的是读取事先录制好的视频进行的处理和识别,而后进行的教学使用,但在实际运用中,该方法无法做到真正的高效率以及生动性。在下步的设计中,应该将读取视频改制为摄像头自动捕捉手势,而后自动进行处理识别,这样使得整体设计更为方便、高效率,并且在必要时,能够投入实战进行使用;

二是在图像的处理部分回避了手势背景的问题,同样的,无论是用于教学的手势学习还是用于实战的手语联络,在实际运用中往往无法保证背景的单一性,故此应该针对所使用的手势图像进行背景的处理,从而更加适合于实际运用;

三是手势图像的训练图库数量较少,在本文设计的测试中可以看出,训练手势图像的数量不足会导致训练结果的不准确从而导致最终无法识别。针对该问题,应该从各个年龄段、各类人群进行手势图像的获取从而有效地扩大手势训练数量,从而确保识别的准确度和效率;

四是GUI用户使用界面的设计较为简单,总体的布局设计比较粗糙,可以适当添加教学使用过程中的正误判断、自我测试等功能设计。

附 录

附录一 功能完整设计与实现代码

% --- Executes on button press in pushbutton4.

function pushbutton4_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton4 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

load('net.mat');%数据初始化

load('class_name.mat');

sound_dir = 'E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据';

sound_list = dir([sound_dir,'\*.mp3']);

strvalue = {'前方发现敌人,所有人散开','前方敌人弱火力点,进行两侧攻击','发现敌人重火力点,迅速趴下','所有人散开,至前方集合','报告!搜索发现强火力点','敌人已消灭,前方展开搜索'};

re_mat= [123,176,285,914,428,3110];

regc = 0;

Image{1}=getimage(handles.axes1);%图像存入数组

Image{2}=getimage(handles.axes2);

Image{3}=getimage(handles.axes3);

for index=1:3

im =Image{index};%索引数组

fetuer_arr = Shape(im,0);

fetuer_arr = fetuer_arr';

fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征归一化

fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征归一化

fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征归一化

[result] = net(fetuer_arr);

[va,ind] = max(result);

ind = str2double(class_name{ind});

if(ind~=20)

regc = ind+regc*10;

else

regc = regc*100+ind;

end

end

[flag,memindex] = ismember(regc,re_mat);

if flag

%fprintf('识别手势为:%d\n',regc);

value = strvalue(memindex);

set(handles.edit1,'string',value)%设置显示结果

sound_file_name = [sound_dir,'/',sound_list(memindex).name];

[y, Fs] = audioread(sound_file_name);

sound(y,Fs);

end

% --- Executes on button press in pushbutton5.

function pushbutton5_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton5 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

axes(handles.axes1);%清空图像

cla

axes(handles.axes2);

cla

axes(handles.axes3);

cla

axes(handles.axes4);

cla

set(handles.edit1,'string','');%清空结果

% --- Executes on button press in pushbutton6.

function pushbutton6_Callback(hObject, eventdata, handles)

% hObject handle to pushbutton6 (see GCBO)

% eventdata reserved - to be defined in a future version of MATLAB

% handles structure with handles and user data (see GUIDATA)

[filename,pathname]=uigetfile({'*.*'},'选择视频');

video = [pathname,filename];

obj = VideoReader(video); %读取视频文件

numFrames = obj.NumberOfFrames; %视频总的帧数

for y = 1: numFrames

frame = read(obj,y);

set(handles.axes4,'HandleVisibility','ON');%打开坐标,方便操作

axes(handles.axes4);%%使用图像,操作在坐标1

imshow(frame); %显示每一帧图片

end

for t = 1: numFrames

if 5*t<numFrames

frame = read(obj,5*t);%隔5张保存一张图象

I=frame;

%保存每一帧图片

imwrite(I,strcat('E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(t),'.jpg'),'jpg');

end

end

% msgbox('分解完成','结果');

tic;

load('net.mat');%数据初始化

load('class_name.mat');

sound_dir = 'E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据';

sound_list = dir([sound_dir,'\*.mp3']);

strvalue = {'前方发现敌人,所有人散开','前方敌人弱火力点,进行两侧攻击','发现敌人重火力点,迅速趴下','所有人散开,至前方集合','报告!搜索发现强火力点','敌人已消灭,前方展开搜索'};

re_mat= [123,176,285,914,428,3110];

regc = 0;

sumnum = fix(numFrames/5);%计算保存图像数量

sumnum1 = fix(sumnum/3);

for i = 1

imageindex1 = (2*i-1)*sumnum1/2;%定位标签

imageindex2 = (2*(i+1)-1)*sumnum1/2;

imageindex3 = (2*(i+2)-1)*sumnum1/2;

end

Image{1}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex1),'.jpg']);%图像存入数组

Image{2}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex2),'.jpg'])

Image{3}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex3),'.jpg'])

set(handles.axes1,'HandleVisibility','ON');%打开坐标,方便操作

axes(handles.axes1);%%使用图像,操作在坐标1

imshow(Image{1}); %显示每一帧图片

set(handles.axes2,'HandleVisibility','ON');%打开坐标,方便操作

axes(handles.axes2);%%使用图像,操作在坐标1

imshow(Image{2}); %显示每一帧图片

set(handles.axes3,'HandleVisibility','ON');%打开坐标,方便操作

axes(handles.axes3);%%使用图像,操作在坐标1

imshow(Image{3}); %显示每一帧图片

% Image{1}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex1),'.jpg']);%图像存入数组

% Image{2}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex2),'.jpg'])

% Image{3}=imread(['E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\分解图像\',num2str(imageindex3),'.jpg'])

for index=1:3

im =Image{index};%索引数组

fetuer_arr = Shape(im,0);

fetuer_arr = fetuer_arr';

fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征归一化

fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征归一化

fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征归一化

[result] = net(fetuer_arr);

[va,ind] = max(result);

ind = str2double(class_name{ind});

if(ind~=20)

regc = ind+regc*10;

else

regc = regc*100+ind;

end

end

[flag,memindex] = ismember(regc,re_mat);

if flag

%fprintf('识别手势为:%d\n',regc);

value = strvalue(memindex);%文字结果

set(handles.edit1,'string',value)%设置显示结果

sound_file_name = [sound_dir,'/',sound_list(memindex).name];

[y, Fs] = audioread(sound_file_name);

sound(y,Fs);

end

toc;

msgbox('识别完成','结果');

附录二 手势图像训练代码

clear all;

close all;

fulldirname = 'E:\基于MATLAB的战术手势识别功能的设计与实现\任务\匹配结果数据\训练图像';

fullfile = dir(fulldirname);

fetuer_arr = [];

target = [];

class_name = [];

sum = numel(fullfile);

%%一下代码是遍历文件夹的图像,并提取特征,合成特征矩阵

for fileindex=3:numel(fullfile)

if(fullfile(fileindex).isdir&&~isempty(fullfile(fileindex).name))

dirname = [fulldirname,'/',fullfile(fileindex).name];

class_name{end+1} = fullfile(fileindex).name;

filestr = dir([dirname,'/*.jpg']); %%查找目录的jpg图像

temp = zeros(numel(filestr),numel(fullfile)-2);

temp(:,fileindex-2) = ones(size(temp(:,fileindex-2)));

target = [target;temp];

for index=1:numel(filestr)

filename = [dirname,'/',filestr(index).name];%%图像文件名

im = imread(filename);%%读取图像

fetuer_arr = [fetuer_arr;Shape(im,0)];%%提取特征

end

end

end

%%一下代码主要是为了将提取的特征分为训练样本和测试样本

% trainstartIndex = 1:20:(numel(fullfile)-2)*20;%%利用每个文件夹的前15个图像训练,训练样本对应的开始坐标

% trainendIndex = 15:20:(numel(fullfile)-2)*20;%%驯良样本对一个的结束坐标

% trainIndex = [];

% for index=1:numel(trainstartIndex)

% trainIndex = [trainIndex,trainstartIndex(index):trainendIndex(index)];

% end

% testIndx = setdiff(1:20*(numel(fullfile)-2),trainIndex);

fetuer_arr = fetuer_arr';

target = target';

fetuer_arr(1,:) =(fetuer_arr(1,:)-1)/(4-1);%%特征归一化

fetuer_arr(2,:) =(fetuer_arr(2,:)-10)/(100-10);%%特征归一化

fetuer_arr(3,:) =(fetuer_arr(3,:)-1)/(4-1);%%特征归一化

% trainset= fetuer_arr(:,trainIndex);%%用于训练的特征样本

% traintaget = target(:,trainIndex);%%用于训练的目标标签

% testset = fetuer_arr(:,testIndx);%%用于测试的特征样本

% testtarget = target(:,testIndx);%%用于测试的目标标签

% save('trainset.mat','trainset');%保存变量

% save('testset.mat','testset');%保存变量

% save('testtarget.mat','testtarget');%保存变量

% save('traintaget.mat','traintaget');%保存变量

net = patternnet(10);%构建神经网络

net = train(net,fetuer_arr,target);%训练网络

save('net.mat','net');

% testresult = sim(net,testset);%利用网络测试数据集合

% for index=1:size(testresult,2)

% [ma result] = max(testresult(:,index));

% [ma corecet] = max(testtarget(:,index));

% fprintf('测试样本%d,所属类别%d:,分类类别:%d: )\n',index,corecet,result);

% end

附录三 手势图像处理代码

%%提取图片的形状特征

function feature = Shape(Image,istrain)

% Gray = rgb2gray(Image);%%转换为灰度图形

% hsv = rgb2hsv(Image);%%将rgb颜色空间转换为hsvyanse空间

% h = hsv(:,:,1);%%hsv颜色空间h通道

% s = hsv(:,:,2);

% v = hsv(:,:,3);

% BW = (h>0.14&s>0.17&h<0.565)|(h<0.15&s>0.3&v<0.56);%%选取图像中绿色区域,作为二值化结果

% th = graythresh(Gray);

% BW = im2bw(Gray,th);

% figure;

hsv = rgb2hsv(Image);

map = hsv(:,:,1)<0.09&hsv(:,:,2)>0.15;

map = imfill(map,'holes');

lab = bwlabel(map);

reg = regionprops(lab,'Area');

area = [reg.Area];

[va,maindex] = max(area);

BW2 = lab==maindex;

% th = graythresh(Gray);

% BW = im2bw(Gray,th);

% BW = 1-BW;

% BW2= imfill(BW,'holes');%%填充二值图像中的空洞

if(istrain)

subplot(1,2,1);imshow(hsv);title('hsv颜色空间');

% subplot(2,2,2);imshow(BW);title('根据颜色空间二值化图像');

subplot(1,2,2);imshow(BW2);title('空洞填充后图像');

end

regionprops(BW2);

imLabel = bwlabel(BW2); %对各连通域进行标记

stats = regionprops(imLabel,'Area','BoundingBox','Perimeter','MajorAxisLength','MinorAxisLength'); %求各连通域的大小

area = cat(1,stats.Area);

index = find(area == max(area)); %求最大连通域的索引 ,作为叶片区域

S = stats(index).Area;%计算叶片面积

Perimeter = stats(index).Perimeter;%计算叶片周长

BoundingBox = stats(index).BoundingBox;%%计算最小外接矩形

X = BoundingBox(3);%%外接矩形的长

Y = BoundingBox(4);%%外接矩形的宽

Rectangularity = X*Y/S;%%计算矩形度

Circularity = Perimeter^2/S;%%计算圆形度

Ecc = stats(index).MajorAxisLength/stats(index).MinorAxisLength;%%计算偏心率

BW =zeros(size(BW2));

BW(imLabel==index)=1;

if(istrain)

subplot(2,2,4);imshow(BW);title('叶片区域提取结果');

end

% figure;imshow(BW);

[M,N] = size(BW);

%%一下代码计算7个不变矩

%--------------------------------------------------------------------------

%计算图像质心:(I,J)

%--------------------------------------------------------------------------

m00 = sum(sum(BW)); %零阶矩

m01 = 0; %一阶矩

m10 = 0; %一阶矩

for i = 1:M

for j = 1:N

m01 = BW(i,j)*j+m01;

m10 = BW(i,j)*i+m10;

end

end

I = (m10)/(m00);

J = m01/m00;

%--------------------------------------------------------------------------

%中心矩:

%--------------------------------------------------------------------------

u11 = 0;

u20 = 0; u02 = 0;

u30 = 0; u03 = 0;

u12 = 0; u21 = 0;

for i = 1:M

for j = 1:N

u20 = BW(i,j)*(i-I)^2+u20;

u02 = BW(i,j)*(j-J)^2+u02;

u11 = BW(i,j)*(i-I)*(j-J)+u11;

u30 = BW(i,j)*(i-I)^3+u30;

u03 = BW(i,j)*(j-J)^3+u03;

u12 = BW(i,j)*(i-I)*(j-J)^2+u12;

u21 = BW(i,j)*(i-I)^2*(j-J)+u21;

end

end

u20 = u20/m00^2;

u02 = u02/m00^2;

u11 = u11/m00^2;

u30 = u30/m00^(5/2);

u03 = u03/m00^(5/2);

u12 = u12/m00^(5/2);

u21 = u21/m00^(5/2);

%--------------------------------------------------------------------------

%7个Hu不变矩:

%--------------------------------------------------------------------------

n(1) = u20+u02;

n(2) = (u20-u02)^2+4*u11^2;

n(3) = (u30-3*u12)^2+(u03-3*u21)^2;

n(4) = (u30+u12)^2+(u03+u21)^2;

n(5) = (u30-3*u12)*(u30+u12)*((u30+u12)^2-3*(u03-3*u21)^2)+(u03-3*u21)*(u03+u21)*((u03+u21)^2-3*(u30+u12)^2);

n(6) = (u20-u02)*((u30+u12)^2-(u03+u21)^2)+4*u11*(u30+u12)*(u03+u21);

n(7) = (3*u21-u03)*(u30+u12)*((u30+u12)^2-3*(u03-3*u21)^2)+(u30-3*u21)*(u03+u21)*((u03+u21)^2-3*(u30+u12)^2);

feature = [Rectangularity,Circularity,Ecc,n];%%将计算的所有特征连接起来作为形状特征

参考文献

  1. 杨丹,赵海滨,龙哲编著. 《MATLAB图像处理实例讲解》,清华大学出版社,2013.
  2. 余胜成编著. 《MATLAB优化算法案例分析与应用》,清华大学出版社,2014.
  3. 江立,阮秋琦. 基于神经网络的手势识别技术研究[J],北京交通大学计算机与信息技术学院,北京100044.
  4. 曾芬芳. 基于模糊神经网络的手势识别[J].小型微型计算机系统,2000(7):706—709.
  5. 张珩. 人体手部的建模与分析[J].计算机仿真,1998,15(2):10—13.
  6. 许金鹏,张亚,吕铁钢,马焱. 基于MATLAB的静态手势分割与识别研究[J]. 中北大学机电工程学院
  7. 季秀怡. 浅析人工智能中的图像识别技术[J]. 电脑知识与技术, 2016(5X):2-2.
  8. 张新景 王勇 史颖刚. 基于MATLAB GUI的图像处理演示系统[J]. 信息技术与信息化, 2019(05):90-92.
  9. 盛杰诚. 人工智能技术在智慧交通中的应用[J]. 电子制作, 2019(10):36-36.
  10. 王彦超. 图像处理与识别技术的发展及应用分析[J]. 无线互联科技, 2018(13):3-3.
  11. 郭庆春 何振芳. 基于人工神经网络的经济预测模型[J]. 计算技术与自动化, 2014(01):134-138.
  12. 李进明. 浅谈MATLAB软件在教育系统中的应用与研究[J]. 电子制作, 2014(14):59-60.
  13. 陈华. 浅谈神经网络的图像识别技术及方法[J]. 济宁师范专科学校学报, 2006(06):21-23.
  14. 熊宏锦 苑秉成 熊鹏文 任倩茹 张发辉. 一种手指姿态识别系统设计[J]. 计算机科学与应用, 2016(11):9-9.
  15. 吕品品. 浅谈MATLAB在数字图像处理中的应用[J]. 数字技术与应用, 2010(09):154-154.
  16. 姚锦秀 郑胜林 潘保昌. MATLAB应用在图像处理教学中的探讨[J]. 广东工业大学学报(社会科学版), 2004(S1):76-78.
  17. 刘赟 孙炎辉 黄向荣 于梁. 基于BP神经网络的手势识别系统[J]. 物联网技术, 2013(07):21-23.
  18. 吴茜 王亚慧. 基于RBF与BP神经网络的建筑电气系统故障诊断比较研究[J]. 北京建筑工程学院学报, 2012(04):45-50.
  19. 熊宏锦 苑秉成 熊鹏文 任倩茹 张发辉. 一种手指姿态识别系统设计[J]. 计算机科学与应用, 2016(11):9-9.
  20. 高伟 郭瑾 曾碚. 手语研究的方向与现状[J]. 电子技术应用, 2002(11):3-5.

基于MATLAB的战术手势识别功能的设计与实现相关推荐

  1. matlab模拟角度调制系统的仿真与设计,基于Matlab的模拟通信系统的仿真设计

    <基于Matlab的模拟通信系统的仿真设计>由会员分享,可在线阅读,更多相关<基于Matlab的模拟通信系统的仿真设计(25页珍藏版)>请在人人文库网上搜索. 1.目录摘要-第 ...

  2. 基于MATLAB的答题卡识别软件设计

    基于 MATLAB 的答题卡识别软件设计 课题意义 随着教育技术的飞速发展,考试普遍使用答题卡来记录答案,采用计算机自动识别答案卡信息,计算考生的成绩,可以减少阅卷人的工作量.本文利用 Matlab ...

  3. 基于MATLAB GUI的数字滤波仿真平台设计

    基于MATLAB GUI的数字滤波仿真平台设计 一.平台介绍 二.设计原理 1. 登陆系统设计原理 2. IIR数字滤波器设计 3. FIR数字滤波器设计 三.程序实现 1. 用户登陆系统程序 2. ...

  4. MATLAB与制冷,基于Matlab的CO2制冷系统的仿真设计与研究-暖通空调在线.PDF

    基于Matlab的CO2制冷系统的仿真设计与研究-暖通空调在线 基于Matlab 的CO2 制冷系统的仿真设计与研究 张云峰 窦明泰 张宇 李豪 (长沙理工大学能源与动力工程学院,长沙 410076 ...

  5. matlab凸轮转子泵型线设计坐标变换,基于Matlab的双头双螺杆泵转子型线设计

    ? 基于Matlab的双头双螺杆泵转子型线设计 基于Matlab的双头双螺杆泵转子型线设计 朱君,张帆,吴高捷,孙亚静 (扬州大学机械工程学院,江苏扬州 225127) 摘要:选用长幅外摆线加上外摆线 ...

  6. matlab 机床,基于MATLAB的数控机床控制系统的设计及仿真.PDF

    基于MATLAB的数控机床控制系统的设计及仿真 沈阳工业大学自动化学院 邢俊逸 摘要:为实现高性能的数控机床控制性能,本文通过对数控机床的伺服控 制系统进行分析,并对组成控制系统的元件进行研究建立了比 ...

  7. 基于MATLAB有噪声语音信号处理算法设计

    获取项目源文件,联系Q:1415736481,可指导毕设,课设 摘要 滤波器设计在数字信号处理中占有极其重要的地位,FIR数字滤波器和IIR滤波器是滤波器设计的重要组成部分.利用MATLAB信号处理工 ...

  8. matlab rltool,基于Matlab工具箱Rltool的控制系统校正设计

    山西电子技术2018 年第 4 期 软件技术 收稿日期:2018 -04 -10 作者简介: 乔永凤( 1975-) ,女,山西左云人,讲师,硕士研究生,主要研究方向: 语音信号处理,自动控制原理及其 ...

  9. 基于matlab的人脸五官边缘检测方法,基于MATLAB的人脸识别系统的设计

    基于MATLAB的人脸识别系统的设计(论文12000字,外文翻译,参考程序) 摘要:本文基于MATLAB平台设计了一款简单的人脸识别系统,通过USB摄像头来采集图像,经过肤色方法进行人脸检测与定位,然 ...

  10. 基于matlab的车牌识别系统程序,基于matlab的车牌识别系统的设计(附程序).doc

    基于matlab的车牌识别系统的设计(附程序).doc 1车牌识别系统的设计1.摘要:汽车牌照自动识别系统是制约道路交通智能化的重要因素,包括车牌定位.字符分割和字符识别三个主要部分.本文首先确定车辆 ...

最新文章

  1. next.js_Next.js手册
  2. 敏捷爽畅模型及其演变——Diana Larsen专访
  3. 独家 | 大数据与AI技术在金融科技的应用
  4. pt-table-sync常用参考
  5. 一个简单易用的图标字体库和CSS框架fontawesome
  6. python动态类型的坑_python进阶教程之动态类型详解
  7. 数据库双机热备(代码实现)
  8. (四)Linux 安装 jdk
  9. 【存档】20个正则表达式
  10. 正则、grep与egrep工具
  11. Linux 基础入门 04
  12. idea2020更新功能_idea2020 插件备份
  13. PIN/PAD Design in SoC - 1 (待续)
  14. Compose Modifier.swipeable() 写个侧拉组件
  15. 38年来,NBA最有价值球员|数据分析
  16. 隐藏控件--HiddenField控件
  17. 【项目整理】安卓应用商店评论监控平台
  18. hypermesh错误1000
  19. android去掉开机锁屏,android 去掉锁屏
  20. vue3安装wot-design步骤

热门文章

  1. 华为云计算HCIE学习笔记-FusionAccess
  2. PostgreSQL查询优化器详解之逻辑优化篇
  3. Switch / Xbox / PS / PSV / PSP 游戏指南
  4. [CDLinux]安装向导
  5. h5页面如何切图_html5怎么切图
  6. 基于MATLAB的发票识别系统
  7. Arcmap坐标系转换通用教程【简单明了】
  8. IP地址规划之子网划分
  9. 2011考研数学二第(19)题——拉格朗日中值定理证不等式、单调有界证数列收敛、两问关联
  10. 高通三频802.11ac平台:家庭WiFi新体验?