版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本科毕业设计(论文) 基于单目手势识别交互系统的设计与实现学 院 机电工程学院 专 业 数字媒体技术 基于单目手势识别交互系统的设计与实现 李林钢 机电工程学院摘 要随着计算机技术的逐渐发展,出现了一些符合人的习惯的人机交互技术。其中,手势的检测和识别技术作为一种有着自然性、简洁性和直接性的一种新型的交互方式,是这些交互技术当中倍受重视的研究和应用的技术之一。近几年来,已经有相当一部分的应用采用了这种手势识别的方式作为跟机器交互的手段,受到了世界各个国家的科研机构和科技企业的重视与青睐。基于计算机视觉的手势识别需要解决一系列的问题。首先是要做到的是从背景中将手分割出来;然后将有用的信息与冗余的
2、信息分离开来,并将相关的手势信息提取出来;最后从相同的手势中根据实际情况,解读出它的特定的含义。针对这些问题,本文讨论里一种采用基于单目的特定颜色模型的背景分离方法和基于关键信息的手势提取方法,用visual c+ 2010和opencv进行开发,实现在多种摄像头下的手势识别交互系统,主要包括以下方面:(1)针对不同摄像头画质的缺陷,采用中值滤波或均值滤波然后还原细节的方法实现图像较好的降噪,再用不同采样半径的usm锐化的方式实现图像信息的强化。(2)根据人手和背景色相等方面的差异,采用亮度+两个颜色通道的色彩模型进行色彩分离,并将未选择到的阴影和高光等区域利用连续色的原理进行进一步的选取。(
3、3)根据选取结果有很多干扰区域的情况,实现最大面积连通区域的提取算法,以排除关键信息提取时的干扰。(4)根据手的区域的情况和交互的自然性,采用稳定的手的重心作为手的位置,利用近大远小的关系,采用手占摄像头面积的大小判断手离摄像头的距离。(5)针对以上识别的结果,实现了一些常见的人机交互应用,包括屏幕画图器、鼠标模拟器等。关键词:手势识别;visual c+;背景消除;连通区域;关键信息提取abstractwith the development of computer technology, some human-computer interaction techniques which me
4、et peoples habits appear. among them, gesture detection and recognition technology, as a new natural, simple and direct technology, is highly valued. in recent years, there have been considerable part of the application using this gesture recognition approach as a means of an interaction with the ma
5、chine, and it draws attention of and was favored by the scientific research and technology enterprises of various countries.computer vision-based gesture recognition needs to solve a series of problems. the first is is how to split the hand from the background; then separate the useful information a
6、nd redundant one, and extract the relevant information gesture; finally, decipher the specific meaning of the same gesture in accordance with the actual situation. to solve these problems, this paper discusses a gesture recognition interactive system with a kind of background separation methods base
7、d on specific color model, and a kind of gesture extraction method on key information, developed by visual c + + 2010 and opencv, fits a variety of camera, which includes the following aspects:(1) for different quality defects among cameras, this system uses median filter or mean filter and restores
8、 the detail method to reduce the image noise conservatively. then use different sampling radius of usm sharpening to enhance the image information.(2) according to the difference of colors between background and hands, this system uses the brightness and the two color channels as a color model for c
9、olor separation. the not chosen distinct, such as the shadow and highlight areas will be further selected using a continuous color method.(3) according to the results there are a lot of interfering regions of selected areas. the system achieves the maximum connected area region extraction algorithm,
10、 which excludes the interference of the key information extraction.(4) according to the hand region of the case and for the naturalist interactive, the system uses the stable point - gravity center of the hand as the hand position, and uses the size of the hand to know the distance from the area wit
11、h the near-far smaller principle.(5) according to the results above, the system achieves some common interactive applications, including screen drawing control, mouse simulator, etc.key words: gesture recognition; visual c+; background removal; connected region; key information extraction目 录1 绪论11.1
12、 手势识别交互的背景11.2 手势及识别方式的分类21.3 基于计算机视觉的手势识别技术需要解决的问题21.4 本程序主要实现的功能32 摄像头信息的采集和预处理52.1 opencv关于摄像头操作的api52.2 在控件中呈现有关摄像头的图像62.2.1 hdc的获取62.2.2 将iplimage*位图渲染到控件当中62.3 摄像头图像的预处理72.3.1 图片的缩放72.3.2 图片的降噪82.3.3 图片的锐化113 手的区域的提取133.1 肤色种子的获取133.1.1 获取鼠标相对图像位置的颜色133.1.2 自定义肤色种子143.2 基于手与背景在一定颜色模型上的区别的初步提取1
13、43.3 将手的范围扩展到其他区域153.4 外部孤立点的消去163.4.1 获取连通区域的面积和标记区域id183.4.2 最大面积和对应区域的获取193.5 内部孤立点的修补194 手的关键点的提取214.1 手的重心和面积的确定214.2 手的边缘的提取215 程序主体代码的实现235.1 工程的环境和架构235.2 主类成员变量的定义245.3 程序的初始化代码245.4 从输入控件中获得识别参数265.5 总体识别语句的实现286 应用设计306.1 屏幕画图的设计306.1.1 获取cwindowdc306.1.2 定义和设置笔刷306.1.3 绘图语句306.2 模拟鼠标功能的实
14、现316.2.1 手的有效偏移量的获取326.2.2 鼠标点击功能的实现327 手势识别的综合测试34结论36总结36展望与改进36参考文献38致谢391 绪论1.1 手势识别交互的背景随着整个社会逐步的信息化,带给了我们一种新的交互方式人机交互(human-computer interaction)。而这一交互活动越来越成为人们日常生活的一个重要内容。近几年来,随着计算机技术的逐渐发展,出现了一些符合人的习惯的人机交互技术,如头部跟踪、人脸识别、表情识别、唇读、体势识别以及手势识别等等1,并逐步向以人为本的方向迈进。其中,手势的检测和识别技术作为一种新型的方式,是这些交互技术当中倍受重视的研
15、究和应用的技术之一。手势是一种有着自然性、简洁性和直接性的一种人机交互手段。1如果能只用人手作为计算机的输入设备,那么我们就无需学习其他繁重的硬件设备的操作,仅需根据人们的习惯,确定一些适当的手势,即可用简单的方式控制机器。而手势是人的一种很常用的交流方式。像人可以用手指的方向来表示物体的位置,用挥手来表示过来或再见,用一定的手势表示数字等等2。近几年来,已经有相当一部分的应用采用了这种手势识别的方式作为跟机器交互的手段。受到了世界各个国家的科研机构和科技企业的重视与青睐,如ieee自1995年起召开的人脸与姿势自动检测年会fg(ieee conference on automatic fac
16、e and gesture recognition)以促进包括手势检测识别技术在内的技术交流与发展。2图1.1 手势识别应用1.2 手势及识别方式的分类手势(gesture)本身具有多义性和多样性,由于领域、文化背景等的不同,对手势的定义也会不同。这里把手势定义为:手势是人手产生的各种姿势和动作,手势和姿势(posture)的主要区别在于姿势更为强调身体的总体形态而手势更强调手的细节。1手势按时间关系可分为静态手势(指姿态,又称手形)和动态手势(指动作,由一系列姿态组成)。静态手势对应时间上的一个点,而动态手势对应着一段时间内的一条轨迹,需要使用随时间变化的空间特征来表述3。动态手势具有丰富和
17、直观的表达能力,与静态手势结合在一起,能创造出更丰富的语义。按手势目的又可以分为操控手势和交际手势10。在人机交互系统中,操控手势的一种典型应用就是在二维和三维的虚拟环境中来操控物体。交流手势主要是指在自然环境中伴随人们自然对话的自由形式手势。手势相对于语言来说是一种表达人们想法的单独的补充模式。在对话中与手势相关联的信息是一种语句的时间和空间结构,可以用机器来提取它们11。手势的识别方式可分为利用机械装置的识别和基于计算机视觉的识别。机械装置,如数据手套是虚拟现实中重要组成部分,可以将手指的复杂的三维位置和动作利用附着的感应器传到到计算机当中去。然后可以重新呈现手部动作。数据手套传感的识别方
18、法的技术关键是手套能不能将手指、手掌、手腕的弯曲真实的以数据形势反演到系统数据库中,让系统根据模型对手势进行有效识别。由于手部软组织和计算复杂性,数据手套的计算速度总是存在延时,同时从人机交互的角度手套佩戴也十分不方便。如果多人使用还存在卫生等问题4,再加上这些传感器昂贵的价格,因此数据手套等机械识别的方式在推广上会受到很多的障碍。近些年来,基于计算机视觉的识别方法提供了一种成本较低的能减少用户限制的手势识别的方法,这种方法也是本系统的主攻方向。在基于计算机视觉的识别方式中,通常的做法就是把手势识别问题看成模式识别问题来对待。通过摄像头等设备来获取图像或视频,再把它们分解成特征集,然后用这些特
19、征集与预先定义好的模式进行匹配。1.3 基于计算机视觉的手势识别技术需要解决的问题无论是利用数据手套还是用手部粘贴高亮标签使作为输入设备会给使用者带来不舒适感如出汗等,且设备价格昂贵,难以推广。在上述研究的基础上,研究者渐渐把研究的重心转移到的不佩戴手套或不粘贴设备的自然手识别检测技术之上,以追求使用者更舒适的体验,其中从计算机视觉的研究方式入手是当前比较主流的研究方向,然而实现起来难度更大。首先是要做到的是从背景中将手分割出来,通常会用肤色分割的方法基于皮肤的色调将不同于周围背景手的区域分离出来但是会受到光线等因素干扰,分离出手后需要用合适的模型对手的动作建模。之后从模型中估算出参数,根据估
20、算出的参数对手势进行分类,得出结论。由于在数据采集时容易受到背景干扰,往往要求背景颜色和手的颜色有较好的区分度。4其次人体由多个部分组成,其中手指往往包含丰富的信息,而头和手臂所以及人手本身因光滑而产生的大量阴影等信息则大多为冗余信息,故如何将有用的信息与冗余的信息分离也是提高手势识别能力的关键。再次,人手是弹性物体,同样的手势的表现效果可能差别很大5,并且同样的用户者要重复做出完全相同的手势也是不可能的,如何降低甚至消除这个因素的影响对整个识别的准确率也有一定影响。最后,手势往往具有复杂、多重的含义,单一的方法很难准确地解读人手的具体内涵进而实现最终的识别,故需要综合多种方法。6针对上面提到
21、的多种难题,不同的研究和开发人员提出了许多种不一样的方案。综合以上,本文将提出一种能适应各种摄像头的,能抵抗一定干扰信息的一种基于计算机视觉的进行手势识别解决方案。1.4 本程序主要实现的功能(1)实现对摄像头的发现和选取,与对每一帧图像的采集和缩放。(2)实现对图像的清晰化,包括点状噪声的去除、细节的还原以及之后整体的锐化。(3)实现对背景信息的剔除,包括对肤色的提取和分割,对阴影和高光区域的扩散和对一些孤立点的剔除。(4)实现关键信息,如手的重心、手的远近(手的面积)等的确定。(5)利用以上关键信息,实现一些应用。为了保证软件的实时性,同时便于以上功能的实现,开发工具选用visual c+
22、 2010,第三方类库采用opencv2.0来完成这项工程。2 摄像头信息的采集和预处理2.1 opencv关于摄像头操作的api要进行手势信息的获取,首先需要拥有一定的硬件,如数据手套、摄像头等。对于软件方面则要安装相应的驱动程序和了解它们的api。幸好opencv提供了一系列通用而且简洁的外部接口以便于实现以上的工作,对摄像头操作代码流程如图2.1所示:m_video=cvcreatecameracapture(i);/获取第i个摄像头信息给视频指针cvcapture *m_video;/定义视频指针m_video;/视频指?针?m_video=cvcreatecameracapture(
23、-1);/获取任一个摄像头信息给视频指针提示错误并退出程序m_video!=null/是否找到摄像头iplimage* m_captured=cvqueryframe(m_video);/获取当前摄像头图片,不能用cvreleaseimage手动释放图片内存。进行关于m_captured和它以前的副本的图像处理和应用用户手动退出?cvreleasecapture(&(dlg.m_video);/释放视频指针结束 延迟一定的时间hijian 开始hi= 否是否是图2.1 摄像头启动和释放的代码流程在实际的应用当中,当用户拥有多个摄像头时,cvcreatecameracapture方法的参数应该取
24、零或正整数,来选择不同编号的摄像头。当找不到该摄像头时,可以自动选择成默认的摄像头,一般来说是第0号摄像头,仍未找到才进行错误退出。2.2 在控件中呈现有关摄像头的图像为了便于观察,需要将摄像头的源数据或数据的处理情况呈现到控件中,而mfc类库和opencv共同提供了这些方法。2.2.1 hdc的获取mfc的cdc(设备上下文)和它对应的句柄hdc提供了一系列有关画图的方法,对于一个有一定id(如idc_static1)的控件来说,获取的方法如下:cwnd *pwnd = getdlgitem(idc_static1);cdc *pdc =pwnd-getdc();hdc hdc= pdc-g
25、etsafehdc();if (hdc=null)messagebox(无法获取hdc!);return true;这里将id为idc_static1的控件通过pwnd获取控件本身的窗口信息,然后通过这个pwnd来获得有关设备的上下文cdc和hdc,获取不到则出现错误对话框并退出。如果已经设置了控件的control类型的变量(如m_s1),则cdc和hdc可以通过这个变量直接获取:cdc *pdc =m_s1.getdc();hdc hdc= pdc-getsafehdc();2.2.2 将iplimage*位图渲染到控件当中opencv的iplimage*类型的图片渲染到控件的hdc前需要得
26、到它的头部信息,这需要开辟一段内存并将它的结构体提取出来,然后分别赋值:static uchar buffersizeof(bitmapinfoheader) + 1024; bitmapinfo* bmi = (bitmapinfo*)buffer;bitmapinfoheader* bmih = &(bmi-bmiheader);memset( bmih, 0, sizeof(*bmih); bmih-bisize = sizeof(bitmapinfoheader); bmih-biwidth = image-width; bmih-biheight = image-origin ? a
27、bs(image-height) : -abs(image-height); bmih-biplanes = 1; bmih-bibitcount = (unsigned short)(image-depth & 255)*image-nchannels); bmih-bicompression = bi_rgb;其中image变量是iplimage*的实例。之后调用mfc的setdibitstodevice方法,参数为(hdc, 0, 0, image-width, image-height, 0, 0, 0, image-height, image-imagedata ,bmi, dib_
28、rgb_colors),即可将opencv的iplimage*画入到hdc为hdc的控件中。但其后不能执行pdc-invalidate()操作,否则原先画的结果会被清空。2.3 摄像头图像的预处理由于摄像头的图像尺寸千变万化,不一定能满足手的关键点位置的精准度或者图片太大造成延迟和卡顿,而且可能包含了大量的阻碍识别的信息(如点状噪声等),因而需要一些预处理工作。2.3.1 图片的缩放图片需要缩放到一个合理的大小,如320x240,为了加强精确度有条件的可以加到640x480。opencv提供了一个函数cvresize可以实现这个功能。如原iplimage*图片是m_captured,目标图片是
29、m_frame,则函数可写成:cvresize(m_captured,m_frame,(m_captured-width)(m_frame-width)?cv_inter_linear:cv_inter_area);当原图片比目标图片小时应使用双线性或双三次插值的放大算法,来使得手的运动轨迹连续变化,反之,则采用平均值的缩小算法,来减少波纹和边缘的不连续现象。2.3.2 图片的降噪噪声可以理解为“妨碍人和传感器对所接收的信源信息理解的因素”。而图像中各种妨碍信息接受的因素即可称为图像噪声。噪声被定义为“不可预测而只能用概率统计的方法,来认识的随机误差”。图片噪声按产生的原因可分为外部噪声和内部
30、噪声。外部噪声是指由于系统外部干扰以电磁波或由电源串进系统内部而引起的噪声。如电气设备,天体放电现象等引起的噪声,而这种噪声可能就是高斯噪声、脉冲噪声等多个噪声合成累计的。内部噪声主要是由光和电的基本性质所引起的噪声。如电流的产生是由空穴或电子的集合,定向运动所形成的,而这些粒子运动的带有随机性,产生了散粒噪声;而导体中也有自由电子,它们会进行无规则热运动,形成热噪声。为了消除这些随机因素,可以通过中值滤波或均值滤波的方法法进行滤波。对应的opencv函数是:void cvsmooth( const cvarr* src, cvarr* dst,int smoothtype=cv_gaussi
31、an,int param1=3, int param2=0, double param3=0 ,double param4=0)。其中smoothtype 是cv_gaussian时将对图像进行大小为 param1param2 的高斯卷积的均值滤波。而 smoothtype 是cv_median时将对图像进行大小为param1param1 的中值滤波,注意为param1奇数,且不大于7,其效果结果如下图所示:(a)原图 (b) cv_gaussian (c) cv_median图2.2 cvsmooth的不同smoothtype的比较可以看出,中值滤波对边缘的保留效果较强,但实际执行的速度较慢
32、。不过这些降噪变换都会导致有效细节的丢失。为此可以将图片用按一定阈值还原,这分为两种方法还原与原图像相差小的部分和与还原原图像相差大的部分,为了保持还原后的连续性,可以设置成不在符合阈值内的图像的保留度再按跟还原原图像相差值线性变化,其效果如图2.3至图2-6所示:图2.3 中值滤波后的图形图2.4 原图图2.5 低阈值保留后的图形图2.5 高阈值保留后的图形从上图可以看出,还原与原图像相差小的部分可以消除一些突兀的部分,可称为椒盐噪声,使得图像看起来比较柔和,但形体内部的与原图像相差小斑纹仍然存在;而还与原原图像相差大的部分则可以让形体内部的斑纹大大减弱或消失,使得图像看起来比较平滑,但是突
33、兀的部分也因此更加明显。因此,这两种还原算法需要配合起来使用才能起到效果,以便于识别为目的,可以使用先还原相差小的部分,并用这个结果作为原图,再还原相差大的部分。如图所示,效果已经综合了上述两种效果的优点。图2.6 原图 图2.7 双重还原后的图像2.3.3 图片的锐化经过图片的降噪处理后会显得比较朦胧,有时候需要进行usm锐化方可实现更好的边缘提取。为此可以先用cvsmooth,smoothtype选cv_gaussian进行均值滤波到一个临时图像,然后按一定阈值将原图像与临时图像的像素反差扩大即可,反差扩大的公式为:式中,x表示原图像的亮度,表示临时图像的亮度,k表示锐化的强度(k1),x
34、表示目标图像的亮度。而通过原图像与临时图像的色差的阈值的调整,可以减少一些不需要锐化的区域,但如上所述,会造成边缘突兀和不连续,为此也可以将位于原图像与临时图像的亮度差在阈值内部分的锐化强度,按这个亮度差线性减弱。如图2.8所示:(a)锐化前 (b)锐化后图2.8 锐化前后的图像比较3 手的区域的提取基于计算机视觉的手势识别的首要任务就是要将手和背景区分开,而背景环境往往会十分复杂,前面通过一系列的降噪和锐化实现了冗余信息的剔除和重要信息的强化,从而为之后的工作提供了便利。而这里将讨论如何尽可能准确地将手所在的区域从复杂的背景中提取出来。3.1 肤色种子的获取如图所示,随着不同人之间的差异和光
35、线的变化,以及某些摄像头的自动对光功能,均会导致肤色出现变化,为此,很多时候需要以一种快捷的手段根据现场情况进行调整。从上图中还可以看出,手自身的颜色特别是亮度是有变化的,如果以手的平均颜色作为肤色的种子,将会导致可选择的范围的减少。因此这里采用了在图上手的位置单击某一点,并获得这一点的颜色,用试探法选择到最合适的肤色作为手的颜色种子来跟背景区分开来;同时也提供了用自定义的颜色作为种子来灵活应对。3.1.1 获取鼠标相对图像位置的颜色要在单击鼠标时获取鼠标相对图像位置的颜色,需要处理这个图像所在控件的点击事件。cstatic控件还需要首先将其notify属性设置成true,以指定这个控件在单击
36、和双击时对父级控件发出通知。要获取鼠标相对于图像的坐标可以通过先获取鼠标的屏幕坐标,再将该坐标转成相对于控件的坐标来实现,如下图。cpoint point;/定义点getcursorpos(&point);/获取鼠标在屏幕上的坐标getdlgitem(idc_static1)-screentoclient(&point);/获取相对于控件上的坐标图3-1 获取鼠标相对于某个控件的坐标要在单击鼠标时获取鼠标相对图像位置的颜色,需要处理这个图像所在控件的点击事件。cstatic控件还需要首先将其notify属性设置成true,以指定这个控件在单击和双击时对父级控件发出通知。设m_frame为ipl
37、image*的图片,src为它的imagedata的开头,则鼠标在图像的坐标(x0,y0)上的像素指针为mbyte=src+x0*(m_frame-nchannels)+y0*(m_frame-widthstep);关于这一像素的colorref颜色:colour=(int)mbyte016|(int)mbyte1=0 & x0width | y0=0 & y0height)3.1.2 自定义肤色种子自定义种子颜色可以用ccolordialogwindows自带的调色对话框来实现,然后将其写入到控件中即可实现,它的构造方法是:ccolordialog dlg(colour0,cc_fullop
38、en);/参数为默认颜色,打开方式(这里是全打开)而通过dlg.getcolor()的方法可以返回调好的colorref颜色。3.2 基于手与背景在一定颜色模型上的区别的初步提取从上所述,肤色在颜色空间的分布相当集中,但会受到光照强度和不同人之间的很大影响。为了减少肤色受照明强度影响,通常将颜色空间从rgb转换到亮度与色度分离的某个颜色空间,比如yuv、lab或hsl,然后放弃亮度分量。在双色差或色调饱和度平面上,不同人的肤色区别较小,肤色的不同更多在亮度上而不是色度上。7opencv中实现上述方法的函数为void cvcvtcolor( const cvarr* src, cvarr* ds
39、t, int code ),其中src输入的是原图像指针,而iplimage继承了cvarr,有时需要将用整数信息存储的图片转换为一定精度的浮点图;dst输入的是目标图像的指针;code是色彩空间转换的模式,该code来实现不同类型的颜色空间转换。比如当code选用cv_bgr2hsv时,对于8位图,需要将rgb值归一化到0-1之间。这样得到hsv图中的h取值范围才是0,360),s和v的取值范围是0-1。由于颜色模型的不同,转换以后的对手的范围的提取方法也有所不同。具体来讲,如果用原始的rgb颜色模型的图片来提取,那么可以用r、g、b三种通道各自与肤色种子的色差的最大值来判定图像上的某点是否
40、在手上;如果用颜色模型为一个亮度通道+两个颜色通道的图片,则可以通过先遍历整个图像,把每一点的像素归化到0,255的整数范围中,再将两个颜色通道移到统一的位置进行统一的色差最大值判定,提取的效果如图3.2所示。图3.2初步提取轮廓3.3 将手的范围扩展到其他区域在复杂光线条件下,比如图所示的肤色在高光区或阴影区中导致亮度存在不同,有些部分并没有被选上;还有如图所示的情况,由于手在不同位置的代谢情况的不同和指纹关系,导致颜色也存在着不同,从而有些另外的部分也没有被选上。但是从图中又可以看得出,这些区域与选取到的区域之间并不存在明显的边缘,因此可以通过一种多次迭代的方法,将这些区域周边按一定的色差
41、阈值进行扩散,直到扩散了0个像素为止。如图3.3所示(a)扩散前(b)扩散后图3.3 选取扩散前后的对比3.4 外部孤立点的消去经过如上图所示的处理中,可以发现图片中存在一些比较小的一些孤立的区域被选中了,如人的头部,书架、椅子、窗帘等,它们的颜色与手的颜色相近,但是其共同点是都在在手的后面,而且所占的面积比手的要小。为此可以通过获取最大的连通区域的方法来去掉一些不合理的选取,目标效果如图3.3 所示。(a)消去前(b)消去后图3.3 外部孤立点的消去目标获取最大的连通区域包括三步:获取连通区域的面积并在每个像素标记区域的id找出面积的最大值和对应的区域id将面积信息非最大的区域置为未选中。可
42、以通过递归的方法实现以上功能,但由于递归要调用windows系统的堆栈,而这个堆栈的大小不能超过2m,因此还需要将这个算法实现成非递归的。这里由于栈的大小不会超过整个图片面积的整数倍,因而提供的栈可以选择一个中间的iplimage作为存储,这就要求这个iplimage的通道数足够。为此可以选择一个彩色的24位rgb图作为栈来储存当前遍历的位置信息。为此需要将位置的两个值x和y的坐标通过移位运算的方式压缩在24位长的变量中。整理以上之后,算法可以分以下几步完成。3.4.1 获取连通区域的面积和标记区域id当一个点首次到达一个连通区域(未计算)时,即开始计算这个区域的面积,算完该面积后再进去这个区
43、域(已计算)将不会再重新算。计算面积的步骤如下:进入堆栈计算面积循环,并将当前坐标压入堆栈。面积计数加一堆栈弹出一格上下左右是否为被选中区域且未被计算读取栈中坐标被选中的相邻节点分别压入堆栈该坐标置为已计算并标记区域id栈是否为空返回面积计数,结束是否否是图3.4 外部孤立点的消去算法在数据的结构上,将原图像副本信息拷贝后,两个临时图片memopic和temppic将分别储存不同的中间信息。memopic的每个像素的24位整形中,前12位(unsigned char a,b)表示遍历游标的横坐标(int i),后12位(unsigned char b,c)表示遍历游标的纵坐标(int j)。其
44、读取和写入的方法如下:读取:i=(int)a4;j=(int)c&15)4&255); b=(uchar)(i&15)8&15);c=(uchar)(j&255);temppic的每个像素的24位整形中,储存像素点遍历的状态:0:原先未选取;1:原先已选取但未参与面积计算;1:原先已选取并已参与面积计算,表示区域的id(从2开始)。3.4.2 最大面积和对应区域的获取最大面积的获取的语句是if(countmaximagedata)+i*(temppic-nchannels)+ j*(temppic-widthstep)对应的值是否跟countmaxid的后24位相等即可。3.5 内部孤立点的修
45、补上面的的提取工作已经比较理想了,但是手的内部仍然存在着一些缺失的区域,这会对边缘的检测带来不必要的麻烦。类似地也可以通过第3.4节建立堆栈的方法来实现,但是要将选区做暂时的反转操作,效果如图3.4所示。图3. 内部孤立点的修补4 手的关键点的提取经过以上的步骤,我们已经获得了手的像素信息。然而只通过像素信息来判断手势将导致判断过于复杂,不利于应用的实现。为此可以通过提取关键点的方式来给手势识别应用一些简明而稳定的信息。4.1 手的重心和面积的确定手的重心可以通过选取图片(如memopic)中手的区域的内的x和y坐标的平均值来实现,而手的面积可以反映手离摄像头的距离。如图4.1所示:图4.1
46、重心区域(手中央红色区域)4.2 手的边缘的提取手的边缘可以通过像素与其旁边相差的大小来确定,但为了保持边缘的宽度在1像素内,仅需判断这个像素点与其右方和下方的颜色是否相同即可,如图4.2所示:图4.2 边缘提取(手中央红色区域)5 程序主体代码的实现5.1 工程的环境和架构手势识别系统gesturetest的开发环境采用visual c+ 2010,项目类型采用了mfc基于对话框的应用程序,第三方库选用opencv作为识别的辅助工具。为此,必须先进行工程环境的配置:(1)安装opencv2.0,并在其安装目录下的include和lib下的所有文件复制到c:program filesmicro
47、soft visual studio 10.0vc下的同名目录中。(2)打开所建立的工程,选择项目-gesturetest属性,配置选“所有配置”,并在其下的配置属性-链接器-输入中输入cxcore200d.lib;cv200d.lib;highgui200d.lib;%(additionaldependencies)(3)将opencv安装目录下的bin目录里的cv200d.dll、cxcore200.dll、cxcore200d.dll和highgui200d.dll复制到项目生成的可执行文件的相同目录下。如果不能运行,则复制该bin目录里文件名不带d结尾(不含扩展名)的相应文件,并将程序
48、旁dll文件的文件名后加上d即可。建立的项目主要包含以下文件:gesturetest.hgesturetestdlg.hresource.hstdafx.htargetver.hgesturetest.cppgesturetestdlg.cppstdafx.cpp其中的gesturetestdlg.cpp,即cgesturetestapp类在initinstance()方法的dlg.domodel后需要加上if(dlg.m_video!=null)cvreleasecapture(&(dlg.m_video);用来在程序结束后释放视频指针变量m_video,否则程序在关闭后无法彻底退出。主要的
49、实现方法将在cgesturetestdlg类中实现。5.2 主类成员变量的定义cvcapture * m_video;/视频指针iplimage* m_captured;/视频中的图片iplimage* m_frame;/暂存图片iplimage* m_grabframe;/预览图片iplimage* m_temp;/临时图片bool m_framecreated;/暂存图片是否为手动创建的int smoothmode;/平滑模式int centx;/手的重心横坐标int centy;/手的重心纵坐标int zone;/手的面积/idc_static1(摄像头的图像所画在的控件)的各个属性cd
50、c *pdc;/设备上下文hdc hdc; /设备上下文的句柄cwnd *pwnd;/控件的窗口crect rect;/控件的宽高度int screenwid;/屏幕宽度int screenhei; /屏幕高度5.3 程序的初始化代码在构造函数中将成员变量和控件变量赋上初始值, 并在oninitdialog中进行如图5.1所示的操作。获取要绘图的控件的hdc和大小获取摄像头获取屏幕分辨率开始计时改变控件大小图5.1 程序的初始化流程并在oninitdialog方法中加入以下代码:/获取hdc和控件尺寸pwnd = getdlgitem(idc_static1);pdc =pwnd-getdc(
51、);hdc= pdc-getsafehdc();pwnd-getclientrect(&rect);if (hdc=null)messagebox(无法获取hdc);return true;/获取摄像头if (m_video=null)m_video=cvcreatecameracapture(m_e01);if (m_video=null)messagebox(无法打开摄像头);return true;invalidate(true);updatewindow();/获取屏幕分辨率screenwid=getsystemmetrics(sm_cxscreen);screenhei=getsys
52、temmetrics(sm_cyscreen);/开始计时settimer(1,100,null);/设置装载图片的控件的默认尺寸是640*480并且将右边控件位置和窗口大小调到适当位置movecontrols(640,480);5.4 从输入控件中获得识别参数从控件中获得参数可以用updatedata(true),但当用户输入了一些非数字等不能转换为参数的字符串时,会不断地弹出对话框。为了防止这种情况,处理方式如图5.3所示,并在ontimer方法的开头中加入代码:获取弹出的对话框的指针是否获取到对话框获取控件的数据是否因获取失败而弹出了对话框根据控件数据开始识别否否是是返回,不进行识别对话
53、框关闭后控件的值复位并返回图5.2 能防止不断弹出对话框的获取控件信息流程cwnd *cwdg=findwindowex(null,null,null,gesturetest);/获取updatedata自动生成的对话框,标题为工程名cwnd *cwdt=getforegroundwindow();/获取活动的窗口if(this!=cwdt & cwdg=cwdt)/当自动生成的对话框弹出时不更新控件,也不进行识别cdialogex:ontimer(nidevent);return;if(!updatedata(true)/读取对话框数据/updatedata(false);cdialogex
54、:ontimer(nidevent);return;5.5 总体识别语句的实现总体识别的步骤包括:中值滤波、均值滤波、细节还原和锐化等图像的初步润饰操作,也包括了选取的提取和扩散操作,还有孤立点去除和关键信息的提取,代码在ontimer方法中的获取控件信息的语句之后。在识别的过程中,需要对识别的每一步结果分别进行呈现,为此需要进行适当的流程控制,并选择适当的iplimage*图片画到控件中。而后面的应用实现的代码将被写在总体识别的语句之后。int colourmax=0;/最大色差bool preshow=false;/显示m_frameif(smoothmode=1)cvsmooth(m_frame, m_grabframe, cv_median, 2*m_e11+1, 0, 0, 0);/中值滤波else if(smoothmode=2)cvsmoot
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1.1.13施工现场安全生产文明施工措施费用预算表
- 2025房地产开发各阶段涉及的合同
- 2025铝合金门窗施工承包合同
- 2025万安学校食堂聘用炊事员合同书
- 2025年林芝道路运输从业资格证考试模拟试题
- 2025年廊坊考从业资格证货运试题
- 2025年广安道路运输货运考试题库
- 2025鞍钢建设工程施工合同
- 工业锅炉附机设备行业深度研究报告
- 上海现代化工职业学院《内燃机电子控制技术》2023-2024学年第一学期期末试卷
- 《未来汽车》课件
- 神经外科疼痛护理查房
- 专门学校情况报告
- 工业互联网平台构建
- 数学思想与方法-国家开放大学电大机考网考题目答案
- 杭州奥泰生物技术股份有限公司IVD研发中心建设项目环境影响报告表
- 公共卫生事业管理专业职业生涯规划书
- GB/T 43232-2023紧固件轴向应力超声测量方法
- 低压配电室的安全操作规程
- 新目标汉语口语课本2课件-第2单元
- 二手车买卖合同(标准版范本)
评论
0/150
提交评论