版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
系统开发平台本文所开发的系统是基于所进行开发的,相应的开发环境具体涉及到了,在此过程当中还应用到了作为系统内部相应的界面库,并且基于相对开源的针对于手势检测以及识别完成了相应的开发。OpenCV关于的OpenCV概述所谓的具体可以归结为开源形式的计算机视觉库,相应的组合命名可以概括为。在年就已经建立起,如今由提供支持。它是一个跨平台开源计算机视觉库,可以运行在以为代表的多个操作系统上。包括C函数和少量类,同时提供了包含在内等多种语言接口,在图像处理和计算机视觉方面有很多通用算法。提供了机器学习库。该机器学习库侧重于统计方面的模式识别和聚类。除了在视觉相关的任务中,还可以方便地应用与其他的机器学习场合。版本于年发布。的第二个版本是2009年10月的OpenCV2.0,主要更新包括C++接口,更容易、更安全的模式,新的函数,对现有实现代码优化等。2012年8月,对的支持由一个非营利组织提供,现在它也集成了对的支持。2014年8月,随着的发布,这个强大的计算机视觉库迎来了全新的纪元。2019年,发布4.0版本。据相关统计,一个人获取的信息大约有75%来自视觉。而图像又是其中最重要的组成部分。在人工智能时代,机器视觉会在人机互动、人脸识别、手势识别等方面得到更广泛的应用。作为图像处理的重要工具之一,它将会在这一领域发挥更加重要的作用。OpenCV配置本文采用的是的配置方法,OpenCV作为开源的软件,直接到官网下载即可,目前官网更新到4.1.0版本,本系统因需要用到控件,故文中采用2.4.9版本。配置过程如下:安装,打开资源包,解压到相应文件夹。图2-1OpenCV资源包解压配置环境变量,将环境变量添加到路径:图2-2配置环境变量工程包含(include)目录的配置图2-3配置工程包含(include)目录工程库(lib)目录配置图2-4配置工程库(lib)目录链接库配置图2-5链接库配置加入动态链接库将文件夹下所有dll文件复制粘贴到图2-6动态链接库如图所示,呈现出的模块构成,其具体可以归结为部分,即模块、模块、模块以及模块(包含了相应的基本形式的数据结构以及相关函数)。图2-7OpenCV模块MFCMFC简介是微软基础类库的简称,是微软公司实现的一个c++类库,其具体涵盖了众多的句柄封装类以及大量的的内建控件以及相应的组件的封装类。MFC除了是一个类库以外,还是一个框架,MFC作为一个通用框架,不具备最好的针对性,同时也就丧失了部分灵活性和效率。但的具体封装形式相对较浅,故其相应的效率损失相对较少。利用MFCAppWizard创建Test工程之后将自动生成5个类:CAboutDlg(“关于”对话框类)、CMainFrame(基础框架类)、CTestApp(应用程序类)、CTestDoc(文档类)、CTestView(视图类)。创建一个MFC文件->新建->项目->MFC应用程序,其余项默认,点击创建。本文命名为“MFCGesture”。点击“解决方案资源管理器”,可以看到CAboutDlg、CMFCGusetureApp(和CMFCGusetureDlg。其中CAboutDlg是应用程序的“关于”对话框类,CMFCGusetureApp是由CDialogEx派生的类,CMFCGusetureDlg是主对话框类,本系统程序运行后显示的主界面即为主对话框。在“资源视图”中可以看到工程MFCGuesture的资源树。点击展开Dialog项,出现两个ID分别为:IDD_ABOUTBOX(“关于”对话框的模板)和IDD_MFCGuesture_DIALOG(主对话框的模板)的对话框模板。ID是资源的唯一标识,本质上是一个无符号整数,一般ID代表的整数值由系统定义。在这之后,可以对系统自动生成的主对话框模板进行编辑、添加控件和函数等操作,或者创建新的对话框模板和所对应的对话框类再进行编辑等操作,最终实现图形界面。系统相关技术及算法介绍系统相关技术图像采集技术对于计算机而言,摄像头扮演着眼睛的角色,是环境图像采集的工具。现有多数手势识别系统中,图像采集可以是从指定文件夹中读入的视频和计算机本地摄像头实时视频流,本文开发的手势识别系统是基于本地摄像头。为实现动态手势识别功能,首先要将摄像头采集的视频转换为单帧图像,这些图像存储到Mat中,然后进行图像处理。本文采用OpenCV开源函数库打开本地摄像头进行图像采集。图像预处理技术预处理是计算机图像处理过程重要的一步。在图像采集时会存在许多干扰因素,导致采集到的图像会存在不同程度的噪声。图像噪声包括外部噪声和内部噪声。由系统外部电磁波干扰等因素引起的噪声称为外部噪声。由光、电的基本性质引起的噪声称为内部噪声。图像后续处理受噪声直接影响,所以在图像使用前,需经过降噪、量化、压缩等处理,减少图像噪声,提高图像质量。OpenCV包含线性滤波(方框滤波、均值滤波、高斯滤波)、非线性滤波(中值滤波、双边滤波)、形态学滤波。经测试,本文采用中值滤波及膨胀滤波。肤色检测与分割技术肤色检测与分割手势轮廓检测的关键一步。在这一处理过程中将采集图像中的手势与背景分离,消除背景对手势的影响,为下一步手势识别过程提供单纯的手势图像,这一操作将影响识别准确率的高低。肤色易因光照强度和不同人之间差异,以及某些摄像头的自动对光功能的影响。为此,需要一种快捷的手段根据现场情况进行调整。本文采用将颜色空间从RGB色彩空间转换到亮度与色度分离的某个颜色空间,然后放弃亮度分量。在双色差或色调饱和度平面上,不同人的肤色区别较小,肤色的不同更多在亮度上而不是色度上。肤色分割后得到的是二值化图像,皮肤部分为白色,其余部分为黑色。在完成图像的预处理之后,将图像的RGB空间转换成YCrCb空间。YCbCr颜色空间是一种常用的肤色检测的色彩模型,其中Y代表亮度,Cb代表光源中的蓝色分量,Cr代表光源中的红色分量。特征提取一旦有效获取相应的单独目标手势以后,接下来就需要对其完成切实有效的描述。也就是说针对于相应的关键特性完成相对具有代表性的提取,除此之外,还要将其进行一定的数值化处理,建立起相应特征向量,在一定程度上将手势识别完成对应的数字化建模,便于后期进行切实有效的手势识别。关于静态形式的手势,仅需要针对某一特定时间点完成相应的描述,不难分析出,此状态下的手势特征值不会受限于相应的手势所处的地域环境与位置,几乎完全凭借其相应的姿态来决定。具体可以概括为,不管手势如何变更方位,只要保持其姿态不发生任何变化,与之相对应的特征向量便会保持相对一致。针对于动态手势识别就不那么简单了,从动态的字眼就可以看出其同时兼具时、空二元耦合特性,在此过程中必须将这两方面全部考虑进去才能确保所提取的动态手势切实有效。可以这样理解,一方面要如同于静态手势逐一时间点进行有效识别,与此同时还要对其相应的运动轨迹完成有效的识别工作,并将二者有效融合,即可完成所谓的动态手势识别工作。系统相关算法当前形式下针对于图像特征提取已经开发出了各式各样的算法,其中也存在一定量的散发针对于相应的几何变换呈现出相对较为良好的适应性,但是在手势识别过程当中还要有效处理好光照变化问题,对此前的算法还要进一步的完善,在一定程度上可以说是相对较为繁琐且艰巨的过程。考虑到这些原因,该手势识别系统是基于手势检测技术,恰巧基本可以实现相应的收拾特征获取任务,在一定程度上能够相对较好的有效解决光照变化所引申出的一系列问题。故可有效凭借的方式切实有效完成相应收拾特征的获取工作,确定手势位置。然后对此区域进行图像采集及识别。完成相应的手势特征获取以后,确保实现相对较为切实有效的手势识别,还需进一步针对于相应的分类器进行不断的模拟与调试,本项研究具体采取的是为,即支持向量机来作为分类器。HOG特征具体所指方向梯度直方图,其在一系列的视觉检测以及相应的图像处理方面已经得到了相对较为广泛的应用,在此过程当中可以实现相应物体的检测以及所对应的特征描述。其具体的运作形式可以归结为有效凭借图形局部区域所对应的梯度方向直方图来实现相应的特征搭建。尤其是在针对于行人进行相关检测当中,并与进行有效组合在一定程度上已经成功应用的众多领域当中。即针对于一副图像,相应的梯度几乎全部集中于其边缘的位置。相应的目标的形态可有效凭借梯度或者相应的边缘方向进行切实有效的描述。存在的优势具体可以归结为:在一定程度上具备一定的几何以及光学不变特性;微量的动作几乎不会对相应的检测效果造成任何形式的干扰,可以理解为允许手部肢体不那么僵持。针对于直方图所呈现出的更大区域:完成相应的归一化,可以将其整体性能有效提升。如图3-3所示,呈现出具体形式的生成流程。检测窗口归一化图像计算梯度检测窗口归一化图像计算梯度对于每个cell块对梯度直方图进行规定权重投影把所有block内的直方图向量一起组合成一个大的HOG特征向量对于每一个重叠的block块内的cell进行对比度归一化图3-1关于生成流程其具体的生成流程可以归结为以下几方面:规范化以及相应的颜色空间所谓光照的程度会对相应的具体图像色值造成一定的影响,确保将其所呈现出的干扰程度有效压低,要做的第一步就是针对于图像进行相应的归一化处理。在相应的纹理强度当中,所占比重相对较大的部分要属表面曝光,故此类压缩处理方式能使图像对这类变化具有不变性特征,相应的局部阴影以及所对应的光强改变均能得到切实有效的下降。由于在此过程当中相应的颜色信息功效不是很强烈,一般采取的方式是进行相应的灰度处理;(3-(3-1)在这里将相应取为,从而切实保证高光区呈现出相对较低的对比度,反之阴影区相应的对比度则有效提升。该项压缩处理方式在一定程度上确保局部阴影以及相应的光照改变呈现出切实有效的下降趋势。试验结果可知,引入这项步骤呈现出效果几乎不够显著,进而将其忽略。关于图像梯度的相关求解凭借一维形式的微分算子即对最初的图像进行相应的卷积求解,结果显示相应的方向梯度分别呈现在横纵坐标当中,随后完成相应梯度方向值的有效求解;进行相应的倒数运算在一定程度上不单能可有效获取其轮廓,还可以有效将光照的干扰有效压低。基于表示图像某一通道中(x,y)处的颜色值,其(x,y)处的水平方向梯度记为Gx(x,y),垂直方向梯度记为Gy(x,y),计算式如下:(3-(3-2)则(x,y)
处的梯度幅值G(x,y)
和梯度方向θ(x,y)计算公式如下:(3-(3-3)求解的具体方式可以归结为:分别基于以及对应的梯度算子对最初状态的图像完成相应的卷积求解,即可有效得到相应水平以及垂直方向上所对应的梯度分量,进而可以求解出任意像素点所对应的梯度方向与数值。针对于任意细胞单元进行相应的梯度方向直方图的建立这步的功效在于有效产出相应的编码供所对应的局部图像区域运用,与此同时还能确保图像内部的人体姿态以及相应的外形具备一定相对较弱的敏感性。该单元当中的任意像素点均能够针对于方向形式的直方图进行所谓的投票。其具体凭借加权的形式,也就是说任何的票均夹杂这一定的权值,其相应的大小是基于相应的梯度幅度进行求解的。可以有效凭借其自身或者一系列的函数关系实现相应权值的表示,基于相关测试结果显示:在一定程度上凭借幅值的方式进行表示权值所得到的效果最为良好,除此之外,一系列关于幅值的函数关系,譬如其平方、立方等形式也可以进行相应的权值表示。相应的单元的形状也呈现出多样化的趋势,具体可以归结为:星、矩形等。相应的直方图通道具体均布呈现在以及区间内。针对于相应的人体进行检测时,其中单元格大小呈现出以及像素的时候所对应的检测效果相对最为良好。倘若相应的单元格大小呈现出以及个像素时,造成的差异也不是很明显。因此将相应的图像进行像素单元化处理,也就是说任意的尺寸必须确保像素。现拟凭借进行相应的梯度信息统计工作。其具体步骤可以归结为:首先针对于相应的梯度方向进行区间层面的有效划分,也就是说进一步完成度的块等分,在此过程中任意直方图块均呈现出。如图所示:倘若其相对于梯度方向呈现出的形式,即可将其归纳到相应的第一块,倘若其相对于梯度方向呈现出的形式,便将其归纳到相应的第二块,除此之外,相应的直方图第个执行累加的运算,逐次类推。完成全部形式的加权投影,即可得到与之对应的。图3-2cell的梯度方向直方图把细胞单元组合成大的块(block),块内归一化梯度直方图(将细胞单元组合成大的区间)通常情况下,相应的梯度强度在一定程度上会随局部光照以及相应的对比度改变呈现出相对较为剧烈的改变,因此必须进行切实有效的归一化处理。归一化能够进一步地对光照、阴影和边缘进行压缩。本文采取把任意进行相应连通区间的组合,即。也就是说,将一个内全部形式的的特征向量进行有效串接从而获取到此所对应的特征。这部分区间存在一定的重叠性,也就是说:任意的特征会基于相对差异的形式呈现在最终的特征向量当中。如图所示,呈现出以及的关系形式。图3-3关于以及相应的重叠关系SVM支持向量机(SupportVectorMachine,SVM)是由机器学习领域的最大间隔分类算法发展而来的,是一类按\t"/item/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA/_blank"监督学习(supervisedlearning)方式对数据进行\t"/item/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA/_blank"二元分类(binaryclassification)的广义线性分类器(generalizedlinearclassifier),针对于降低最小化实验误差以及相应的最大化几何边缘呈现出相对较为良好的效果,故可以将其归结为最大边缘分类器。其本质在于在相对更高维度的空间内部进行相应的超平面搭建,所谓的\t"/item/%E6%94%AF%E6%8C%81%E5%90%91%E9%87%8F%E6%9C%BA/_blank"决策边界是对学习样本求解的最大边距超平面(maximum-marginhyperplane),确保其对相应进行分类的数据呈现出相对较大的间隔。相应的误差与间隔之间也就是所谓的负相关形式。经过不断发展,SVM己经成为了机器学习领域的标准工具之一。我们以二维平面加以分析。如图所示,图中呈现的红方以及蓝圆均为即将进行分类的相关对象,两条蓝线即为相应的超平面,不难分析出,任意点与之间的间距要高于,也就是说即能进行相对较为良好的区分,凭借对的有效调节直至实现任意点间距达到最大化,此刻呈现出最近形式的点即为所谓的支持向量。图3-4相应的最大间隔分类核函数针对在低维空间呈现出一定的线性不可分的相关特性,如图所示,可有效凭借高维度映射的方式,逐步实现线性可分形式的切实有效转化。图3-5关于线性转化过程肤色模型肤色特征区别于其他特征,对于彩色图像,肤色是图像中相对聚集和稳定的区域,不会基于人的各类现象的产出而发展改变,呈现出相对较高的鲁棒性,与相应的背景色彩呈现出显著的差异。通过大量的实验研究表明,不同人种的人其皮肤的色调是比较一致的,不同之处具体呈现在灰度。故一般情况下基于相对较为常见的相关肤色模型针对于人脸特征进行有效概括。由于肤色在存在差异的色彩空间中,具有不同的表现形式。本项研究基于当中的椭圆模型进行相应肤色分布的具体描述。所谓的皮肤模型可以归结为:等。通过对相关学者所做的关于皮肤信息统计方面的文献进行切实有效分析可知,倘若实现相应的皮肤信息映射到,则在相应的二维空间中呈现出类椭圆形式的分布状况。一旦可以得到相应的椭圆,在有效凭借接下来获取到的坐标进行相应的区域位置判别,也就是在椭圆内部还是外部,倘若落在其内部的话,即可将其判别为相应的皮肤,否则即为所谓的像素点。确保相应的亮度不对所谓的肤色聚类造成一定的干扰,在当中针对于相应色度执行一系列的非线性变换,完成光影相对较高的区域剔除,也就是所谓关于的极值,在进行一系列非线性变换当中,凭借有效代表相应的中轴线,相应肤色区域的具体宽度可凭借进行有效表示。也就是将其全部转化到当中,再依次进行关于平面的有效投影,故通过相应采样得到的相关点集,依次进行相应的投影以及相应的变换。图3-6关于椭圆模型的相关坐标(3-4)(3-4)(3-5)(3-5)RGB色彩空间模型RGB色彩空间是人们最常用到的颜色模型。于年选取了红,绿,蓝这几种单色作为相应的基本色,也就是所谓的色彩空间。在一定程度上可以基于三基色实现任何色彩的体现与表示,这是当今时代下最为常用的色彩表示方式。也可以有效凭借三基色进行相应光量的有效表示,其中红色(波长=700.0nm),绿色(波长=546.1nm),蓝色(波长=435.8nm)组成的坐标系为RGB色系坐标系。图像的颜色一般都用RGB坐标系来表示。在针对于手势识别相关研究过程当中,一般情况下摄像头所采集到的各种形式图像都是来源于相应的色彩空间,需要注意的是不能直接对其进行相应的肤色分割。这是因为其三基色之间存在相对较为突出的相关性,倘若进行任意分量保持相对独立的形式进行处理,可以说要比登天还难,在此过程中其对光照要求相当严格,其所带来的干扰也尤为突出,故在进行目标手势肤色分割的过程当中,几乎没有采取的现象。图3-7关于色彩空间相关坐标系在RGB模型中,手势表现出来的颜色受到关照的影响,但对同一点来说,在不同的亮度条件下其对应的值是成比例的:(3-6)(3-6)(3-7)可以归结为相应的光照几乎不会影响同一点的色彩情况,仅仅局限于亮度存在差异(3-7)YCbCr色彩空间模型具体可以归结为由进行有效变换所得到的。其中代表相应的亮度,、Cr分别代表光源中的红色分量与蓝色分量。通过非线性分段而得到的的亮度以及色度所对应的采样比率分别为,在一定程度上基本能够满足于肉眼对色度变化的敏感程度明显低于亮度变化的性质,与此同时相关色彩的求解相对较为简便、相应的亮度以及色度分量可有效进行分离、具备相对较为良好的聚类性等特征被认为是很出色的肤色空间模型。经过对文献的调研,在人们的大量实验后,通过统计的方法来确定肤色的参数,人手肤色在YCbCr空间中的范围Cb∈(105,127),Cr∈(137,162),当像素点属于此范围时,我们就认为它是皮肤像素点。其转换公式为:(3-8)(3-8)相关实验结果显示,基于相关模型,以及分量呈现出一定的相关性,但需要注意的是与之间没有所谓的相关性,当亮度存在差异的形势下以及均能呈现出相对较为出色色聚类效果。而且基于到空间的转化基本可以称之为线性变换,从而可以忽视的干扰,从而有效降低冗余通道的数量。这就实现了相应的维度降低操作。如图3-8所示,呈现出肤色关于平面相应的投影。图3-8关于肤色在平面上相应的投影经查阅文献及实验,本文首先将采集到图像转换到YCrCb空间,再对其进行手势分割以得到想要的目标手势。相比于RGB和HSV,YCrCb空间计算量远远小于前两种,同时对人体肤色的聚类效果最佳,受光线变化干扰也最小。接下来的一章将进一步介绍基于肤色聚类分割的具体呈现形式,此处不再赘述。中值滤波肤色分割之后,我们还需对图像进行一定的平滑度处理。在一定程度上又可归结为模糊,通常情况下凭借其进行有效降噪,其本质在于针对于相应的图像进行平滑化,从而有效降低其内部的噪点存在。在本文所涉及的手势识别当中,所谓的图像平滑处理的最根本原因在于尽可能最大限度降低一系列的冗余信息,便于后续的手势轮廓分割以及相关特征的有效获取,与此同时致使相应的计算量有效下降。中值、双边以及相应的高斯滤波是相对较为常见的几种平滑滤波方式。中值滤波可以归结为相对较为典型的非线性技术,其具体的原理是有效凭借像素点灰度中值进行有效近似等价替代,其功效在于有效剔除相应的造成,与此同时还能切实有效保证一系列边缘细节不会被破坏。基于实验进行分析,相应的中值滤波对去除图片噪声特别理想。相比于其他平滑方法,其在一定程度上能够有效克服一系列相对较为常见的线性滤波器,譬如最小均方、方框、均值滤波等造成的一系列细节模糊问题,与此同时能够有效降低脉冲干扰以及相应的扫描噪声,还能切实有效保证一系列边缘细节不会被破坏。除此之外,相应的算法相对较为便捷实用。故本文所涉到的手势识别系统有效凭借中值滤波的方式完成相应的噪音剔除。(3-9(3-9)其中f(x,y)、g(x,y)分别表示中值滤波处理前、后的图像,W是模板,通常为3*3或者2*2,本文采用3*3。膨胀滤波形态学(morphology)是生物学的一个分支,图像处理中的形态学具体可以归结为数学形态学,其实质在于格论以及相应的拓扑学层面的图像分析。简而言之,所谓的形态学操可以归结为基于相应形状的图像处理。在一定程度上为相应的图像形态学变换营造了相对较为快捷的函数以及开发环境。最基本的形式可以归结为两类,即膨胀以及腐蚀。本文采用膨胀进行滤波。膨胀(dilate)又称为作图像加粗,也可以称之为局部最大峰值的求解。基于数学视角出发,所谓的膨胀即为将图像(与核进行卷积计算。核的形状以及大小几乎不受任何限制,它具备一定的单独形式进行定义的相关参考点,也就是所谓的锚点。通常情况下,核具体表现为相对较小其中心部位存在一定的参考点的实心圆或者正方形。可以将其当做相应的模板甚至是掩码。相应的膨胀操作在一定程度上能够针对于噪音以及阴影等干扰所进行分割的各个部分完成相应切实有效的融合。如图所示,有效凭借膨胀可以进行局部最大峰值的求解。核与图形发生卷积,即进行核覆盖区域所对应的的像素点的最峰值的求解,并将其赋给相应的参考像素,便可将相应的高亮区域逐步扩大。(p188)图3-9膨胀滤波膨胀的数学表达式如下(3-(3-10)系统设计与实现凭借着计算机以及图像处理技术发展势头迅猛提升,相应的计算机视觉等方面也在迅速发展,手势识别作为人机交互的一种方式,也迎来了新的发展机遇。通过前期调研发现,手势识别技术已应用在多个领域,如日常生活视频直播或者拍照过程中,结合用户的手势(如点赞、比心),实时显示相应的特效,丰富交互体验。智能驾驶过程中将手势识别应用到驾驶辅助系统,使用手势控制车内的各种功能,一定程度上解放双眼,将更多的注意力放在道路上,提升驾车安全性。同时还包括百度AI开放平台提供的在线手势识别服务等。这些均反映着手势识别技术的火热。开始打开摄像头采集图像图像预处理结束肤色检测图像分割手势识别特征提取开始打开摄像头采集图像图像预处理结束肤色检测图像分割手势识别特征提取图4-1手势识别流程图下面对系统中三个重要模块进行介绍:图像采集模块基于本地形式的摄像头,完成相应的视频图像的切实有效采集,呈现出空间视频流的形式进而为手势识别输入奠定一定的基础,并将采集到个各项数据有效储存到当中,为接下来的输入做好充分准备。图像预处理模块凭借图片的有效缩放,进而将后期的相关计算量有效压低,在此过程当中有效剔除相应的图片噪音,为接下来的相应处理提供相对较为便捷的条件。这部分具体涵盖了灰度变换、空间转化以及相应的平滑处理等。匹配识别模块该模块是手势识别系统需要实现的目标功能,也是本系统最重要的模块。在对图像进行一系列的处理后,有效获取到相应手势图像具体形式的特征值,接下来与事先设定好的模板特征值完成切实有效的对比以及归类,进而有效寻找出所对应的手势信息,譬如手型所代表的数字。然而在动态识别当中,系统内部会进行实时的信息采集,并完成相应的处理工作。系统整体设计根据前期的需求分析和调研,本文设计的整体系统结构如下图所示:手势样本采集开始手势训练模块手势样本采集开始手势训练模块图像预处理图像预处理待识别手势采集图像预处理手势分割手势特征提取手势分割待识别手势采集图像预处理手势分割手势特征提取手势分割手势测试模块训练手势模板手势特征提取训练手势模板手势特征提取提取手势模板提取手势模板手势判定手势判定输出结果输出结果结束结束图4-2手势识别程序流程图手势训练模块在开始训练手势之前,需要用户打开电脑自带的摄像头提供视频流。voidCMFCGuestureDlg::OnBnClickedOpencap()//打开摄像头{ m_Cap.open(0); if(!m_Cap.isOpened()) { MessageBox("摄像头打开失败"); return; }但是MFC的picturecontrol控件中的图像格式与OpenCV的图像格式不尽相同,因此需要将OpenCV得到的视频流通过CvvImage开源图像处理库进行转变处理。处理完以后摄像头所得到的图像就会被显示在控件中。voidCMFCGuestureDlg::regniseHand(stringpath_img){ imagesRegnise=imread(path_img.c_str());//imagelist[0].c_str() Matincp=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) { intregResult=mySvmClassifier->svmPredict(incp); CStringstr; 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("没有检测到手势"); }}在本系统中,为降低识别失败率及程序复杂度,我直接定义并设置了检测区域的位置。intWIDTH=m_src.cols; intHEIGHT=m_src.rows; capRt=cv::Rect(1*WIDTH/3-1,1*HEIGHT/3-1,WIDTH/2,HEIGHT/2);采集手势如图所示图4-3手势采集voidCMFCGuestureDlg::OnBnClickedReg()//注册手势类别{ CStringstr; 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空间,再利用椭圆皮肤模型进行皮肤检测与分离。MatCMFCGuestureDlg::handPreprocess(Mat&src){ ycrcb_image; Matoutput_mask=Mat::zeros(Size(src.cols,src.rows),CV_8UC1); for(intj=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);//形态学运算函数 returnoutput_mask;}输出如图所示图4-5手势预处理采集并处理完图像后,进行手势模型的训练voidCMFCGuestureDlg::OnBnClickedButton3()//训练模型{ char*path_="./Data/"; readDir(path_,imagelist,labelName); mySvmClassifier=newsvmGuesture(imagelist.size(),HogWIDTH,HogHEIGHT); //新建的手势识别的类svmGuesture,这个类在另外的文件 if(_access("./model.xml",0)==0) { mySvmClassifier->svm.load("./model.xml"); return; } intflag=mySvmClassifier->loadData(imagelist); if(flag==-1) { MessageBox("notFoundimagefiles"); } flag=mySvmClassifier->svmTrain(); if(flag==-1) { MessageBox("trainmodelerror"); } MessageBox("trainingmodeldone");}手势测试模块系统必须先通过手势检测模块来画出手势轮廓与皮肤区域。此系统中的手势检测功能就是通过OpenCV手势识别库,在特定区域提取手势特征。本系统手势识别模块包括了动态识别和静态识别。具体方法将在第五章叙述。启动手势识别功能代码如下:voidCMFCGuestureDlg::OnBnClickedButton2()//手势识别{ if(_access("./model.xml",0)!=0) { MessageBox("请先训练模型"); return; } startRegnise=true;}系统测试与分析在系统运行和测试阶段,通过对系统功能逐个进行测试,验证系统是否达到了预期的设计要求。系统测试环境在本文的测试中,系统的运行环境为英特尔Corei7-8750H@2.20GHz六核处理器和16GB内存配置的电脑,操作系统为win10,开发环境采用VisualStudio2013,开发语言为C++。系统界面测试手势注册功能测试系统界面如图5-1所示图5-1手势识别系统界面考虑需要一只手注册,一只手操作,我将注册区域调整到画面左下方。以注册手势0为例。图5-2注册手势“0”voidCMFCGuestureDlg::OnTimer(UINT_PTRnIDEvent) //时间响应函数{ 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&®Num<50&®ingInt>=0) { //Mathand=handPreprocess(m_src(capRt)); if(regingInt==1)thresh_=0.24;elsethresh_=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); MatsaveImg=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&®Num==50) { sprintf_s(buffer,"手势%d注册完成",regingInt); regBool=false; regNum=0; MessageBox(buffer); } if(startRegnise) { MatsaveImg=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); intregResult=mySvmClassifier->svmPredict(saveImg); CStringstr; 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-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-13手势“1”静态识别图5-14手势“2”静态识别voidCMFCGuestureDlg::OnBnClickedButton4()//图片识别按钮{ KillTimer(1); startRegnise=false; regBool=false; CStringstr; BROWSEINFObi; TCHARname[MAX_PATH]; name[0]='d'; ZeroMemory(&bi,sizeof(BROWSEINFO)); bi.hwndOwner=GetSafeHwnd(); bi.pszDisplayName=name; bi.lpszTitle=_T("Selectfolder"); bi.ulFlags=0x80; LPITEMIDLISTidl=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-155-16动态手势识别光线问题由于光照条件变化和手掌与摄像头距离等原因,在手势注册时,肤色分割变化较大,直接影响从视频流中采集的图像质量,并影响手势训练结果,最终导致手势识别效率降低。5-17手势角度变换造成识别错误从测试中发现,由于采集手势样本数量有限,当摄像头采集区域手势角度发生变化时,系统无法或错误识别动态手势。图5-185-19身体其他部位肤色对识别的影响另外由于人体其他部位肤色与手部肤色差别不大,当有身体其他部位如脸或手臂进入图像采集区时,同样会被肤色分割。在手势采集时会影响模型训练效果,而在手势识别时,则会导致错误或无法识别。图片识别(静态手势)问题5-20异侧手无法识别从测试结果中我们可以看出,静态手势在图像处理方面不如动态手势,主要表现在图像平滑处理不好。同时遇到与动态测试中相同的问题,当旋转图片角度测试,或者导入另一只手进行测试时,系统无法识别该手势类型。测试结论经过上述的测试,表明该系统可以基本实现设计需求中的各项功能,在光线和背景稳定的情况下能够保证这些功能的正确执行,本系统的算法基于原有算法进行部分了改进,达到预期设想。其中手势检测可以很好地检测动态正面手势,摄像头采集的视频中的手势都可以正常进行预处理,但当外界条件变化或因手部移动造成光线、位置等因素造成的干扰,影响了图像的采集,从而造成后续识别率降低。且由于边缘滤波算法研究不够全面和充分,因此静态手势识别效果不够好。通过系统整体运行测试,说明该系统可以实现一定程度上的动态、静态手势识别功能。总结和展望随着时代的不断发展伴随着科学技术的日新月异,相应的手势识别在人机交互的过程当中呈现出相对较为便捷、高效等特点,成为当前研究和应用的热点。而新一代的人机交互必然会呈现出相对较为人性化、智能化以及自由化的趋势。本系统优点总结本文以VisualStudio2013+OpenCV2.4.9作为开发平台,开发出基于图片以及本地摄像头采集手势并进行切实有效识别的系统,同时利用图像处理及模式识别的理论知识,我对手势识别相关领域有了更深入的了解。本文首先了阐述了手势识别的基本原理。对输入图像充分做好相应的预处理,其次针对于手势图像的各方面特征,基于相应的皮肤模型的椭圆模型法对皮肤特征进行提取。为了使分割效果更佳,在肤色模型区域的算法中,在查阅资料后选取形式的颜色空间,与此同时考虑到相应的亮度变换比相对较大,一旦呈现过亮或者过暗区域的现象产出,在一定程度上会导致中呈现肤色溢出的现象。有效凭借完成相应类椭圆模型的搭建。相应的皮肤色彩呈现出一定的聚类特性,基于该聚类特性可有效求解出各点的相似度,并进行相应的归一化处理,即呈现在区间内。去除肤色区域中的非手势区域,从而可以较好的分割出目标部分。本项研究具体的贡献在于:针对于的手势模板,提出了相应的动态识别算法进行切实有效识别。本文对手势的特点进行了切实有效的分析,具体涵盖了静态以及动态手势相关提取与识别,并且基于特征以及相应的算法进行了切实有效的探索。整体而言,系统运行情况良好,符合预期。本论文不足总结针对于本文所开发的手势识别系统进行了一系列验证性实验以后,将相应的不足之处有效归结为以下几点:虽然帧速的相关识别相对较快很快,但在精准度方面还有待进一步完善;手势采集区域固定,可通过更换算法实现手势区域自由定位;图像预处理算法仍需改进,尤其是图像平滑处理;对旋转或者不同位置的手势,系统无法快速、准确地进行识别;基于调试中相应的参数,使其相应的特征提取更加切实有效。算法需要手动设置参数值,无法自适应外部环境的变化;给程序构造更加友好的用户界面;当前能够有效识别手势形式相对较少,未来可进行相关算法的完善以及模板的扩充。未来工作展望针对于手势识别未来的研究工作从以下方面着手进行:完善相关识别算法,确保相应的识别精度有效提升,同时保证相对较高的流畅性;在光线、位置以及相应的环境方面的适应程度还有待进一步完善;着手考虑手势旋转等因素,确保得以实现全方位的手势识别纳;扩展现有的模板容量,保证手势识别呈现多样化的趋势;考虑与哑语进行有效结合;逐步引入类似于神经网络形式的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业环保投资回报分析与决策考核试卷
- 智慧城市的医疗健康实践考核试卷
- 派遣工人劳务合同模板
- 林木育种的花卉种质资源保护与利用考核试卷
- 湖景租房合同范例
- 灯管买卖合同模板
- 冷冻肉购销合同模板
- 湘莲加工合同范例
- 松江区气垫搬运合同范例
- 单位聘请兼职合同范例
- 2024年《军事理论》考试题库附答案(含各题型)
- 湖北省公安厅机场公安局警务辅助人员招聘考试试题及答案
- 中国加速康复外科临床实践指南(2021)解读
- 2024陕西延长石油(集团)有限责任公司招聘笔试参考题库附带答案详解
- 水利风景区项目策划
- 颈肩腰腿痛的针灸治疗方法
- 政务信息宣传培训课件
- 商业街管理制度及商户管理制度(初稿)
- 平台资本主义的垄断与剥削逻辑论游戏产业的“平台化”与玩工的“劳动化”
- 教科版六年级科学上册全册同步练习附答案
- CJJT 135-2009 (2023年版) 透水水泥混凝土路面技术规程 清晰版
评论
0/150
提交评论