基于OpenCV的手势识别系统设计与开发

news2024/11/17 9:43:22

摘要

随着计算机技术与信息处理技术迅速发展,智能化电子设备逐渐进入到日常的生产和生活中,与此同时,人们对电子设备操作过程的便捷化也提出了新的要求,这也促使计算机进行图像处理的技术也得到了发展。近些年兴起的模式识别技术为操作便捷化提供了新的研究方向和发展平台,其中通过对手势的识别来向电子产品进行命令操作逐渐成为一项新的关键技术。目前,手势识别技术已经逐步应用在AR和汽车辅助驾驶等方面,同时,在人机交互过程中应用手势识别技术还可以提高体验感。所以,研究开发手势识别系统具有一定的学术意义和经济价值。这项技术涉及了包含静态图片识别与分析、视频图像处理及计算机视觉等多方面内容。
本文介绍了开发手势识别系统的背景及意义,分析了过程中涉及到的必要步骤及算法。本系统基于C++环境使用OpenCV开源计算机视觉库进行手势识别。本系统通过计算机本地单目摄像头录入手势,分别对动态和静态手势进行识别,并实时显示不同手势所表示的结果。总体上可分为图像采集、图像预处理,特征提取及识别四个模块,具体包括非线性中值滤波、形态学膨胀滤波、HOG特征和SVM分类等步骤。
目前系统开发完成,实验结果基本可以实现手势的识别,并显示出结果。
关键词:图像处理;手势识别;OpenCV;计算机视觉

ABSTRACT
With the rapid development of computer technology and information processing technology, intelligent electronic equipment has gradually entered into daily production and life. At the same time, people have put forward new requirements for the convenience of electronic equipment operation process, which also promotes the development of computer image processing technology.The emerging pattern recognition technology in recent years provides a new research direction and development platform for the convenience of operation, among which the command operation of electronic products through gesture recognition has gradually become a new key technology.At present, gesture recognition technology has been gradually applied in AR, automobile assisted driving and other aspects. Meanwhile, the application of gesture recognition technology in human-computer interaction can also improve the sense of experience.Therefore, the research and development of gesture recognition system has certain academic significance and economic value.The technology involves static image recognition and analysis, video image processing and computer vision.
This paper introduces the background and significance of developing gesture recognition system, and analyzes the necessary steps and algorithms involved in the process.This system uses OpenCV open source computer vision library for gesture recognition based on C++ environment.In this system, gestures are recorded by computer local monocular camera, and the dynamic and static gestures are recognized respectively, and the results of different gestures are displayed in real time.In general, it can be divided into four modules: image acquisition, image preprocessing, feature extraction and recognition, including nonlinear median filtering, morphological expansion filtering, HOG feature and SVM classification.
At present, the system has been developed, and the experimental results can basically realize gesture recognition and display the results.
Key words: Image processing;Gesture recognition;OpenCV;Computer vision

目录

1 绪论 1
1.1 课题背景及意义 1
1.2 手势识别的发展现状 1
1.3 本文主要内容 2
1.4 本文结构安排 2
2 系统开发平台 3
2.1 OpenCV 3
2.1.1 OpenCV简介 3
2.1.2 OpenCV配置 4
2.2 MFC 8
2.2.1 MFC简介 8
2.2.2 创建一个MFC 8
3 系统相关技术及算法介绍 8
3.1 系统相关技术 8
3.1.1 图像采集技术 8
3.1.2 图像预处理技术 9
3.1.3 肤色检测与分割技术 9
3.1.4 特征提取 9
3.2 系统相关算法 10
3.2.1 HOG特征 10
3.2.2 SVM 14
3.2.3 核函数 15
3.2.4 肤色模型 15
3.2.5 RGB色彩空间模型 16
3.2.6 YCbCr色彩空间模型 17
3.2.7 中值滤波 19
3.2.8 膨胀滤波 19
4 系统设计与实现 21
4.1 系统整体设计 22
4.1.1 手势训练模块 23
4.1.2 手势测试模块 27
5 系统测试与分析 28
5.1 系统测试环境 28
5.2 系统界面测试 28
5.2.1 手势注册功能测试 28
5.2.2 手势识别(动态手势)测试 31
5.2.3 图片识别(静态手势)测试 34
5.3 测试问题 36
5.3.1 手势识别(动态手势)问题 36
5.3.2 图片识别(静态手势)问题 38
5.4 测试结论 39
6 总结和展望 39
6.1 本系统优点总结 39
6.2 本论文不足总结 40
6.3 未来工作展望 40
参考文献 42
致谢 43

1绪论

1.1课题背景及意义
随着计算机技术的进步和技术革新以及智能化时代的要求,人们不断探寻开发新的、更加便捷的人机交互方式。其中,基于计算机视觉的手势识别技术已成为研究热点之一。手势的检测和识别技术作为一种有着自然性、简洁性和直接性的一种新型的交互方式,是这些交互技术当中倍受重视的研究和应用的技术。近几年来,已经有相当一部分的应用采用了这种手势识别的方式作为跟机器交互的手段。本文讨论一种采用基于单目摄像机的特定颜色模型的背景分离方法和基于关键信息的手势提取方法,用Visual Studio C++和OpenCV进行开发,实现在单摄像机下的手势识别交互系统。
1.2手势识别的发展现状
手势识别在计算机科学中是指通过数学算法来识别人类手势。为了获得更好的人机交互体验,计算机需要正确地理解人类手势的含义,并根据预定义的手势指令进行相关操作。手势识别技术通常包括图像采集技术、图像预处理技术、特征提取技术和识别分类技术几个方面。目前手势识别主要有两个研究方向,一是基于计算机视觉,二是基于可穿戴设备。
本文是基于计算机视觉开发的的手势识别系统。无论是静态或动态手势,其识别顺序首先需进行图像的获取、手势检测和手势分割,然后进行手势识别。其关键件技术主要为图像处理、手势分析与分割、手势识别三个过程。图像处理是系统把通过计算机单目摄像头采集的视频流进行帧分离处理,从视频流中分离出单一手势图像,并对图像进行滤波、平滑等预处理操作,作为下一阶段的输入量。然后通过检测算法检测输入量中是否含有人类手势,如果检测出手势图像,则进行肤色分割处理,将手势与背景进行分离,得到手势的平面模型,建立手势形状数据库。手势识别阶段采用模板匹配法,将动态手势看成由静态手势图像所组成的序列,然后将待识别的手势模板序列与已知的手势模板序列进行比较,识别出手势。
本文是将部分手势转化成所对应的信息。未来可以进一步将手势直接转化成语音,通过对话的方式将信息传递出去。方便聋哑人士与普通人的沟通。另外,汽车行业一如既往的对手势识别保持热情,汽车中的各种仪表可以直接通过手势识别直接控制。而在穿戴设备领域,使用手势识别技术以追踪用户包括睡姿、心率、体脂肪率、总肌肉量、体脂肪量和基础代谢率在内的一系列数据,进而促进穿戴设备的发展。
1.3本文主要内容
本文所涉及到的一系列软件开发有效凭借以及完成相应试验平台的建立,使用OpenCV中的一些功能函数及控件对图像和视频流进行手势检测的研究。其中以HOG特征、局部二值模式(LBP)为提取的目标,通过手势检测椭圆模型算法,对图片及视频序列中的手势进行,提取手势轮廓。之后,通过对RGB、YCrCb等颜色空间模型的处理,而后通过非线性中值滤波,形态学膨胀等方式进行降噪滤波以达到皮肤分割的效果。最终通过MFC构建了一个支持多手势的视频和图像处理系统,该系统可以对视频和图像中的多个手势进行实时识别。
本文的目的是在大量学习和理解传统的算法之后,将其实现并优化。在阅读了大量的相关文献和搜索了大量的资料后,设计并完成了一套相对方便简洁的手势识别系统。该系统实现了10个手势的动态和静态识别,能够快速识别并显示手势所代表的信息。另外可随时采集并训练新的手势模型。
1.4本文主要研究内容
本文整体结构具体可以归结为六个部分,其各个章节的布局如下所示:
第一章绪论,针对于手势识别相关研究背景及意义进行了相对较为切实有效的分析,介绍了手势识别研究现状和发展趋势,简要阐述了本文的主要内容以及相应章节的布局。
第二章系统开发平台,具体涵盖了开发环境和实验平台的搭建,在手势检测、手势识别算法研究的基础上,借助OpenCV计算机视觉库中的一些函数实现算法和MFC微软基础类库以及Visual Studio 2013开发环境来构建交互界面。
第三章系统相关技术及算法介绍,首先介绍了手势识别相关基本原理,其次研究了Hog检测算法的基本原理,同时介绍了相关概念如色彩和伽马归一化、计算图像梯度等。而后阐述SVM分类原理。最后分析RGB、YCbCr等颜色空间模型及中值滤波算法、膨胀滤波算法的原理。
第四章系统设计与实现,首先介绍了手势识别的主要流程和设计思路,然后介绍了对应的模块组成及具体功能描述,最后进行软件的实现。
第五章系统测试与分析,对本文所设计的系统进行测试,本章主要介绍对系统各功能的测试结果及针对不同测试结果的分析。
第六章总结和展望,对本文所描述的研究工作进行总结,并对目前需要进一步改进优化的部分加以说明,同时简单介绍改进之后期望达到的效果。

2系统开发平台

本文所开发的系统是基于所进行开发的,相应的开发环境具体涉及到了 ,在此过程当中还应用到了作为系统内部相应的界面库,并且基于相对开源的针对于手势检测以及识别完成了相应的开发。
2.1OpenCV
2.1.1关于的OpenCV概述
所谓的具体可以归结为开源形式的计算机视觉库,相应的组合命名可以概括为。
在年就已经建立起,如今由提供支持。它是一个跨平台开源计算机视觉库,可以运行在以为代表的多个操作系统上。包括C函数和少量类,同时提供了包含在内等多种语言接口,在图像处理和计算机视觉方面有很多通用算法。
提供了机器学习库。该机器学习库侧重于统计方面的模式识别和聚类。除了在视觉相关的任务中,还可以方便地应用与其他的机器学习场合。
版本于年发布。的第二个版本是2009年10月的OpenCV2.0,主要更新包括C++接口,更容易、更安全的模式,新的函数,对现有实现代码优化等。2012年8月,对的支持由一个非营利组织提供,现在它也集成了对的支持。2014年8月,随着的发布,这个强大的计算机视觉库迎来了全新的纪元。2019年,发布4.0版本。
据相关统计,一个人获取的信息大约有 75%来自视觉。而图像又是其中最重要的组成部分。在人工智能时代,机器视觉会在人机互动、人脸识别、手势识别等方面得到更广泛的应用。作为图像处理的重要工具之一,它将会在这一领域发挥更加重要的作用。
2.1.2OpenCV配置
本文采用的是的配置方法,OpenCV作为开源的软件,直接到官网下载即可,目前官网更新到4.1.0版本,本系统因需要用到控件,故文中采用2.4.9版本。配置过程如下:
(1)安装,打开资源包,解压到相应文件夹。
在这里插入图片描述

图2-1 OpenCV资源包解压
(2)配置环境变量,将环境变量添加到路径:
在这里插入图片描述

图2-2 配置环境变量

(3)工程包含(include)目录的配置

图2-3 配置工程包含(include)目录
(4)工程库(lib)目录配置
在这里插入图片描述

图2-4 配置工程库(lib)目录
(5)链接库配置
在这里插入图片描述

图2-5链接库配置
(6)加入动态链接库
将文件夹下所有dll文件复制粘贴到
在这里插入图片描述

图2-6 动态链接库
如图所示,呈现出的模块构成,其具体可以归结为部分,即模块、模块、模块以及模块(包含了相应的基本形式的数据结构以及相关函数)。
在这里插入图片描述

图2-7 OpenCV模块
2.2MFC
2.2.1MFC简介
是微软基础类库的简称,是微软公司实现的一个c++类库,其具体涵盖了众多的句柄封装类以及大量的的内建控件以及相应的组件的封装类。 MFC除了是一个类库以外,还是一个框架,MFC作为一个通用框架,不具备最好的针对性,同时也就丧失了部分灵活性和效率。但的具体封装形式相对较浅,故其相应的效率损失相对较少。
利用MFC AppWizard创建Test工程之后将自动生成5个类:CAboutDlg(“关于”对话框类)、CMainFrame(基础框架类)、CTestApp(应用程序类)、CTestDoc(文档类)、CTestView(视图类)。
2.2.2创建一个MFC
文件->新建->项目->MFC应用程序,其余项默认,点击创建。本文命名为“MFCGesture”。
点击“解决方案资源管理器”,可以看到CAboutDlg、CMFCGusetureApp(和CMFCGusetureDlg。其中CAboutDlg是应用程序的“关于”对话框类,CMFCGusetureApp是由CDialogEx派生的类,CMFCGusetureDlg是主对话框类,本系统程序运行后显示的主界面即为主对话框。
在“资源视图”中可以看到工程MFCGuesture的资源树。点击展开Dialog项,出现两个ID分别为:IDD_ABOUTBOX(“关于”对话框的模板)和IDD_MFCGuesture_DIALOG(主对话框的模板)的对话框模板。ID是资源的唯一标识,本质上是一个无符号整数,一般ID代表的整数值由系统定义。
在这之后,可以对系统自动生成的主对话框模板进行编辑、添加控件和函数等操作,或者创建新的对话框模板和所对应的对话框类再进行编辑等操作,最终实现图形界面。

3系统相关技术及算法介绍

3.1系统相关技术
3.1.1图像采集技术
对于计算机而言,摄像头扮演着眼睛的角色,是环境图像采集的工具。现有多数手势识别系统中,图像采集可以是从指定文件夹中读入的视频和计算机本地摄像头实时视频流,本文开发的手势识别系统是基于本地摄像头。为实现动态手势识别功能,首先要将摄像头采集的视频转换为单帧图像,这些图像存储到Mat中,然后进行图像处理。本文采用OpenCV开源函数库打开本地摄像头进行图像采集。
3.1.2图像预处理技术
预处理是计算机图像处理过程重要的一步。在图像采集时会存在许多干扰因素,导致采集到的图像会存在不同程度的噪声。图像噪声包括外部噪声和内部噪声。由系统外部电磁波干扰等因素引起的噪声称为外部噪声。由光、电的基本性质引起的噪声称为内部噪声。图像后续处理受噪声直接影响,所以在图像使用前,需经过降噪、量化、压缩等处理,减少图像噪声,提高图像质量。OpenCV包含线性滤波(方框滤波、均值滤波、高斯滤波)、非线性滤波(中值滤波、双边滤波)、形态学滤波。经测试,本文采用中值滤波及膨胀滤波。
3.1.3肤色检测与分割技术
肤色检测与分割手势轮廓检测的关键一步。在这一处理过程中将采集图像中的手势与背景分离,消除背景对手势的影响,为下一步手势识别过程提供单纯的手势图像,这一操作将影响识别准确率的高低。肤色易因光照强度和不同人之间差异,以及某些摄像头的自动对光功能的影响。为此,需要一种快捷的手段根据现场情况进行调整。本文采用将颜色空间从RGB色彩空间转换到亮度与色度分离的某个颜色空间,然后放弃亮度分量。在双色差或色调饱和度平面上,不同人的肤色区别较小,肤色的不同更多在亮度上而不是色度上。肤色分割后得到的是二值化图像,皮肤部分为白色,其余部分为黑色。在完成图像的预处理之后, 将图像的RGB空间转换成YCrCb空间。 YCbCr颜色空间是一种常用的肤色检测的色彩模型,其中Y代表亮度,Cb代表光源中的蓝色分量,Cr代表光源中的红色分量。
3.1.4特征提取
一旦有效获取相应的单独目标手势以后,接下来就需要对其完成切实有效的描述。也就是说针对于相应的关键特性完成相对具有代表性的提取,除此之外,还要将其进行一定的数值化处理,建立起相应特征向量,在一定程度上将手势识别完成对应的数字化建模,便于后期进行切实有效的手势识别。
关于静态形式的手势,仅需要针对某一特定时间点完成相应的描述,不难分析出,此状态下的手势特征值不会受限于相应的手势所处的地域环境与位置,几乎完全凭借其相应的姿态来决定。具体可以概括为,不管手势如何变更方位,只要保持其姿态不发生任何变化,与之相对应的特征向量便会保持相对一致。
针对于动态手势识别就不那么简单了,从动态的字眼就可以看出其同时兼具时、空二元耦合特性,在此过程中必须将这两方面全部考虑进去才能确保所提取的动态手势切实有效。可以这样理解,一方面要如同于静态手势逐一时间点进行有效识别,与此同时还要对其相应的运动轨迹完成有效的识别工作,并将二者有效融合,即可完成所谓的动态手势识别工作。
3.2系统相关算法
当前形式下针对于图像特征提取已经开发出了各式各样的算法,其中也存在一定量的散发针对于相应的几何变换呈现出相对较为良好的适应性,但是在手势识别过程当中还要有效处理好光照变化问题,对此前的算法还要进一步的完善,在一定程度上可以说是相对较为繁琐且艰巨的过程。
考虑到这些原因,该手势识别系统是基于手势检测技术,恰巧基本可以实现相应的收拾特征获取任务,在一定程度上能够相对较好的有效解决光照变化所引申出的一系列问题。故可有效凭借的方式切实有效完成相应收拾特征的获取工作,确定手势位置。然后对此区域进行图像采集及识别。
完成相应的手势特征获取以后,确保实现相对较为切实有效的手势识别,还需进一步针对于相应的分类器进行不断的模拟与调试,本项研究具体采取的是为,即支持向量机来作为分类器。
3.2.1HOG特征
具体所指方向梯度直方图,其在一系列的视觉检测以及相应的图像处理方面已经得到了相对较为广泛的应用,在此过程当中可以实现相应物体的检测以及所对应的特征描述。其具体的运作形式可以归结为有效凭借图形局部区域所对应的梯度方向直方图来实现相应的特征搭建。尤其是在针对于行人进行相关检测当中,并与进行有效组合在一定程度上已经成功应用的众多领域当中。即针对于一副图像,相应的梯度几乎全部集中于其边缘的位置。相应的目标的形态可有效凭借梯度或者相应的边缘方向进行切实有效的描述。
存在的优势具体可以归结为:在一定程度上具备一定的几何以及光学不变特性;微量的动作几乎不会对相应的检测效果造成任何形式的干扰,可以理解为允许手部肢体不那么僵持。
针对于直方图所呈现出的更大区域:完成相应的归一化,可以将其整体性能有效提升。如图3-3所示,呈现出具体形式的生成流程。
在这里插入图片描述

图3-1 关于生成流程

其具体的生成流程可以归结为以下几方面:
在这里插入图片描述

(1)规范化以及相应的颜色空间
所谓光照的程度会对相应的具体图像色值造成一定的影响,确保将其所呈现出的干扰程度有效压低,要做的第一步就是针对于图像进行相应的归一化处理。在相应的纹理强度当中,所占比重相对较大的部分要属表面曝光,故此类压缩处理方式能使图像对这类变化具有不变性特征,相应的局部阴影以及所对应的光强改变均能得到切实有效的下降。由于在此过程当中相应的颜色信息功效不是很强烈,一般采取的方式是进行相应的灰度处理;

在这里将相应取为,从而切实保证高光区呈现出相对较低的对比度,反之阴影区相应的对比度则有效提升。该项压缩处理方式在一定程度上确保局部阴影以及相应的光照改变呈现出切实有效的下降趋势。试验结果可知,引入这项步骤呈现出效果几乎不够显著,进而将其忽略。
(2)关于图像梯度的相关求解
凭借一维形式的微分算子即对最初的图像进行相应的卷积求解,结果显示相应的方向梯度分别呈现在横纵坐标当中,随后完成相应梯度方向值的有效求解;进行相应的倒数运算在一定程度上不单能可有效获取其轮廓,还可以有效将光照的干扰有效压低。基于表示图像某一通道中(x,y)处的颜色值,其(x,y)处的水平方向梯度记为Gx(x,y),垂直方向梯度记为Gy(x,y),计算式如下:

则(x,y) 处的梯度幅值G(x,y) 和梯度方向θ(x,y)计算公式如下:

求解的具体方式可以归结为:分别基于以及对应的梯度算子对最初状态的图像完成相应的卷积求解,即可有效得到相应水平以及垂直方向上所对应的梯度分量,进而可以求解出任意像素点所对应的梯度方向与数值。
(3)针对于任意细胞单元进行相应的梯度方向直方图的建立
这步的功效在于有效产出相应的编码供所对应的局部图像区域运用,与此同时还能确保图像内部的人体姿态以及相应的外形具备一定相对较弱的敏感性。
该单元当中的任意像素点均能够针对于方向形式的直方图进行所谓的投票。其具体凭借加权的形式,也就是说任何的票均夹杂这一定的权值,其相应的大小是基于相应的梯度幅度进行求解的。可以有效凭借其自身或者一系列的函数关系实现相应权值的表示,基于相关测试结果显示:在一定程度上凭借幅值的方式进行表示权值所得到的效果最为良好,除此之外,一系列关于幅值的函数关系,譬如其平方、立方等形式也可以进行相应的权值表示。相应的单元的形状也呈现出多样化的趋势,具体可以归结为:星、矩形等。相应的直方图通道具体均布呈现在以及区间内。
针对于相应的人体进行检测时,其中单元格大小呈现出以及像素的时候所对应的检测效果相对最为良好。倘若相应的单元格大小呈现出以及个像素时,造成的差异也不是很明显。因此将相应的图像进行像素单元化处理,也就是说任意的尺寸必须确保像素。现拟凭借进行相应的梯度信息统计工作。其具体步骤可以归结为:首先针对于相应的梯度方向进行区间层面的有效划分,也就是说进一步完成度的块等分,在此过程中任意直方图块均呈现出。如图所示:倘若其相对于梯度方向呈现出的形式,即可将其归纳到相应的第一块,倘若其相对于梯度方向呈现出的形式,便将其归纳到相应的第二块,除此之外,相应的直方图第个执行累加的运算,逐次类推。完成全部形式的加权投影,即可得到与之对应的。
在这里插入图片描述

图3-2 cell的梯度方向直方图
(4)把细胞单元组合成大的块(block),块内归一化梯度直方图(将细胞单元组合成大的区间)
通常情况下,相应的梯度强度在一定程度上会随局部光照以及相应的对比度改变呈现出相对较为剧烈的改变,因此必须进行切实有效的归一化处理。归一化能够进一步地对光照、阴影和边缘进行压缩。
本文采取把任意进行相应连通区间的组合,即。也就是说,将一个内全部形式的的特征向量进行有效串接从而获取到此所对应的特征。这部分区间存在一定的重叠性,也就是说:任意的特征会基于相对差异的形式呈现在最终的特征向量当中。
如图所示,呈现出以及的关系形式。
在这里插入图片描述

图3-3 关于以及相应的重叠关系
3.2.2SVM
支持向量机(Support Vector Machine, SVM)是由机器学习领域的最大间隔分类算法发展而来的,是一类按监督学习(supervised learning)方式对数据进行二元分类(binary classification)的广义线性分类器(generalized linear classifier),针对于降低最小化实验误差以及相应的最大化几何边缘呈现出相对较为良好的效果,故可以将其归结为最大边缘分类器。其本质在于在相对更高维度的空间内部进行相应的超平面搭建,所谓的决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane),确保其对相应进行分类的数据呈现出相对较大的间隔。相应的误差与间隔之间也就是所谓的负相关形式。经过不断发展,SVM己经成为了机器学习领域的标准工具之一。
我们以二维平面加以分析。如图所示,图中呈现的红方以及蓝圆均为即将进行分类的相关对象,两条蓝线即为相应的超平面,不难分析出,任意点与之间的间距要高于,也就是说即能进行相对较为良好的区分,凭借对的有效调节直至实现任意点间距达到最大化,此刻呈现出最近形式的点即为所谓的支持向量。
在这里插入图片描述

图3-4 相应的最大间隔分类
3.2.3核函数
针对在低维空间呈现出一定的线性不可分的相关特性,如图所示,可有效凭借高维度映射的方式,逐步实现线性可分形式的切实有效转化。

在这里插入图片描述

图3-5 关于线性转化过程
3.2.4肤色模型
肤色特征区别于其他特征,对于彩色图像,肤色是图像中相对聚集和稳定的区域,不会基于人的各类现象的产出而发展改变,呈现出相对较高的鲁棒性,与相应的背景色彩呈现出显著的差异。通过大量的实验研究表明,不同人种的人其皮肤的色调是比较一致的,不同之处具体呈现在灰度。故一般情况下基于相对较为常见的相关肤色模型针对于人脸特征进行有效概括。由于肤色在存在差异的色彩空间中,具有不同的表现形式。本项研究基于当中的椭圆模型进行相应肤色分布的具体描述。
所谓的皮肤模型可以归结为:等。通过对相关学者所做的关于皮肤信息统计方面的文献进行切实有效分析可知,倘若实现相应的皮肤信息映射到,则在相应的二维空间中呈现出类椭圆形式的分布状况。一旦可以得到相应的椭圆,在有效凭借接下来获取到的坐标进行相应的区域位置判别,也就是在椭圆内部还是外部,倘若落在其内部的话,即可将其判别为相应的皮肤,否则即为所谓的像素点。
确保相应的亮度不对所谓的肤色聚类造成一定的干扰,在当中针对于相应色度执行一系列的非线性变换,完成光影相对较高的区域剔除,也就是所谓关于的极值,在进行一系列非线性变换当中,凭借有效代表相应的中轴线,相应肤色区域的具体宽度可凭借进行有效表示。
也就是将其全部转化到当中,再依次进行关于平面的有效投影,故通过相应采样得到的相关点集,依次进行相应的投影以及相应的变换。
在这里插入图片描述

图3-6 关于椭圆模型的相关坐标

3.2.5RGB色彩空间模型
RGB 色彩空间是人们最常用到的颜色模型。于年选取了红,绿,蓝这几种单色作为相应的基本色,也就是所谓的色彩空间。在一定程度上可以基于三基色实现任何色彩的体现与表示,这是当今时代下最为常用的色彩表示方式。也可以有效凭借三基色进行相应光量的有效表示,其中红色(波长=700.0nm),绿色(波长=546.1nm),蓝色(波长=435.8nm)组成的坐标系为 RGB 色系坐标系。图像的颜色一般都用 RGB 坐标系来表示。
在针对于手势识别相关研究过程当中,一般情况下摄像头所采集到的各种形式图像都是来源于相应的色彩空间,需要注意的是不能直接对其进行相应的肤色分割。这是因为其三基色之间存在相对较为突出的相关性,倘若进行任意分量保持相对独立的形式进行处理,可以说要比登天还难,在此过程中其对光照要求相当严格,其所带来的干扰也尤为突出,故在进行目标手势肤色分割的过程当中,几乎没有采取的现象。
在这里插入图片描述

图3-7 关于色彩空间相关坐标系
在 RGB 模型中,手势表现出来的颜色受到关照的影响,但对同一点来说,在不同的亮度条件下其对应的值是成比例的:

可以归结为相应的光照几乎不会影响同一点的色彩情况,仅仅局限于亮度存在差异。 RGB 颜色空间可以直接通过线性变换,转化为灰度图像:

3.2.6YCbCr色彩空间模型
具体可以归结为由进行有效变换所得到的。其中代表相应的亮度,、Cr 分别代表光源中的红色分量与蓝色分量。通过非线性分段而得到的的亮度以及色度所对应的采样比率分别为,在一定程度上基本能够满足于肉眼对色度变化的敏感程度明显低于亮度变化的性质,与此同时相关色彩的求解相对较为简便、相应的亮度以及色度分量可有效进行分离、具备相对较为良好的聚类性等特征被认为是很出色的肤色空间模型。经过对文献的调研,在人们的大量实验后,通过统计的方法来确定肤色的参数,人手肤色在YCbCr空间中的范围Cb∈(105,127),Cr∈(137,162),当像素点属于此范围时,我们就认为它是皮肤像素点。
其转换公式为:

相关实验结果显示,基于相关模型,以及分量呈现出一定的相关性,但需要注意的是与之间没有所谓的相关性,当亮度存在差异的形势下以及均能呈现出相对较为出色色聚类效果。而且基于到空间的转化基本可以称之为线性变换,从而可以忽视的干扰,从而有效降低冗余通道的数量。这就实现了相应的维度降低操作。如图3-8所示,呈现出肤色关于平面相应的投影。
在这里插入图片描述

图3-8关于肤色在平面上相应的投影
经查阅文献及实验,本文首先将采集到图像转换到YCrCb空间,再对其进行手势分割以得到想要的目标手势。相比于RGB和HSV,YCrCb空间计算量远远小于前两种,同时对人体肤色的聚类效果最佳,受光线变化干扰也最小。接下来的一章将进一步介绍基于肤色聚类分割的具体呈现形式,此处不再赘述。
3.2.7中值滤波
肤色分割之后,我们还需对图像进行一定的平滑度处理。在一定程度上又可归结为模糊,通常情况下凭借其进行有效降噪,其本质在于针对于相应的图像进行平滑化,从而有效降低其内部的噪点存在。在本文所涉及的手势识别当中,所谓的图像平滑处理的最根本原因在于尽可能最大限度降低一系列的冗余信息,便于后续的手势轮廓分割以及相关特征的有效获取,与此同时致使相应的计算量有效下降。中值、双边以及相应的高斯滤波是相对较为常见的几种平滑滤波方式。
中值滤波可以归结为相对较为典型的非线性技术,其具体的原理是有效凭借像素点灰度中值进行有效近似等价替代,其功效在于有效剔除相应的造成,与此同时还能切实有效保证一系列边缘细节不会被破坏。
基于实验进行分析,相应的中值滤波对去除图片噪声特别理想。相比于其他平滑方法,其在一定程度上能够有效克服一系列相对较为常见的线性滤波器,譬如最小均方、方框、均值滤波等造成的一系列细节模糊问题,与此同时能够有效降低脉冲干扰以及相应的扫描噪声,还能切实有效保证一系列边缘细节不会被破坏。除此之外,相应的算法相对较为便捷实用。故本文所涉到的手势识别系统有效凭借中值滤波的方式完成相应的噪音剔除。

其中f(x,y)、g(x,y)分别表示中值滤波处理前、后的图像,W是模板,通常为33或者22,本文采用3*3。
3.2.8膨胀滤波
形态学(morphology)是生物学的一个分支,图像处理中的形态学具体可以归结为数学形态学,其实质在于格论以及相应的拓扑学层面的图像分析。
简而言之,所谓的形态学操可以归结为基于相应形状的图像处理。在一定程度上为相应的图像形态学变换营造了相对较为快捷的函数以及开发环境。最基本的形式可以归结为两类,即膨胀以及腐蚀。本文采用膨胀进行滤波。
膨胀(dilate)又称为作图像加粗,也可以称之为局部最大峰值的求解。基于数学视角出发,所谓的膨胀即为将图像(与核进行卷积计算。
核的形状以及大小几乎不受任何限制,它具备一定的单独形式进行定义的相关参考点,也就是所谓的锚点。通常情况下,核具体表现为相对较小其中心部位存在一定的参考点的实心圆或者正方形。可以将其当做相应的模板甚至是掩码。相应的膨胀操作在一定程度上能够针对于噪音以及阴影等干扰所进行分割的各个部分完成相应切实有效的融合。
如图所示,有效凭借膨胀可以进行局部最大峰值的求解。核与图形发生卷积,即进行核覆盖区域所对应的的像素点的最峰值的求解,并将其赋给相应的参考像素,便可将相应的高亮区域逐步扩大。(p188)
在这里插入图片描述

图3-9 膨胀滤波
膨胀的数学表达式如下

4系统设计与实现

凭借着计算机以及图像处理技术发展势头迅猛提升,相应的计算机视觉等方面也在迅速发展,手势识别作为人机交互的一种方式,也迎来了新的发展机遇。通过前期调研发现,手势识别技术已应用在多个领域,如日常生活视频直播或者拍照过程中,结合用户的手势(如点赞、比心),实时显示相应的特效,丰富交互体验。智能驾驶过程中将手势识别应用到驾驶辅助系统,使用手势控制车内的各种功能,一定程度上解放双眼,将更多的注意力放在道路上,提升驾车安全性。同时还包括百度AI开放平台提供的在线手势识别服务等。这些均反映着手势识别技术的火热。
本文设计的手势识别系统可以归结为顺序结构,相应的系统流程如下图4-1所示

在这里插入图片描述

图4-1 手势识别流程图

下面对系统中三个重要模块进行介绍:
(1)图像采集模块
基于本地形式的摄像头,完成相应的视频图像的切实有效采集,呈现出空间视频流的形式进而为手势识别输入奠定一定的基础,并将采集到个各项数据有效储存到当中,为接下来的输入做好充分准备。
(2)图像预处理模块
凭借图片的有效缩放,进而将后期的相关计算量有效压低,在此过程当中有效剔除相应的图片噪音,为接下来的相应处理提供相对较为便捷的条件。这部分具体涵盖了灰度变换、空间转化以及相应的平滑处理等。
(3)匹配识别模块
该模块是手势识别系统需要实现的目标功能,也是本系统最重要的模块。在对图像进行一系列的处理后,有效获取到相应手势图像具体形式的特征值,接下来与事先设定好的模板特征值完成切实有效的对比以及归类,进而有效寻找出所对应的手势信息,譬如手型所代表的数字。然而在动态识别当中,系统内部会进行实时的信息采集,并完成相应的处理工作。
4.1系统整体设计
根据前期的需求分析和调研,本文设计的整体系统结构如下图所示:

在这里插入图片描述

图4-2 手势识别程序流程图
4.1.1手势训练模块
在开始训练手势之前,需要用户打开电脑自带的摄像头提供视频流。
void CMFCGuestureDlg::OnBnClickedOpencap()//打开摄像头
{
m_Cap.open(0);
if (!m_Cap.isOpened())
{
MessageBox(“摄像头打开失败”);
return;
}
但是MFC的picture control控件中的图像格式与OpenCV的图像格式不尽相同,因此需要将OpenCV得到的视频流通过CvvImage开源图像处理库进行转变处理。处理完以后摄像头所得到的图像就会被显示在控件中。
void CMFCGuestureDlg::regniseHand(string path_img)
{
imagesRegnise = imread(path_img.c_str());//imagelist[0].c_str()
Mat incp = imagesRegnise.clone();
srcCvvImg.CopyOf(&(IplImage)imagesRegnise); //绘制图像到控件
srcCvvImg.DrawToHDC(m_HDCImg, &m_RectImg);
resize(incp, incp, Size(HogWIDTH, HogHEIGHT));

hand = handPreprocess(incp);
if (1.0*countNonZero(hand) / (incp.cols*incp.rows) > 0.23)
{
	int regResult = mySvmClassifier->svmPredict(incp);
	CString str;
	str.Format("%d", regResult);
	SetDlgItemText(IDC_EDIT2, str);
	sprintf_s(buffer, "%d", regResult);
	putText(imagesRegnise, buffer, Point(incp.cols / 2, incp.rows / 2), FONT_HERSHEY_SIMPLEX, 1.5, Scalar(0, 0, 255), 2);

	srcCvvImg.CopyOf(&(IplImage)imagesRegnise);		//绘制图像到控件
	srcCvvImg.DrawToHDC(m_HDCImg, &m_RectImg);
	srcCvvImg.CopyOf(&(IplImage)hand);		//绘制图像到控件
	srcCvvImg.DrawToHDC(m_HDCImg2, &m_RectImg2);
}
else
{
	MessageBox("没有检测到手势");
}

}
在本系统中,为降低识别失败率及程序复杂度,我直接定义并设置了检测区域的位置。
int WIDTH = m_src.cols;
int HEIGHT = m_src.rows;
capRt = cv::Rect(1 * WIDTH / 3 - 1, 1 * HEIGHT / 3 - 1, WIDTH / 2, HEIGHT / 2);
采集手势如图所示
在这里插入图片描述

图4-3 手势采集
void CMFCGuestureDlg::OnBnClickedReg()//注册手势类别
{
CString str;
GetDlgItem(IDC_EDIT1)->GetWindowText(str);
regingInt = atoi(str);
regBool = false;
sprintf_s(buffer, “./Data/%d”, regingInt);
if (_access(buffer, 0)==0)
{
sprintf_s(buffer, “手势%d已注册,如需重新注册请先删除对应类别文件夹”, regingInt);
MessageBox(buffer);
regingInt = -1;
return;
}
CreateDirectory(buffer, NULL);

regBool = true;
regNum = 0;

}

图像采集完毕后,存入指定文件夹下。如例子中注册手势1,则存入D:\2019毕设\vs13program\handGuesture\MFCGuesture\Data\1。保存如图所示
在这里插入图片描述

图4-4 手势采集保存形式
本系统手势预处理将计算机摄像头采集到的的RGB色彩空间转换为YCrCb空间,再利用椭圆皮肤模型进行皮肤检测与分离。
Mat CMFCGuestureDlg::handPreprocess(Mat& src)
{

 ycrcb_image;
Mat output_mask = Mat::zeros(Size(src.cols,src.rows), CV_8UC1);

 
 
	for (int j = 0; j < src. 
	 
	 
	   //如果该落在皮肤模型椭圆区域内,该点就是皮肤像素点
		output_mask.at<uchar>(j, i) = 255;
	}

dilate(output_mask, output_mask, element);//膨胀,参数1:输入图片,参数2:输出图片,参数3:卷积核
medianBlur(output_mask, output_mask, 3);//中值滤波,
morphologyEx(output_mask, output_mask, MORPH_CLOSE, element2);//形态学运算函数

return output_mask;

}

输出如图所示
在这里插入图片描述

图4-5 手势预处理
采集并处理完图像后,进行手势模型的训练
void CMFCGuestureDlg::OnBnClickedButton3()//训练模型
{
char* path_ = “./Data/”;
readDir(path_, imagelist, labelName);
mySvmClassifier = new svmGuesture(imagelist.size(), HogWIDTH, HogHEIGHT); //新建的手势识别的类svmGuesture,这个类在另外的文件
if (_access(“./model.xml”,0)==0)
{
mySvmClassifier->svm.load(“./model.xml”);
return;
}

int flag = mySvmClassifier->loadData(imagelist);
if (flag==-1)
{
	MessageBox("not Found image files");
}
flag = mySvmClassifier->svmTrain();
if (flag == -1)
{
	MessageBox("train model error");
}
MessageBox("training model done");

}
4.1.2手势测试模块
系统必须先通过手势检测模块来画出手势轮廓与皮肤区域。此系统中的手势检测功能就是通过OpenCV手势识别库,在特定区域提取手势特征。
本系统手势识别模块包括了动态识别和静态识别。具体方法将在第五章叙述。
启动手势识别功能代码如下:
void CMFCGuestureDlg::OnBnClickedButton2()//手势识别
{
if (_access(“./model.xml”,0)!=0)
{
MessageBox(“请先训练模型”);
return;
}

startRegnise = true;

}

5系统测试与分析

在系统运行和测试阶段,通过对系统功能逐个进行测试,验证系统是否达到了预期的设计要求。
5.1系统测试环境
在本文的测试中,系统的运行环境为英特尔 Core i7-8750H @ 2.20GHz 六核处理器和16GB内存配置的电脑,操作系统为win10,开发环境采用Visual Studio 2013,开发语言为C++。
5.2系统界面测试
5.2.1手势注册功能测试
系统界面如图5-1所示
在这里插入图片描述

图5-1 手势识别系统界面
考虑需要一只手注册,一只手操作,我将注册区域调整到画面左下方。以注册手势0为例。
在这里插入图片描述

图5-2 注册手势“0”
void CMFCGuestureDlg::OnTimer(UINT_PTR nIDEvent) //时间响应函数
{
m_Cap >> m_src;
rectangle(m_src, capRt, Scalar(255, 0, 0), 2);
srcCvvImg.CopyOf(&(IplImage)m_src); //绘制图像到控件
srcCvvImg.DrawToHDC(m_HDCImg, &m_RectImg);
frameCounter++;

if (regBool || startRegnise)
	hand = handPreprocess(m_src(capRt));		// 皮肤检测判断是否为手势

if (regBool && regNum<50 && regingInt>=0)
{
	//Mat hand = handPreprocess(m_src(capRt));
	if (regingInt == 1)thresh_ = 0.24; else thresh_ = 0.3;
	if (frameCounter % 3 == 0 && 1.0*countNonZero(hand) / (capRt.width*capRt.height) > thresh_)
	{
		sprintf_s(buffer, "./Data/%d/%d_%d.jpg", regingInt, frameCounter, regNum);
		Mat saveImg = m_src(capRt);
		//cvtColor(saveImg, saveImg, CV_RGB2GRAY);
		imwrite(buffer, saveImg/*hand*/);
		regNum++;
	}
	srcCvvImg.CopyOf(&(IplImage)hand);		//绘制图像到控件
	srcCvvImg.DrawToHDC(m_HDCImg2, &m_RectImg2);
}
if (regBool && regNum == 50 )
{
	sprintf_s(buffer, "手势%d注册完成", regingInt);
	regBool = false;
	regNum = 0;
	MessageBox(buffer);
}

if (startRegnise)
{
	Mat saveImg = m_src(capRt);//handPreprocess(saveImg)

	if (1.0*countNonZero(hand) / (capRt.width*capRt.height) > 0.3)
	{
		resize(saveImg, saveImg, Size(HogWIDTH, HogHEIGHT));
		cvtColor(saveImg, saveImg, CV_RGB2GRAY);

		int regResult = mySvmClassifier->svmPredict(saveImg);
		CString str;
		str.Format("%d", regResult);
		SetDlgItemText(IDC_EDIT2, str);
		sprintf_s(buffer, "%d", regResult);
		putText(m_src, buffer, Point(capRt.x, capRt.y), FONT_HERSHEY_SIMPLEX, 1.5, Scalar(0, 0, 255), 2);

		srcCvvImg.CopyOf(&(IplImage)m_src);		//绘制图像到控件
		srcCvvImg.DrawToHDC(m_HDCImg, &m_RectImg);
		srcCvvImg.CopyOf(&(IplImage)hand);		//绘制图像到控件
		srcCvvImg.DrawToHDC(m_HDCImg2, &m_RectImg2);
	}

}

5.2.2手势识别(动态手势)测试
在这里插入图片描述

图5-3 手势“0”动态识别
在这里插入图片描述

图5-4 手势“1”动态识别
在这里插入图片描述

图5-5 手势“2”动态识别
在这里插入图片描述

图5-6 手势“3”动态识别
在这里插入图片描述

图5-7 手势“4”动态识别
在这里插入图片描述

图5-8 手势“5”动态识别
在这里插入图片描述

图5-9 手势“6”动态识别
在这里插入图片描述

图5-10 手势“7”动态识别
在这里插入图片描述

图5-11 手势“8”动态识别
在这里插入图片描述

图5-12 手势“9”动态识别
由上图可以看出,在光线条件合适的情况下,背景与肤色对比度明显,系统可以准确识别出0-9共10个手势,并实时将识别结果显示在界面上。
5.2.3图片识别(静态手势)测试
点击图片识别按钮,打开静态手势存储的文件夹,识别图片手势。
在这里插入图片描述

图5-13 手势“1”静态识别
bd

图5-14 手势“2”静态识别
void CMFCGuestureDlg::OnBnClickedButton4()//图片识别按钮
{
KillTimer(1);
startRegnise = false;
regBool = false;
CString str;
BROWSEINFO bi;
TCHAR name[MAX_PATH];
name[0] = ‘d’;
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = GetSafeHwnd();
bi.pszDisplayName = name;
bi.lpszTitle = _T(“Select folder”);
bi.ulFlags = 0x80;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if (idl == NULL)
return;
SHGetPathFromIDList(idl, str.GetBuffer(MAX_PATH));
str.ReleaseBuffer();
m_Path = str;
if (str.GetAt(str.GetLength() - 1) != ‘\’)
m_Path += “\”;
UpdateData(FALSE);

m_ImageDir = (LPSTR)(LPCSTR)m_Path;
imagelist.clear();
labelName.clear();
readDir(m_ImageDir, imagelist, labelName);
NumImg = imagelist.size();
if (NumImg<=0)
{
	MessageBox("文件夹下没有图片");
	return;
}
regniseHand(imagelist[0]);

}
5.3测试问题
测试过程中也发现了一些问题,具体如下:
5.3.1手势识别(动态手势)问题
如图所示:
在这里插入图片描述

图5-15 5-16 动态手势识别光线问题
由于光照条件变化和手掌与摄像头距离等原因,在手势注册时,肤色分割变化较大,直接影响从视频流中采集的图像质量,并影响手势训练结果,最终导致手势识别效率降低。
在这里插入图片描述

5-17 手势角度变换造成识别错误
从测试中发现,由于采集手势样本数量有限,当摄像头采集区域手势角度发生变化时,系统无法或错误识别动态手势。

在这里插入图片描述

图5-18 5-19 身体其他部位肤色对识别的影响
另外由于人体其他部位肤色与手部肤色差别不大,当有身体其他部位如脸或手臂进入图像采集区时,同样会被肤色分割。在手势采集时会影响模型训练效果,而在手势识别时,则会导致错误或无法识别。
5.3.2图片识别(静态手势)问题
在这里插入图片描述

5-20 异侧手无法识别
从测试结果中我们可以看出,静态手势在图像处理方面不如动态手势,主要表现在图像平滑处理不好。同时遇到与动态测试中相同的问题,当旋转图片角度测试,或者导入另一只手进行测试时,系统无法识别该手势类型。
5.4测试结论
经过上述的测试,表明该系统可以基本实现设计需求中的各项功能,在光线和背景稳定的情况下能够保证这些功能的正确执行,本系统的算法基于原有算法进行部分了改进,达到预期设想。其中手势检测可以很好地检测动态正面手势,摄像头采集的视频中的手势都可以正常进行预处理,但当外界条件变化或因手部移动造成光线、位置等因素造成的干扰,影响了图像的采集,从而造成后续识别率降低。且由于边缘滤波算法研究不够全面和充分,因此静态手势识别效果不够好。通过系统整体运行测试,说明该系统可以实现一定程度上的动态、静态手势识别功能。
6总结和展望
随着时代的不断发展伴随着科学技术的日新月异,相应的手势识别在人机交互的过程当中呈现出相对较为便捷、高效等特点,成为当前研究和应用的热点。而新一代的人机交互必然会呈现出相对较为人性化、智能化以及自由化的趋势。
6.1本系统优点总结
本文以Visual Studio 2013+OpenCV2.4.9作为开发平台,开发出基于图片以及本地摄像头采集手势并进行切实有效识别的系统,同时利用图像处理及模式识别的理论知识,我对手势识别相关领域有了更深入的了解。
本文首先了阐述了手势识别的基本原理。对输入图像充分做好相应的预处理,其次针对于手势图像的各方面特征,基于相应的皮肤模型的椭圆模型法对皮肤特征进行提取。为了使分割效果更佳,在肤色模型区域的算法中,在查阅资料后选取形式的颜色空间,与此同时考虑到相应的亮度变换比相对较大,一旦呈现过亮或者过暗区域的现象产出,在一定程度上会导致中呈现肤色溢出的现象。有效凭借完成相应类椭圆模型的搭建。相应的皮肤色彩呈现出一定的聚类特性,基于该聚类特性可有效求解出各点的相似度,并进行相应的归一化处理,即呈现在区间内。去除肤色区域中的非手势区域,从而可以较好的分割出目标部分。本项研究具体的贡献在于:
1.针对于的手势模板,提出了相应的动态识别算法进行切实有效识别。
2.本文对手势的特点进行了切实有效的分析,具体涵盖了静态以及动态手势相关提取与识别,并且基于特征以及相应的算法进行了切实有效的探索。
3.整体而言,系统运行情况良好,符合预期。
6.2本论文不足总结

针对于本文所开发的手势识别系统进行了一系列验证性实验以后,将相应的不足之处有效归结为以下几点:
1.虽然帧速的相关识别相对较快很快,但在精准度方面还有待进一步完善;
2.手势采集区域固定,可通过更换算法实现手势区域自由定位;
3.图像预处理算法仍需改进,尤其是图像平滑处理;
4.对旋转或者不同位置的手势,系统无法快速、准确地进行识别;
5.基于调试中相应的参数,使其相应的特征提取更加切实有效。
6.算法需要手动设置参数值,无法自适应外部环境的变化;
7.给程序构造更加友好的用户界面;
8.当前能够有效识别手势形式相对较少,未来可进行相关算法的完善以及模板的扩充。
6.3未来工作展望
针对于手势识别未来的研究工作从以下方面着手进行:
1.完善相关识别算法,确保相应的识别精度有效提升,同时保证相对较高的流畅性;
2.在光线、位置以及相应的环境方面的适应程度还有待进一步完善;
3.着手考虑手势旋转等因素,确保得以实现全方位的手势识别纳;
4.扩展现有的模板容量,保证手势识别呈现多样化的趋势;
5.考虑与哑语进行有效结合;
6.逐步引入类似于神经网络形式的相关算法,确保相应的识别精度有效提升。
7.进行相关参数的优化,使其智能化程度有效提升。

参考文献

[1]袁博,查晨东. 手势识别技术发展现状与展望[J],科学技术创新,2018,(32).
[2]李越. OpenCV应用现状综述[J]. 工业控制计算机,2017,30(7): 123-126.
[3]肖茜,杨平,徐立波. 一种基于MEMS惯性传感器的手势识别方法[J],传感技术学报,2013,(05).
[4]秦刘念. 医院计算机网络的发展与医院计算机应用的重要性[J],电脑迷,2018,10(10).
[5]东述樾,赵娜. 关于医院计算机网络安全管理工作的维护策略分析[J],世界最新医学信息文摘,2018,18(74):198-199.
[6]童欣. 一种基于OpenCV的手势轮廓识别与指尖定位跟踪方法[J], 福建电脑,2018,(12):96-98 .
[7]陆海虹. 基于OpenCV的手势识别系统的设计与实现[J],电子设计工程, 2015,23(5): 1649-1652.
[8]黄季冬. 动态手势识别技术研究与实现[D]. 武汉:华中科技大学,2012.
[9]贺航. 基于OpenCV的手势识别的设计改进与实现[D]. 广州:华南理工大学,2018.
[10]毛星云,冷雪飞. OpenCV3编程入门[M]. 北京:电子工业出版社, 2018.
[11]葛立,庄照波,邱林,袁玉荣,赵信义,杨颖鹏. OpenCV 在手势识别中的应用. 南方农机[J], 2017,(23):126-127.
[12]陈甜甜,姚璜,左明章,田元,杨梦婷. 基于深度信息的动态手势识别综述. 计算机科学[J],2018,45(12):42-52,.
[13]刘培军,马明栋,王得玉. 基于 OpenCV 图像处理系统的开发与实现[J]. 计算机技术与发展, 2018,(3): 1-7.
[14]王晓鹏. 基于OpenCV的图像处理滤波算法研究[J]. 现代工业经济和信息化,2018,8 (6): 61-62 .
[15]谢凤英.数字图像处理及应用[J].电子工业出版社,2014.
[16]Zhang Binjue,Zhao Liaoyin,Wang Yixuan.Fingeritip detection and gesture recognition based on kinectdepth data[J]. IEEE Trasactions on Computer Science and Technology,2014,3(1): 9-14.
[17]Adams W,Belotti P,Shen R. Convex hull characterization of lexicographic orderings[J].Writing,2013,23(6): 719-726.
[18]Stephen Prata. C++ Prime Plus[M]. Addison-Wesley Professional. 2017.
[19]H Ym, X Yang. Fast-moving target tracking based on mean shift and frame-difference methods [J]. Journal of Systems Engineering and Electronics, 2012,22(4): 587-592.

致谢

随着毕业论文完成,我的本科生涯也进入尾声。在这短暂的四年学习生活中,由衷的感谢北京建筑大学为我提供了一个良好的学习环境与锻炼的平台,在这里我学会了如何踏实做人,认真做事。
本次毕业设计从选题、开题报告、中期报告和文献翻译都是在张德老师耐心指导下完成。对于学生提出的要求,老师有求必应,不厌其烦地在知识点讲解、设计思路并在论文修改上面提供帮助。老师在时间和精力上付出了太多太多,庆幸自己遇到这么一位治学严谨,对学生热心的好老师,在理论知识的学习和方法的掌握上给予了我全面而严格的指导,谨向张老师表示崇高的敬意和衷心的感谢!
在人的一生中,最宝贵的就是在你关键时期有良师或益友伴自己同行,帮助自己不断取得进步。在此,还要感谢教授课专业课老师们,您们是课上专业负责传授知识的老师,是课下和蔼可亲的长辈,是您们孜孜不倦的教诲让我的专业素质获得提升,思维得到发散,能力得到提高。在平常的课程实践当中,您们教会了我自主学习的能力,让我短时间内自学新的知识。同时也感谢辅导员老师对我在学习、工作和生活上的支持,今天能够顺利毕业离不开各位老师的默默付出。经过一定时间的适应,在本次毕业设计当中,我在编程的过程中也在学习新的知识,使我的系统越来越完善,也让我以后的学习有更加坚实的基础,没有老师们的谆谆教诲,我的论文就无法完成。借此机会也向我的父母表示感谢,感谢他们对我的照顾和支持。
最后感谢在百忙之中参与论文评阅和提出宝贵意见的各位答辩组老师,您的意见将是我成长的不竭动力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1270618.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯每日一题2023.11.29

题目描述 #include <stdio.h> #include <string.h>void StringInGrid(int width, int height, const char* s) {int i,k;char buf[1000];strcpy(buf, s);if(strlen(s)>width-2) buf[width-2]0;printf("");for(i0;i<width-2;i) printf("-"…

unity UI特效遮罩

using System.Collections; using System.Collections.Generic; using UnityEngine;/**UI特效遮罩 1.需要将ScrollRect 的遮罩Mask 换为 2D Mask2.将特效的Render里面的 Masking 设置为*/ public class UIParticleMaskControll : MonoBehaviour {// Start is called before …

《HelloGitHub》第 92 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …

手敲myarraylist,深入了解其运行逻辑

1、自定义MyArrayList类 该类里面基本有两个属性&#xff0c;一个是用来存放数据的数组&#xff0c;另外一个是用来描述已经存放数据的数量。同时设置arraylist表的默认长度为10&#xff1b;代码如下&#xff1a; public class MyArrayList {private int[] elem;private int u…

基于matlab的图像去噪算法设计与实现

摘 要 随着我们生活水平的提高&#xff0c;科技产品飞速更新换代&#xff0c;在信息传输中&#xff0c;图像传输所占的比重越来越大。但自然噪声会在图像传输时干扰其传输过程&#xff0c;甚至会使图片不能表达其原来的意义。去噪处理就是为了去除图像中的噪声&#xff0c;从而…

出口贸易媒体发稿7种方法提升转化率的秘密武器解析-华媒舍

出口贸易成为了许多企业发展的重要方向。在这个竞争激烈的市场中&#xff0c;如何让自己的产品脱颖而出&#xff0c;吸引更多客户并提高转化率&#xff0c;成为了每个企业家都面临的挑战。本文将向大家介绍7种提升转化率的秘密武器&#xff1a;出口贸易媒体发稿方法。 1. 出口贸…

如何获取1688的订单详情

获取1688订单详情需要申请 第一步&#xff1a;先去1688-开放平台申请&#xff0c;申请不一定能通过&#xff0c;审批很严。 第二步&#xff1a;首次登录请先注册&#xff0c;注册成功后即可登录。 第三步&#xff1a;选择&#xff1a;我是第三方开发者 第三方是封装好的ap…

如何判断数据库慢 SQL 查询?

慢 SQL 查询通常指执行时间较长或者消耗大量系统资源的查询。要判断一个 SQL 查询是否慢&#xff0c;可以考虑以下几个方面&#xff1a; 执行时间&#xff1a; 观察查询执行所需的时间。如果一个查询花费了相对较长的时间才能返回结果&#xff0c;可能就是慢查询的一个指标。通…

JavaScript黑科技:简洁有用的一行代码,让你的开发效率飙升!

说在前面 在这篇技术博客中&#xff0c;我们将向你介绍一些令人惊叹的JavaScript黑科技&#xff0c;这些只需一行代码就能实现的简洁而有用的功能&#xff0c;将极大地提升你的开发效率。无论是优化代码、增加交互性&#xff0c;还是实现复杂的逻辑&#xff0c;这些代码片段将成…

【教程】 一文部署配置并入门 Redis

综述 什么是Redis Redis官网——Redis.io Redis, 作为一个高性能的键值对数据库&#xff0c;主要应用于以下场景&#xff1a; 缓存系统&#xff1a;由于其高速读写能力&#xff0c;Redis 非常适合用作缓存系统&#xff0c;减少数据库负载。 会话存储&#xff08;Session St…

c++基本常见错误总结

我们无论是在学习中还是在工作当中&#xff0c;总是会遇到各种各样的c编译错误问题&#xff0c;经常会有一种情况就是上一次好像遇到过这种问题&#xff0c;但是就是想不起来了&#xff08;我就是这样&#xff09;所以下面这一篇文章就是总结自己遇到的编译以及运行错误。 注意…

Javase | Java常用类 (不断补充中...)

目录: 1.Object类2.String类3.StringBuffer类4.Math类5.Random类6.包装类(不断补充中...) 1.Object类 Object类是Java语言中的所有类的超类&#xff0c;即所有类的根。它中描述的所有方法&#xff0c;所有类都可以使用。 equals( ) : 指示其他某个对象与此对象“是否相等” (比…

SD-WAN是否将终结IPsec VPN?

在网络架构的演进历程中&#xff0c;IPsec VPN一直扮演着至关重要的技术角色。而近年来备受关注的SD-WAN技术日益成熟&#xff0c;各大服务供应商纷纷将其与IPsec VPN进行对比&#xff0c;似乎预示着SD-WAN必然替代传统的IPsec VPN。 然而事实究竟如何&#xff1f;SD-WAN等于IP…

Vue项目解决van-calendar 显示白色空白,需滑动一下屏幕,才可正常显示

问题描述&#xff0c;如图 ipad(平板&#xff09;或者 H5移动端引入Vant组件的日历组件&#xff08;van-calendar&#xff09;&#xff0c;初始化显示空白&#xff0c;需滚动一下屏幕&#xff0c;才可正常显示 解决方法 需在van-calendar上绑定open"openCalendar"事件…

AI堆栈之战正在升温

原创 | 文 BFT机器人 从OpenAI和微软最近的现状可以看出&#xff0c;争夺更多新兴AI堆栈的竞争正在加剧。AI堆栈是用于开发和部署AI应用程序的技术、框架和工具的集合&#xff0c;通常包括多个层或组件。 在微软Ignite会议和OpenAI首届DevDay大会的背景下&#xff0c;一些行业…

福德植保无人机:农业科技的新篇章

一、引言随着科技的不断发展&#xff0c;无人机技术在许多领域中都得到了广泛的应用。近年来&#xff0c;福德植保无人机在农业领域大放异彩&#xff0c;成为了现代化农业的重要一环。本篇文章将为您详细介绍福德植保无人机的优势、特点以及未来发展趋势。 二、福德植保无人机的…

分油问题C++求解

原题 3个油桶&#xff0c;容量分别为&#xff08;大桶&#xff09;20&#xff0c;&#xff08;中桶&#xff09;9&#xff0c;&#xff08;小桶&#xff09;7&#xff0c;初始时大桶满油&#xff0c;如何操作可以分出17的油&#xff1f; 代码 #include<iostream> #inc…

Unity中Shader编译目标级别

文章目录 前言一、Shader Model二、Shader编译目标级别法1&#xff1a; #pragma target 3.0法2&#xff1a;#pragma require integers geometry 三、测试代码 前言 针对不同平台的特性&#xff0c;所做的一些功能 一、Shader Model ShaderModel 由微软提出&#xff0c;要求显…

【LeetCode】栈和队列OJ题---C语言版

栈和队列OJ题 1.括号匹配问题&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&#xff1a;&#xff08;3&#xff09;代码实现&#xff1a; 2.用队列实现栈&#xff08;1&#xff09;题目描述&#xff1a;&#xff08;2&#xff09;思路表述&…

java double类型保留两位小数并去除后面多余的0

public static void main(String[] args) {double value9.100001;//保留两位小数String format String.format("%.2f", value);//去除多余的0String strValue new BigDecimal(format).stripTrailingZeros().toPlainString();System.out.println("strValue &q…