




已阅读5页,还剩40页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本科毕业设计(论文)基于单目手势识别交互系统的设计与实现学院机电工程学院专业数字媒体技术基于单目手势识别交互系统的设计与实现李林钢机电工程学院摘要随着计算机技术的逐渐发展,出现了一些符合人的习惯的人机交互技术。其中,手势的检测和识别技术作为一种有着自然性、简洁性和直接性的一种新型的交互方式,是这些交互技术当中倍受重视的研究和应用的技术之一。近几年来,已经有相当一部分的应用采用了这种手势识别的方式作为跟机器交互的手段,受到了世界各个国家的科研机构和科技企业的重视与青睐。基于计算机视觉的手势识别需要解决一系列的问题。首先是要做到的是从背景中将手分割出来;然后将有用的信息与冗余的信息分离开来,并将相关的手势信息提取出来;最后从相同的手势中根据实际情况,解读出它的特定的含义。针对这些问题,本文讨论里一种采用基于单目的特定颜色模型的背景分离方法和基于关键信息的手势提取方法,用VISUALC2010和OPENCV进行开发,实现在多种摄像头下的手势识别交互系统,主要包括以下方面(1)针对不同摄像头画质的缺陷,采用中值滤波或均值滤波然后还原细节的方法实现图像较好的降噪,再用不同采样半径的USM锐化的方式实现图像信息的强化。(2)根据人手和背景色相等方面的差异,采用亮度两个颜色通道的色彩模型进行色彩分离,并将未选择到的阴影和高光等区域利用连续色的原理进行进一步的选取。(3)根据选取结果有很多干扰区域的情况,实现最大面积连通区域的提取算法,以排除关键信息提取时的干扰。(4)根据手的区域的情况和交互的自然性,采用稳定的手的重心作为手的位置,利用近大远小的关系,采用手占摄像头面积的大小判断手离摄像头的距离。(5)针对以上识别的结果,实现了一些常见的人机交互应用,包括屏幕画图器、鼠标模拟器等。关键词手势识别;VISUALC;背景消除;连通区域;关键信息提取ABSTRACTWITHTHEDEVELOPMENTOFCOMPUTERTECHNOLOGY,SOMEHUMANCOMPUTERINTERACTIONTECHNIQUESWHICHMEETPEOPLESHABITSAPPEARAMONGTHEM,GESTUREDETECTIONANDRECOGNITIONTECHNOLOGY,ASANEWNATURAL,SIMPLEANDDIRECTTECHNOLOGY,ISHIGHLYVALUEDINRECENTYEARS,THEREHAVEBEENCONSIDERABLEPARTOFTHEAPPLICATIONUSINGTHISGESTURERECOGNITIONAPPROACHASAMEANSOFANINTERACTIONWITHTHEMACHINE,ANDITDRAWSATTENTIONOFANDWASFAVOREDBYTHESCIENTIFICRESEARCHANDTECHNOLOGYENTERPRISESOFVARIOUSCOUNTRIESCOMPUTERVISIONBASEDGESTURERECOGNITIONNEEDSTOSOLVEASERIESOFPROBLEMSTHEFIRSTISISHOWTOSPLITTHEHANDFROMTHEBACKGROUNDTHENSEPARATETHEUSEFULINFORMATIONANDREDUNDANTONE,ANDEXTRACTTHERELEVANTINFORMATIONGESTUREFINALLY,DECIPHERTHESPECIFICMEANINGOFTHESAMEGESTUREINACCORDANCEWITHTHEACTUALSITUATIONTOSOLVETHESEPROBLEMS,THISPAPERDISCUSSESAGESTURERECOGNITIONINTERACTIVESYSTEMWITHAKINDOFBACKGROUNDSEPARATIONMETHODSBASEDONSPECIFICCOLORMODEL,ANDAKINDOFGESTUREEXTRACTIONMETHODONKEYINFORMATION,DEVELOPEDBYVISUALC2010ANDOPENCV,FITSAVARIETYOFCAMERA,WHICHINCLUDESTHEFOLLOWINGASPECTS1FORDIFFERENTQUALITYDEFECTSAMONGCAMERAS,THISSYSTEMUSESMEDIANFILTERORMEANFILTERANDRESTORESTHEDETAILMETHODTOREDUCETHEIMAGENOISECONSERVATIVELYTHENUSEDIFFERENTSAMPLINGRADIUSOFUSMSHARPENINGTOENHANCETHEIMAGEINFORMATION2ACCORDINGTOTHEDIFFERENCEOFCOLORSBETWEENBACKGROUNDANDHANDS,THISSYSTEMUSESTHEBRIGHTNESSANDTHETWOCOLORCHANNELSASACOLORMODELFORCOLORSEPARATIONTHENOTCHOSENDISTINCT,SUCHASTHESHADOWANDHIGHLIGHTAREASWILLBEFURTHERSELECTEDUSINGACONTINUOUSCOLORMETHOD3ACCORDINGTOTHERESULTSTHEREAREALOTOFINTERFERINGREGIONSOFSELECTEDAREASTHESYSTEMACHIEVESTHEMAXIMUMCONNECTEDAREAREGIONEXTRACTIONALGORITHM,WHICHEXCLUDESTHEINTERFERENCEOFTHEKEYINFORMATIONEXTRACTION4ACCORDINGTOTHEHANDREGIONOFTHECASEANDFORTHENATURALISTINTERACTIVE,THESYSTEMUSESTHESTABLEPOINTGRAVITYCENTEROFTHEHANDASTHEHANDPOSITION,ANDUSESTHESIZEOFTHEHANDTOKNOWTHEDISTANCEFROMTHEAREAWITHTHENEARFARSMALLERPRINCIPLE5ACCORDINGTOTHERESULTSABOVE,THESYSTEMACHIEVESSOMECOMMONINTERACTIVEAPPLICATIONS,INCLUDINGSCREENDRAWINGCONTROL,MOUSESIMULATOR,ETCKEYWORDSGESTURERECOGNITIONVISUALCBACKGROUNDREMOVALCONNECTEDREGIONKEYINFORMATIONEXTRACTION目录1绪论111手势识别交互的背景112手势及识别方式的分类213基于计算机视觉的手势识别技术需要解决的问题214本程序主要实现的功能32摄像头信息的采集和预处理521OPENCV关于摄像头操作的API522在控件中呈现有关摄像头的图像6221HDC的获取6222将IPLIMAGE位图渲染到控件当中623摄像头图像的预处理7231图片的缩放7232图片的降噪8233图片的锐化113手的区域的提取1331肤色种子的获取13311获取鼠标相对图像位置的颜色13312自定义肤色种子1432基于手与背景在一定颜色模型上的区别的初步提取1433将手的范围扩展到其他区域1534外部孤立点的消去16341获取连通区域的面积和标记区域ID18342最大面积和对应区域的获取1935内部孤立点的修补194手的关键点的提取2141手的重心和面积的确定2142手的边缘的提取215程序主体代码的实现2351工程的环境和架构2352主类成员变量的定义2453程序的初始化代码2454从输入控件中获得识别参数2655总体识别语句的实现286应用设计3061屏幕画图的设计30611获取CWINDOWDC30612定义和设置笔刷30613绘图语句3062模拟鼠标功能的实现31621手的有效偏移量的获取32622鼠标点击功能的实现327手势识别的综合测试34结论36总结36展望与改进36参考文献38致谢391绪论11手势识别交互的背景随着整个社会逐步的信息化,带给了我们一种新的交互方式人机交互HUMANCOMPUTERINTERACTION。而这一交互活动越来越成为人们日常生活的一个重要内容。近几年来,随着计算机技术的逐渐发展,出现了一些符合人的习惯的人机交互技术,如头部跟踪、人脸识别、表情识别、唇读、体势识别以及手势识别等等1,并逐步向以人为本的方向迈进。其中,手势的检测和识别技术作为一种新型的方式,是这些交互技术当中倍受重视的研究和应用的技术之一。手势是一种有着自然性、简洁性和直接性的一种人机交互手段。1如果能只用人手作为计算机的输入设备,那么我们就无需学习其他繁重的硬件设备的操作,仅需根据人们的习惯,确定一些适当的手势,即可用简单的方式控制机器。而手势是人的一种很常用的交流方式。像人可以用手指的方向来表示物体的位置,用挥手来表示过来或再见,用一定的手势表示数字等等2。近几年来,已经有相当一部分的应用采用了这种手势识别的方式作为跟机器交互的手段。受到了世界各个国家的科研机构和科技企业的重视与青睐,如IEEE自1995年起召开的人脸与姿势自动检测年会FGIEEECONFERENCEONAUTOMATICFACEANDGESTURERECOGNITION以促进包括手势检测识别技术在内的技术交流与发展。2图11手势识别应用12手势及识别方式的分类手势GESTURE本身具有多义性和多样性,由于领域、文化背景等的不同,对手势的定义也会不同。这里把手势定义为手势是人手产生的各种姿势和动作,手势和姿势POSTURE的主要区别在于姿势更为强调身体的总体形态而手势更强调手的细节。1手势按时间关系可分为静态手势指姿态,又称手形和动态手势指动作,由一系列姿态组成。静态手势对应时间上的一个点,而动态手势对应着一段时间内的一条轨迹,需要使用随时间变化的空间特征来表述3。动态手势具有丰富和直观的表达能力,与静态手势结合在一起,能创造出更丰富的语义。按手势目的又可以分为操控手势和交际手势10。在人机交互系统中,操控手势的一种典型应用就是在二维和三维的虚拟环境中来操控物体。交流手势主要是指在自然环境中伴随人们自然对话的自由形式手势。手势相对于语言来说是一种表达人们想法的单独的补充模式。在对话中与手势相关联的信息是一种语句的时间和空间结构,可以用机器来提取它们11。手势的识别方式可分为利用机械装置的识别和基于计算机视觉的识别。机械装置,如数据手套是虚拟现实中重要组成部分,可以将手指的复杂的三维位置和动作利用附着的感应器传到到计算机当中去。然后可以重新呈现手部动作。数据手套传感的识别方法的技术关键是手套能不能将手指、手掌、手腕的弯曲真实的以数据形势反演到系统数据库中,让系统根据模型对手势进行有效识别。由于手部软组织和计算复杂性,数据手套的计算速度总是存在延时,同时从人机交互的角度手套佩戴也十分不方便。如果多人使用还存在卫生等问题4,再加上这些传感器昂贵的价格,因此数据手套等机械识别的方式在推广上会受到很多的障碍。近些年来,基于计算机视觉的识别方法提供了一种成本较低的能减少用户限制的手势识别的方法,这种方法也是本系统的主攻方向。在基于计算机视觉的识别方式中,通常的做法就是把手势识别问题看成模式识别问题来对待。通过摄像头等设备来获取图像或视频,再把它们分解成特征集,然后用这些特征集与预先定义好的模式进行匹配。13基于计算机视觉的手势识别技术需要解决的问题无论是利用数据手套还是用手部粘贴高亮标签使作为输入设备会给使用者带来不舒适感如出汗等,且设备价格昂贵,难以推广。在上述研究的基础上,研究者渐渐把研究的重心转移到的不佩戴手套或不粘贴设备的自然手识别检测技术之上,以追求使用者更舒适的体验,其中从计算机视觉的研究方式入手是当前比较主流的研究方向,然而实现起来难度更大。首先是要做到的是从背景中将手分割出来,通常会用肤色分割的方法基于皮肤的色调将不同于周围背景手的区域分离出来但是会受到光线等因素干扰,分离出手后需要用合适的模型对手的动作建模。之后从模型中估算出参数,根据估算出的参数对手势进行分类,得出结论。由于在数据采集时容易受到背景干扰,往往要求背景颜色和手的颜色有较好的区分度。4其次人体由多个部分组成,其中手指往往包含丰富的信息,而头和手臂所以及人手本身因光滑而产生的大量阴影等信息则大多为冗余信息,故如何将有用的信息与冗余的信息分离也是提高手势识别能力的关键。再次,人手是弹性物体,同样的手势的表现效果可能差别很大5,并且同样的用户者要重复做出完全相同的手势也是不可能的,如何降低甚至消除这个因素的影响对整个识别的准确率也有一定影响。最后,手势往往具有复杂、多重的含义,单一的方法很难准确地解读人手的具体内涵进而实现最终的识别,故需要综合多种方法。6针对上面提到的多种难题,不同的研究和开发人员提出了许多种不一样的方案。综合以上,本文将提出一种能适应各种摄像头的,能抵抗一定干扰信息的一种基于计算机视觉的进行手势识别解决方案。14本程序主要实现的功能(1)实现对摄像头的发现和选取,与对每一帧图像的采集和缩放。(2)实现对图像的清晰化,包括点状噪声的去除、细节的还原以及之后整体的锐化。(3)实现对背景信息的剔除,包括对肤色的提取和分割,对阴影和高光区域的扩散和对一些孤立点的剔除。(4)实现关键信息,如手的重心、手的远近(手的面积)等的确定。(5)利用以上关键信息,实现一些应用。为了保证软件的实时性,同时便于以上功能的实现,开发工具选用VISUALC2010,第三方类库采用OPENCV20来完成这项工程。2摄像头信息的采集和预处理21OPENCV关于摄像头操作的API要进行手势信息的获取,首先需要拥有一定的硬件,如数据手套、摄像头等。对于软件方面则要安装相应的驱动程序和了解它们的API。幸好OPENCV提供了一系列通用而且简洁的外部接口以便于实现以上的工作,对摄像头操作代码流程如图21所示M_VIDEOCVCREATECAMERACAPTUREI/获取第I个摄像头信息给视频指针CVCAPTUREM_VIDEO/定义视频指针M_VIDEO/视频指针M_VIDEOCVCREATECAMERACAPTURE1/获取任一个摄像头信息给视频指针提示错误并退出程序M_VIDEONULL/是否找到摄像头IPLIMAGEM_CAPTUREDCVQUERYFRAMEM_VIDEO/获取当前摄像头图片,不能用CVRELEASEIMAGE手动释放图片内存。进行关于M_CAPTURED和它以前的副本的图像处理和应用用户手动退出CVRELEASECAPTURE/释放视频指针结束延迟一定的时间HIJIAN开始HI否是否是图21摄像头启动和释放的代码流程在实际的应用当中,当用户拥有多个摄像头时,CVCREATECAMERACAPTURE方法的参数应该取零或正整数,来选择不同编号的摄像头。当找不到该摄像头时,可以自动选择成默认的摄像头,一般来说是第0号摄像头,仍未找到才进行错误退出。22在控件中呈现有关摄像头的图像为了便于观察,需要将摄像头的源数据或数据的处理情况呈现到控件中,而MFC类库和OPENCV共同提供了这些方法。221HDC的获取MFC的CDC(设备上下文)和它对应的句柄HDC提供了一系列有关画图的方法,对于一个有一定ID(如IDC_STATIC1)的控件来说,获取的方法如下CWNDPWNDGETDLGITEMIDC_STATIC1CDCPDCPWNDGETDCHDCHDCPDCGETSAFEHDCIFHDCNULLMESSAGEBOX“无法获取HDC“RETURNTRUE这里将ID为IDC_STATIC1的控件通过PWND获取控件本身的窗口信息,然后通过这个PWND来获得有关设备的上下文CDC和HDC,获取不到则出现错误对话框并退出。如果已经设置了控件的CONTROL类型的变量(如M_S1),则CDC和HDC可以通过这个变量直接获取CDCPDCM_S1GETDCHDCHDCPDCGETSAFEHDC222将IPLIMAGE位图渲染到控件当中OPENCV的IPLIMAGE类型的图片渲染到控件的HDC前需要得到它的头部信息,这需要开辟一段内存并将它的结构体提取出来,然后分别赋值STATICUCHARBUFFERSIZEOFBITMAPINFOHEADER1024BITMAPINFOBMIBITMAPINFOBUFFERBITMAPINFOHEADERBMIHMEMSETBMIH,0,SIZEOFBMIHBMIHBISIZESIZEOFBITMAPINFOHEADERBMIHBIWIDTHIMAGEWIDTHBMIHBIHEIGHTIMAGEORIGINABSIMAGEHEIGHTABSIMAGEHEIGHTBMIHBIPLANES1BMIHBIBITCOUNTUNSIGNEDSHORTIMAGEDEPTHBMIHBICOMPRESSIONBI_RGB其中IMAGE变量是IPLIMAGE的实例。之后调用MFC的SETDIBITSTODEVICE方法,参数为HDC,0,0,IMAGEWIDTH,IMAGEHEIGHT,0,0,0,IMAGEHEIGHT,IMAGEIMAGEDATA,BMI,DIB_RGB_COLORS,即可将OPENCV的IPLIMAGE画入到HDC为HDC的控件中。但其后不能执行PDCINVALIDATE操作,否则原先画的结果会被清空。23摄像头图像的预处理由于摄像头的图像尺寸千变万化,不一定能满足手的关键点位置的精准度或者图片太大造成延迟和卡顿,而且可能包含了大量的阻碍识别的信息(如点状噪声等),因而需要一些预处理工作。231图片的缩放图片需要缩放到一个合理的大小,如320X240,为了加强精确度有条件的可以加到640X480。OPENCV提供了一个函数CVRESIZE可以实现这个功能。如原IPLIMAGE图片是M_CAPTURED,目标图片是M_FRAME,则函数可写成CVRESIZEM_CAPTURED,M_FRAME,M_CAPTUREDWIDTHM_FRAMEWIDTHCV_INTER_LINEARCV_INTER_AREA当原图片比目标图片小时应使用双线性或双三次插值的放大算法,来使得手的运动轨迹连续变化,反之,则采用平均值的缩小算法,来减少波纹和边缘的不连续现象。232图片的降噪噪声可以理解为“妨碍人和传感器对所接收的信源信息理解的因素”。而图像中各种妨碍信息接受的因素即可称为图像噪声。噪声被定义为“不可预测而只能用概率统计的方法,来认识的随机误差”。图片噪声按产生的原因可分为外部噪声和内部噪声。外部噪声是指由于系统外部干扰以电磁波或由电源串进系统内部而引起的噪声。如电气设备,天体放电现象等引起的噪声,而这种噪声可能就是高斯噪声、脉冲噪声等多个噪声合成累计的。内部噪声主要是由光和电的基本性质所引起的噪声。如电流的产生是由空穴或电子的集合,定向运动所形成的,而这些粒子运动的带有随机性,产生了散粒噪声;而导体中也有自由电子,它们会进行无规则热运动,形成热噪声。为了消除这些随机因素,可以通过中值滤波或均值滤波的方法法进行滤波。对应的OPENCV函数是VOIDCVSMOOTHCONSTCVARRSRC,CVARRDST,INTSMOOTHTYPECV_GAUSSIAN,INTPARAM13,INTPARAM20,DOUBLEPARAM30,DOUBLEPARAM40。其中SMOOTHTYPE是CV_GAUSSIAN时将对图像进行大小为PARAM1PARAM2的高斯卷积的均值滤波。而SMOOTHTYPE是CV_MEDIAN时将对图像进行大小为PARAM1PARAM1的中值滤波,注意为PARAM1奇数,且不大于7,其效果结果如下图所示A原图BCV_GAUSSIANCCV_MEDIAN图22CVSMOOTH的不同SMOOTHTYPE的比较可以看出,中值滤波对边缘的保留效果较强,但实际执行的速度较慢。不过这些降噪变换都会导致有效细节的丢失。为此可以将图片用按一定阈值还原,这分为两种方法还原与原图像相差小的部分和与还原原图像相差大的部分,为了保持还原后的连续性,可以设置成不在符合阈值内的图像的保留度再按跟还原原图像相差值线性变化,其效果如图23至图26所示图23中值滤波后的图形图24原图图25低阈值保留后的图形图25高阈值保留后的图形从上图可以看出,还原与原图像相差小的部分可以消除一些突兀的部分,可称为椒盐噪声,使得图像看起来比较柔和,但形体内部的与原图像相差小斑纹仍然存在;而还与原原图像相差大的部分则可以让形体内部的斑纹大大减弱或消失,使得图像看起来比较平滑,但是突兀的部分也因此更加明显。因此,这两种还原算法需要配合起来使用才能起到效果,以便于识别为目的,可以使用先还原相差小的部分,并用这个结果作为原图,再还原相差大的部分。如图所示,效果已经综合了上述两种效果的优点。图26原图图27双重还原后的图像233图片的锐化经过图片的降噪处理后会显得比较朦胧,有时候需要进行USM锐化方可实现更好的边缘提取。为此可以先用CVSMOOTH,SMOOTHTYPE选CV_GAUSSIAN进行均值滤波到一个临时图像,然后按一定阈值将原图像与临时图像的像素反差扩大即可,反差扩大的公式为XKX式中,X表示原图像的亮度,表示临时图像的亮度,K表示锐化的强度(K1),XX表示目标图像的亮度。而通过原图像与临时图像的色差的阈值的调整,可以减少一些不需要锐化的区域,但如上所述,会造成边缘突兀和不连续,为此也可以将位于原图像与临时图像的亮度差在阈值内部分的锐化强度,按这个亮度差线性减弱。如图28所示A锐化前B锐化后图28锐化前后的图像比较3手的区域的提取基于计算机视觉的手势识别的首要任务就是要将手和背景区分开,而背景环境往往会十分复杂,前面通过一系列的降噪和锐化实现了冗余信息的剔除和重要信息的强化,从而为之后的工作提供了便利。而这里将讨论如何尽可能准确地将手所在的区域从复杂的背景中提取出来。31肤色种子的获取如图所示,随着不同人之间的差异和光线的变化,以及某些摄像头的自动对光功能,均会导致肤色出现变化,为此,很多时候需要以一种快捷的手段根据现场情况进行调整。从上图中还可以看出,手自身的颜色特别是亮度是有变化的,如果以手的平均颜色作为肤色的种子,将会导致可选择的范围的减少。因此这里采用了在图上手的位置单击某一点,并获得这一点的颜色,用试探法选择到最合适的肤色作为手的颜色种子来跟背景区分开来;同时也提供了用自定义的颜色作为种子来灵活应对。311获取鼠标相对图像位置的颜色要在单击鼠标时获取鼠标相对图像位置的颜色,需要处理这个图像所在控件的点击事件。CSTATIC控件还需要首先将其NOTIFY属性设置成TRUE,以指定这个控件在单击和双击时对父级控件发出通知。要获取鼠标相对于图像的坐标可以通过先获取鼠标的屏幕坐标,再将该坐标转成相对于控件的坐标来实现,如下图。CPOINTPOINT/定义点GETCURSORPOS/获取鼠标在屏幕上的坐标GETDLGITEMIDC_STATIC1SCREENTOCLIENT/获取相对于控件上的坐标图31获取鼠标相对于某个控件的坐标要在单击鼠标时获取鼠标相对图像位置的颜色,需要处理这个图像所在控件的点击事件。CSTATIC控件还需要首先将其NOTIFY属性设置成TRUE,以指定这个控件在单击和双击时对父级控件发出通知。设M_FRAME为IPLIMAGE的图片,SRC为它的IMAGEDATA的开头,则鼠标在图像的坐标(X0,Y0)上的像素指针为MBYTESRCX0M_FRAMENCHANNELSY0M_FRAMEWIDTHSTEP关于这一像素的COLORREF颜色COLOURINTMBYTE00/参数为默认颜色,打开方式(这里是全打开)而通过DLGGETCOLOR的方法可以返回调好的COLORREF颜色。32基于手与背景在一定颜色模型上的区别的初步提取从上所述,肤色在颜色空间的分布相当集中,但会受到光照强度和不同人之间的很大影响。为了减少肤色受照明强度影响,通常将颜色空间从RGB转换到亮度与色度分离的某个颜色空间,比如YUV、LAB或HSL,然后放弃亮度分量。在双色差或色调饱和度平面上,不同人的肤色区别较小,肤色的不同更多在亮度上而不是色度上。7OPENCV中实现上述方法的函数为VOIDCVCVTCOLORCONSTCVARRSRC,CVARRDST,INTCODE,其中SRC输入的是原图像指针,而IPLIMAGE继承了CVARR,有时需要将用整数信息存储的图片转换为一定精度的浮点图;DST输入的是目标图像的指针;CODE是色彩空间转换的模式,该CODE来实现不同类型的颜色空间转换。比如当CODE选用CV_BGR2HSV时,对于8位图,需要将RGB值归一化到01之间。这样得到HSV图中的H取值范围才是0,360,S和V的取值范围是01。由于颜色模型的不同,转换以后的对手的范围的提取方法也有所不同。具体来讲,如果用原始的RGB颜色模型的图片来提取,那么可以用R、G、B三种通道各自与肤色种子的色差的最大值来判定图像上的某点是否在手上;如果用颜色模型为一个亮度通道两个颜色通道的图片,则可以通过先遍历整个图像,把每一点的像素归化到0,255的整数范围中,再将两个颜色通道移到统一的位置进行统一的色差最大值判定,提取的效果如图32所示。图32初步提取轮廓33将手的范围扩展到其他区域在复杂光线条件下,比如图所示的肤色在高光区或阴影区中导致亮度存在不同,有些部分并没有被选上;还有如图所示的情况,由于手在不同位置的代谢情况的不同和指纹关系,导致颜色也存在着不同,从而有些另外的部分也没有被选上。但是从图中又可以看得出,这些区域与选取到的区域之间并不存在明显的边缘,因此可以通过一种多次迭代的方法,将这些区域周边按一定的色差阈值进行扩散,直到扩散了0个像素为止。如图33所示A扩散前B扩散后图33选取扩散前后的对比34外部孤立点的消去经过如上图所示的处理中,可以发现图片中存在一些比较小的一些孤立的区域被选中了,如人的头部,书架、椅子、窗帘等,它们的颜色与手的颜色相近,但是其共同点是都在在手的后面,而且所占的面积比手的要小。为此可以通过获取最大的连通区域的方法来去掉一些不合理的选取,目标效果如图33所示。A消去前B消去后图33外部孤立点的消去目标获取最大的连通区域包括三步获取连通区域的面积并在每个像素标记区域的ID找出面积的最大值和对应的区域ID将面积信息非最大的区域置为未选中。可以通过递归的方法实现以上功能,但由于递归要调用WINDOWS系统的堆栈,而这个堆栈的大小不能超过2M,因此还需要将这个算法实现成非递归的。这里由于栈的大小不会超过整个图片面积的整数倍,因而提供的栈可以选择一个中间的IPLIMAGE作为存储,这就要求这个IPLIMAGE的通道数足够。为此可以选择一个彩色的24位RGB图作为栈来储存当前遍历的位置信息。为此需要将位置的两个值X和Y的坐标通过移位运算的方式压缩在24位长的变量中。整理以上之后,算法可以分以下几步完成。341获取连通区域的面积和标记区域ID当一个点首次到达一个连通区域(未计算)时,即开始计算这个区域的面积,算完该面积后再进去这个区域(已计算)将不会再重新算。计算面积的步骤如下进入堆栈计算面积循环,并将当前坐标压入堆栈。面积计数加一堆栈弹出一格上下左右是否为被选中区域且未被计算读取栈中坐标被选中的相邻节点分别压入堆栈该坐标置为已计算并标记区域ID栈是否为空返回面积计数,结束是否否是图34外部孤立点的消去算法在数据的结构上,将原图像副本信息拷贝后,两个临时图片MEMOPIC和TEMPPIC将分别储存不同的中间信息。MEMOPIC的每个像素的24位整形中,前12位UNSIGNEDCHARA,B表示遍历游标的横坐标INTI,后12位UNSIGNEDCHARB,C表示遍历游标的纵坐标INTJ。其读取和写入的方法如下读取IINTA4JINTCBUCHARICUCHARJTEMPPIC的每个像素的24位整形中,储存像素点遍历的状态0原先未选取;1原先已选取但未参与面积计算;1原先已选取并已参与面积计算,表示区域的ID(从2开始)。342最大面积和对应区域的获取最大面积的获取的语句是IFCOUNTMAXIMAGEDATAITEMPPICNCHANNELSJTEMPPICWIDTHSTEP对应的值是否跟COUNTMAXID的后24位相等即可。35内部孤立点的修补上面的的提取工作已经比较理想了,但是手的内部仍然存在着一些缺失的区域,这会对边缘的检测带来不必要的麻烦。类似地也可以通过第34节建立堆栈的方法来实现,但是要将选区做暂时的反转操作,效果如图34所示。图3内部孤立点的修补4手的关键点的提取经过以上的步骤,我们已经获得了手的像素信息。然而只通过像素信息来判断手势将导致判断过于复杂,不利于应用的实现。为此可以通过提取关键点的方式来给手势识别应用一些简明而稳定的信息。41手的重心和面积的确定手的重心可以通过选取图片(如MEMOPIC)中手的区域的内的X和Y坐标的平均值来实现,而手的面积可以反映手离摄像头的距离。如图41所示图41重心区域(手中央红色区域)42手的边缘的提取手的边缘可以通过像素与其旁边相差的大小来确定,但为了保持边缘的宽度在1像素内,仅需判断这个像素点与其右方和下方的颜色是否相同即可,如图42所示图42边缘提取(手中央红色区域)5程序主体代码的实现51工程的环境和架构手势识别系统GESTURETEST的开发环境采用VISUALC2010,项目类型采用了MFC基于对话框的应用程序,第三方库选用OPENCV作为识别的辅助工具。为此,必须先进行工程环境的配置(1)安装OPENCV20,并在其安装目录下的INCLUDE和LIB下的所有文件复制到CPROGRAMFILESMICROSOFTVISUALSTUDIO100VC下的同名目录中。(2)打开所建立的工程,选择项目GESTURETEST属性,配置选“所有配置”,并在其下的配置属性链接器输入中输入CXCORE200DLIBCV200DLIBHIGHGUI200DLIBADDITIONALDEPENDENCIES(3)将OPENCV安装目录下的BIN目录里的CV200DDLL、CXCORE200DLL、CXCORE200DDLL和HIGHGUI200DDLL复制到项目生成的可执行文件的相同目录下。如果不能运行,则复制该BIN目录里文件名不带D结尾(不含扩展名)的相应文件,并将程序旁DLL文件的文件名后加上D即可。建立的项目主要包含以下文件GESTURETESTHGESTURETESTDLGHRESOURCEHSTDAFXHTARGETVERHGESTURETESTCPPGESTURETESTDLGCPPSTDAFXCPP其中的GESTURETESTDLGCPP,即CGESTURETESTAPP类在INITINSTANCE方法的DLGDOMODEL后需要加上IFDLGM_VIDEONULLCVRELEASECAPTURE用来在程序结束后释放视频指针变量M_VIDEO,否则程序在关闭后无法彻底退出。主要的实现方法将在CGESTURETESTDLG类中实现。52主类成员变量的定义CVCAPTUREM_VIDEO/视频指针IPLIMAGEM_CAPTURED/视频中的图片IPLIMAGEM_FRAME/暂存图片IPLIMAGEM_GRABFRAME/预览图片IPLIMAGEM_TEMP/临时图片BOOLM_FRAMECREATED/暂存图片是否为手动创建的INTSMOOTHMODE/平滑模式INTCENTX/手的重心横坐标INTCENTY/手的重心纵坐标INTZONE/手的面积/IDC_STATIC1(摄像头的图像所画在的控件)的各个属性CDCPDC/设备上下文HDCHDC/设备上下文的句柄CWNDPWND/控件的窗口CRECTRECT/控件的宽高度INTSCREENWID/屏幕宽度INTSCREENHEI/屏幕高度53程序的初始化代码在构造函数中将成员变量和控件变量赋上初始值,并在ONINITDIALOG中进行如图51所示的操作。获取要绘图的控件的HDC和大小获取摄像头获取屏幕分辨率开始计时改变控件大小图51程序的初始化流程并在ONINITDIALOG方法中加入以下代码/获取HDC和控件尺寸PWNDGETDLGITEMIDC_STATIC1PDCPWNDGETDCHDCPDCGETSAFEHDCPWNDGETCLIENTRECTIFHDCNULLMESSAGEBOX“无法获取HDC“RETURNTRUE/获取摄像头IFM_VIDEONULLM_VIDEOCVCREATECAMERACAPTUREM_E01IFM_VIDEONULLMESSAGEBOX“无法打开摄像头“RETURNTRUEINVALIDATETRUEUPDATEWINDOW/获取屏幕分辨率SCREENWIDGETSYSTEMMETRICSSM_CXSCREENSCREENHEIGETSYSTEMMETRICSSM_CYSCREEN/开始计时SETTIMER1,100,NULL/设置装载图片的控件的默认尺寸是640480并且将右边控件位置和窗口大小调到适当位置MOVECONTROLS640,48054从输入控件中获得识别参数从控件中获得参数可以用UPDATEDATATRUE,但当用户输入了一些非数字等不能转换为参数的字符串时,会不断地弹出对话框。为了防止这种情况,处理方式如图53所示,并在ONTIMER方法的开头中加入代码获取弹出的对话框的指针是否获取到对话框获取控件的数据是否因获取失败而弹出了对话框根据控件数据开始识别否否是是返回,不进行识别对话框关闭后控件的值复位并返回图52能防止不断弹出对话框的获取控件信息流程CWNDCWDGFINDWINDOWEXNULL,NULL,NULL,“GESTURETEST“/获取UPDATEDATA自动生成的对话框,标题为工程名CWNDCWDTGETFOREGROUNDWINDOW/获取活动的窗口IFTHISCWDTRETURNIFUPDATEDATATRUE/读取对话框数据/UPDATEDATAFALSECDIALOGEXONTIMERNIDEVENTRETURN55总体识别语句的实现总体识别的步骤包括中值滤波、均值滤波、细节还原和锐化等图像的初步润饰操作,也包括了选取的提取和扩散操作,还有孤立点去除和关键信息的提取,代码在ONTIMER方法中的获取控件信息的语句之后。在识别的过程中,需要对识别的每一步结果分别进行呈现,为此需要进行适当的流程控制,并选择适当的IPLIMAGE图片画到控件中。而后面的应用实现的代码将被写在总体识别的语句之后。INTCOLOURMAX0/最大色差BOOLPRESHOWFALSE/显示M_FRAMEIFSMOOTHMODE1CVSMOOTHM_FRAME,M_GRABFRAME,CV_MEDIAN,2M_E111,0,0,0/中值滤波ELSEIFSMOOTHMODE2CVSMOOTHM_FRAME,M_GRABFRAME,CV_GAUSSIAN,2M_E111,2M_E111,0,0/均值滤波IFSMOOTHMODE0BLURFIXFILTERM_FRAME,M_GRABFRAME,M_E12,M_E13/滤波后的有限还原IFM_C1TRUERUIHUAFILTERM_FRAME,M_GRABFRAME,M_ERHSL,M_ERHBJ,0/锐化CVCOPYM_GRABFRAME,M_FRAMEIFM_R11PRESHOWTRUE/显示M_GRABFRAMECOLOURSELECTM_FRAME,M_GRABFRAME,M_E21,M_E22,M_E23,M_C2TRUE,FALSE/按肤色种子选取和扩散IFM_R12PRESHOWTRUE/显示M_GRABFRAMEAREACUTM_GRABFRAME,M_TEMP/消除手区域外的孤立点CVNOTM_GRABFRAME,M_TEMPAREACUTM_TEMP,M_GRABFRAME,TRUE/消除手区域内的孤立点CVNOTM_TEMP,M_GRABFRAMEIFM_R13PRESHOWTRUE/显示M_GRABFRAMEINTJOINTSGETJOINTSM_GRABFRAME/获取重心坐标和手的面积CENTXJOINTS0CENTYJOINTS1ZONEJOINTS2DRAWTOHDCPRESHOWM_GRABFRAMEM_FRAME/将IPLIMAGE的图片画到控件中6应用设计61屏幕画图的设计在屏幕上画图的功能可借助CWINDOWDC并定义和设置笔刷,然后在CWINDOWDC中调用MOVETO和LINETO的方法来实现。611获取CWINDOWDCCWNDPWNDWCWNDGETDESKTOPWINDOW/获取桌面窗口CWINDOWDCWINDCPWNDW/创建桌面窗口的设备上下文CWINDOWDCPWINDC/获取桌面窗口设备上下文的指针612定义和设置笔刷CPENPENT/定义笔刷PENTCREATEPENPS_SOLID,1,RGB255,0,0/创建红色笔刷CPENPEN/获取笔刷指针613绘图语句定义一个数组INTPOS4用来储存手的重心位置,偶数下标表示横坐标,奇数坐标表示纵坐标;用INTPOSLENG来储存POS手的重心的存储情况。POSLENG0时没有储存手的位置;或只储存了一个手的初始位置POS2,POS3,可作为今后的前一点,但不能画线;POSLENG2时,POS0,POS1是上一点坐标,POS2,POS3是当前点,可以用来画线,绘图结果如图61所示。IFPOSLENG0/储存上一点坐标POS0POS2POS1POS3/更新当前坐标POS2CENTXPOS3CENTYIFPOSLENG0/将手的坐标转为屏幕坐标并画图PWINDCMOVETOSCREENWIDSCREENWID/WIDPOS0,SCREENHEI/HEIPOS1PWINDCLINETOSCREENWIDSCREENWID/WIDPOS2,SCREENHEI/HEIPOS3ELSEPOSLENG2图61屏幕画图效果62模拟鼠标功能的实现模拟鼠标的功能可以通过SETCURPOSX,Y与MOUSE_EVENTMOUSEEVENTF_LEFTUP/MOUSEEVENTF_LEFTDOWN,0,0,0,0的连用来实现,但由于摄像头的分辨率往往小于屏幕的分辨率,造成精确度不高。为此可以通过手在图像上的离摄像头中心远,产生鼠标移动的增量来实现。而为了交互的的自然性,鼠标是否按下用手离摄像头的远近,即手在图中的面积来实现,效果如图62所示。图62模拟鼠标效果621手的有效偏移量的获取DOUBLEXRATE10DOUBLECENTX/WID/将手的坐标归化到0,1区间内并将横坐标镜像DOUBLEYRATEDOUBLECENTY/HEI/将手的坐标归化到0,1区间内并将横坐标镜像DOUBLEMOVERMIN0/手在X和Y位于05MOVERMIN,05MOVERMIN的矩形内鼠标不动,有效偏移量手离重心的距离MOVERMIN。DOUBLEMOVEMENTX0/有效偏移量的横坐标DOUBLEMOVEMENTY0/有效偏移量的纵坐标IFXRATE05MOVERMINMOVEMENTXINTXRATE05MOVERMIN/获取手的有效偏移量ELSEIFXRATE05MOVERMINMOVEMENTYINTYRATE05MOVERMINELSEIFYRATE015MOUSE_EVENTMOUSEEVENTF_LEFTDOWN,0,0,0,0/手的面积较大则执行鼠标按下指令ELSEMOUSE_EVENTMOUSEEVENTF_LEFTUP,0,0,0,0/手的面积较小则执行鼠标抬起指令7手势识别的综合测试在手势识别的测试工作中,中值滤波、均值滤波和还原的表现结果比较稳定,锐化的效果也比较显著。这些能够实时而有效地对摄像机的视频进行加工。背景的消除算法可以在对几个高低端的摄像头的不太强的光线的测试下顺利完成。经过测试发现,当手的区域因为不连贯而缺失时可以通过中值滤波的还原的算法来完成;而当手的区域跟背景其他地方相连时,使用较高缩放系数锐化操作可以有效地让将这些区域排除,但可能会增加手的区域的不完整性,如图71、图72所示。A中值滤波前B中值滤波后图71中值滤波对识别结果的比较锐化前锐化后图72锐化对识别结果的比较在手的关键信息的获取中,手的重心会有时会有一些突然移动的情况,为此需要对此进行一些屏蔽。结论总结本系统针对不同摄像头成像的情况,根据实际情况,采用VISUALC和OPENCV进行开发,而手势识别的工作也实现了包括了图像的采集、噪声处理和清晰化,手的区域的提取,以及手的关键点的获取,并根据结果开发一些常见的应用。能够在大部分摄像头的情况下方便人们对计算机的交互操作。图像的采集实现了所有连接且支持的摄像头都能使用的功能,使得有内置摄像头的机器能够用外置摄像头进行识别
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河北省唐海县2025年上半年公开招聘城市协管员试题含答案分析
- 河北省黄骅市2025年上半年公开招聘辅警试题含答案分析
- 2025年户外照明灯具研发生产与市场推广合作协议
- 2025版企业搬迁过程中员工培训与服务合同
- 2025岑瑾与配偶共同债务处理及财产分配离婚协议
- 2025年智能房产租赁居间服务合作协议
- 2025年新型环保材料边坡支护及护壁桩工程合同
- 2025年二手房购房合同房屋产权归属与登记手续
- 2025年度房地产居间代理服务合同
- 2025版水泥产品定制化生产购销合同模板
- 2024-2025学年华东师大版8年级下册期末试卷附完整答案详解【名校卷】
- 2025年保密观知识竞赛试题及答案
- 2025年公安机关人民警察招录面试专项练习含答案
- 2025年秋季第一学期开学典礼校长致辞:在历史的坐标上接好时代的接力棒(1945→2025→未来:我们的责任接力)
- 2025年高考语文全国一卷试题真题及答案详解(精校打印)
- 附录E-IATF16949条款过程对照表
- 第三届韬奋杯全国出版社青编校大赛校对试题(已编辑)
- 关于BT项目主要法律规定
- OTN技术概述PPT课件
- 银发【2007】246号
- 出售房屋委托书 二手房出售房屋委托书.doc
评论
0/150
提交评论