基于单目手势识别交互系统论文.docx
《基于单目手势识别交互系统论文.docx》由会员分享,可在线阅读,更多相关《基于单目手势识别交互系统论文.docx(31页珍藏版)》请在冰豆网上搜索。
基于单目手势识别交互系统论文
本科毕业设计(论文)
基于单目手势识别交互系统
的设计与实现
学院机电工程学院
专业数字媒体技术
基于单目手势识别交互系统的设计与实现李林钢机电工程学院
摘要
随着计算机技术的逐渐发展,出现了一些符合人的习惯的人机交互技术。
其中,手势的检测和识别技术作为一种有着自然性、简洁性和直接性的一种新型的交互方式,是这些交互技术当中倍受重视的研究和应用的技术之一。
近几年来,已经有相当一部分的应用采用了这种手势识别的方式作为跟机器交互的手段,受到了世界各个国家的科研机构和科技企业的重视与青睐。
矚慫润厲钐瘗睞枥庑赖。
基于计算机视觉的手势识别需要解决一系列的问题。
首先是要做到的是从背景中将手分割出来;然后将有用的信息与冗余的信息分离开来,并将相关的手势信息提取出来;最后从相同的手势中根据实际情况,解读出它的特定的含义。
针对这些问题,本文讨论里一种采用基于单目的特定颜色模型的背景分离方法和基于关键信息的手势提取方法,用VisualC++2010和OpenCV进行开发,实现在多种摄像头下的手势识别交互系统,主要包括以下方面:
聞創沟燴鐺險爱氇谴净。
(1)针对不同摄像头画质的缺陷,采用中值滤波或均值滤波然后还原细节的方法实现图像较好的降噪,再用不同采样半径的USM锐化的方式实现图像信息的强化。
残骛楼諍锩瀨濟溆塹籟。
(2)根据人手和背景色相等方面的差异,采用亮度+两个颜色通道的色彩模型进行色彩分离,并将未选择到的阴影和高光等区域利用连续色的原理进行进一步的选取。
酽锕极額閉镇桧猪訣锥。
(3)根据选取结果有很多干扰区域的情况,实现最大面积连通区域的提取算法,以排除关键信息提取时的干扰。
(4)根据手的区域的情况和交互的自然性,采用稳定的手的重心作为手的位置,利用近大远小的关系,采用手占摄像头面积的大小判断手离摄像头的距离。
彈贸摄尔霁毙攬砖卤庑。
(5)针对以上识别的结果,实现了一些常见的人机交互应用,包括屏幕画图器、鼠标模拟器等。
关键词:
手势识别;VisualC++;背景消除;连通区域;关键信息提取
Abstract
Withthedevelopmentofcomputertechnology,somehuman-computerinteractiontechniqueswhichmeetpeople'shabitsappear.Amongthem,gesturedetectionandrecognitiontechnology,asanewnatural,simpleanddirecttechnology,ishighlyvalued.Inrecentyears,therehavebeenconsiderablepartoftheapplicationusingthisgesturerecognitionapproachasameansofaninteractionwiththemachine,anditdrawsattentionofandwasfavoredbythescientificresearchandtechnologyenterprisesofvariouscountries.謀荞抟箧飆鐸怼类蒋薔。
Computervision-basedgesturerecognitionneedstosolveaseriesofproblems.Thefirstisishowtosplitthehandfromthebackground;thenseparatetheusefulinformationandredundantone,andextracttherelevantinformationgesture;finally,decipherthespecificmeaningofthesamegestureinaccordancewiththeactualsituation.Tosolvetheseproblems,thispaperdiscussesagesturerecognitioninteractivesystemwithakindofbackgroundseparationmethodsbasedonspecificcolormodel,andakindofgestureextractionmethodonkeyinformation,developedbyVisualC++2010andOpenCV,fitsavarietyofcamera,whichincludesthefollowingaspects:
厦礴恳蹒骈時盡继價骚。
(1)Fordifferentqualitydefectsamongcameras,thissystemusesmedianfilterormeanfilterandrestoresthedetailmethodtoreducetheimagenoiseconservatively.ThenusedifferentsamplingradiusofUSMsharpeningtoenhancetheimageinformation.茕桢广鳓鯡选块网羈泪。
(2)Accordingtothedifferenceofcolorsbetweenbackgroundandhands,thissystemusesthebrightnessandthetwocolorchannelsasacolormodelforcolorseparation.Thenotchosendistinct,suchastheshadowandhighlightareaswillbefurtherselectedusingacontinuouscolormethod.鹅娅尽損鹌惨歷茏鴛賴。
(3)Accordingtotheresultstherearealotofinterferingregionsofselectedareas.Thesystemachievesthemaximumconnectedarearegionextractionalgorithm,whichexcludestheinterferenceofthekeyinformationextraction.籟丛妈羥为贍偾蛏练淨。
(4)Accordingtothehandregionofthecaseandforthenaturalistinteractive,thesystemusesthestablepoint--gravitycenterofthehandasthehandposition,andusesthesizeofthehandtoknowthedistancefromtheareawiththenear-farsmallerprinciple.預頌圣鉉儐歲龈讶骅籴。
(5)Accordingtotheresultsabove,thesystemachievessomecommoninteractiveapplications,includingscreendrawingcontrol,mousesimulator,etc.渗釤呛俨匀谔鱉调硯錦。
Keywords:
GestureRecognition;VisualC++;BackgroundRemoval;ConnectedRegion;KeyInformationExtraction铙誅卧泻噦圣骋贶頂廡。
1绪论
1.1手势识别交互的背景
随着整个社会逐步的信息化,带给了我们一种新的交互方式——人机交互(human-computerinteraction)。
而这一交互活动越来越成为人们日常生活的一个重要内容。
近几年来,随着计算机技术的逐渐发展,出现了一些符合人的习惯的人机交互技术,如头部跟踪、人脸识别、表情识别、唇读、体势识别以及手势识别等等[1],并逐步向以人为本的方向迈进。
其中,手势的检测和识别技术作为一种新型的方式,是这些交互技术当中倍受重视的研究和应用的技术之一。
驅踬髏彦浃绥譎饴憂锦。
手势是一种有着自然性、简洁性和直接性的一种人机交互手段。
[1]如果能只用人手作为计算机的输入设备,那么我们就无需学习其他繁重的硬件设备的操作,仅需根据人们的习惯,确定一些适当的手势,即可用简单的方式控制机器。
而手势是人的一种很常用的交流方式。
像人可以用手指的方向来表示物体的位置,用挥手来表示过来或再见,用一定的手势表示数字等等[2]。
猫虿驢绘燈鮒诛髅貺庑。
近几年来,已经有相当一部分的应用采用了这种手势识别的方式作为跟机器交互的手段。
受到了世界各个国家的科研机构和科技企业的重视与青睐,如IEEE自1995年起召开的人脸与姿势自动检测年会FG(IEEEConferenceonAutomaticFaceandGestureRecognition)以促进包括手势检测识别技术在内的技术交流与发展。
[2]锹籁饗迳琐筆襖鸥娅薔。
图1.1手势识别应用
1.2手势及识别方式的分类
手势(gesture)本身具有多义性和多样性,由于领域、文化背景等的不同,对手势的定义也会不同。
这里把手势定义为:
手势是人手产生的各种姿势和动作,手势和姿势(posture)的主要区别在于姿势更为强调身体的总体形态而手势更强调手的细节。
[1]構氽頑黉碩饨荠龈话骛。
手势按时间关系可分为静态手势(指姿态,又称手形)和动态手势(指动作,由一系列姿态组成)。
静态手势对应时间上的一个点,而动态手势对应着一段时间内的一条轨迹,需要使用随时间变化的空间特征来表述[3]。
动态手势具有丰富和直观的表达能力,与静态手势结合在一起,能创造出更丰富的语义。
輒峄陽檉簖疖網儂號泶。
按手势目的又可以分为操控手势和交际手势[10]。
在人机交互系统中,操控手势的一种典型应用就是在二维和三维的虚拟环境中来操控物体。
交流手势主要是指在自然环境中伴随人们自然对话的自由形式手势。
手势相对于语言来说是一种表达人们想法的单独的补充模式。
在对话中与手势相关联的信息是一种语句的时间和空间结构,可以用机器来提取它们[11]。
尧侧閆繭絳闕绚勵蜆贅。
手势的识别方式可分为利用机械装置的识别和基于计算机视觉的识别。
机械装置,如数据手套是虚拟现实中重要组成部分,可以将手指的复杂的三维位置和动作利用附着的感应器传到到计算机当中去。
然后可以重新呈现手部动作。
数据手套传感的识别方法的技术关键是手套能不能将手指、手掌、手腕的弯曲真实的以数据形势反演到系统数据库中,让系统根据模型对手势进行有效识别。
由于手部软组织和计算复杂性,数据手套的计算速度总是存在延时,同时从人机交互的角度手套佩戴也十分不方便。
如果多人使用还存在卫生等问题[4],再加上这些传感器昂贵的价格,因此数据手套等机械识别的方式在推广上会受到很多的障碍。
识饒鎂錕缢灩筧嚌俨淒。
近些年来,基于计算机视觉的识别方法提供了一种成本较低的能减少用户限制的手势识别的方法,这种方法也是本系统的主攻方向。
在基于计算机视觉的识别方式中,通常的做法就是把手势识别问题看成模式识别问题来对待。
通过摄像头等设备来获取图像或视频,再把它们分解成特征集,然后用这些特征集与预先定义好的模式进行匹配。
凍鈹鋨劳臘锴痫婦胫籴。
1.3基于计算机视觉的手势识别技术需要解决的问题
无论是利用数据手套还是用手部粘贴高亮标签使作为输入设备会给使用者带来不舒适感如出汗等,且设备价格昂贵,难以推广。
在上述研究的基础上,研究者渐渐把研究的重心转移到的不佩戴手套或不粘贴设备的自然手识别检测技术之上,以追求使用者更舒适的体验,其中从计算机视觉的研究方式入手是当前比较主流的研究方向,然而实现起来难度更大。
恥諤銪灭萦欢煬鞏鹜錦。
首先是要做到的是从背景中将手分割出来,通常会用肤色分割的方法基于皮肤的色调将不同于周围背景手的区域分离出来.但是会受到光线等因素干扰,分离出手后需要用合适的模型对手的动作建模。
之后从模型中估算出参数,根据估算出的参数对手势进行分类,得出结论。
由于在数据采集时容易受到背景干扰,往往要求背景颜色和手的颜色有较好的区分度。
[4]鯊腎鑰诎褳鉀沩懼統庫。
其次人体由多个部分组成,其中手指往往包含丰富的信息,而头和手臂所以及人手本身因光滑而产生的大量阴影等信息则大多为冗余信息,故如何将有用的信息与冗余的信息分离也是提高手势识别能力的关键。
硕癘鄴颃诌攆檸攜驤蔹。
再次,人手是弹性物体,同样的手势的表现效果可能差别很大[5],并且同样的用户者要重复做出完全相同的手势也是不可能的,如何降低甚至消除这个因素的影响对整个识别的准确率也有一定影响。
阌擻輳嬪諫迁择楨秘騖。
最后,手势往往具有复杂、多重的含义,单一的方法很难准确地解读人手的具体内涵进而实现最终的识别,故需要综合多种方法。
[6]氬嚕躑竄贸恳彈瀘颔澩。
针对上面提到的多种难题,不同的研究和开发人员提出了许多种不一样的方案。
综合以上,本文将提出一种能适应各种摄像头的,能抵抗一定干扰信息的一种基于计算机视觉的进行手势识别解决方案。
釷鹆資贏車贖孙滅獅赘。
1.4本程序主要实现的功能
(1)实现对摄像头的发现和选取,与对每一帧图像的采集和缩放。
(2)实现对图像的清晰化,包括点状噪声的去除、细节的还原以及之后整体的锐化。
(3)实现对背景信息的剔除,包括对肤色的提取和分割,对阴影和高光区域的扩散和对一些孤立点的剔除。
(4)实现关键信息,如手的重心、手的远近(手的面积)等的确定。
(5)利用以上关键信息,实现一些应用。
为了保证软件的实时性,同时便于以上功能的实现,开发工具选用VisualC++2010,第三方类库采用OpenCV2.0来完成这项工程。
怂阐譜鯪迳導嘯畫長凉。
2摄像头信息的采集和预处理
2.1OpenCV关于摄像头操作的API
要进行手势信息的获取,首先需要拥有一定的硬件,如数据手套、摄像头等。
对于软件方面则要安装相应的驱动程序和了解它们的API。
幸好OpenCV提供了一系列通用而且简洁的外部接口以便于实现以上的工作,对摄像头操作代码流程如图2.1所示:
谚辞調担鈧谄动禪泻類。
是
嘰觐詿缧铴嗫偽純铪锩。
图2.1摄像头启动和释放的代码流程
在实际的应用当中,当用户拥有多个摄像头时,cvCreateCameraCapture方法的参数应该取零或正整数,来选择不同编号的摄像头。
当找不到该摄像头时,可以自动选择成默认的摄像头,一般来说是第0号摄像头,仍未找到才进行错误退出。
熒绐譏钲鏌觶鷹緇機库。
2.2在控件中呈现有关摄像头的图像
为了便于观察,需要将摄像头的源数据或数据的处理情况呈现到控件中,而MFC类库和OpenCV共同提供了这些方法。
鶼渍螻偉阅劍鲰腎邏蘞。
2.2.1HDC的获取
MFC的CDC(设备上下文)和它对应的句柄HDC提供了一系列有关画图的方法,对于一个有一定ID(如IDC_STATIC1)的控件来说,获取的方法如下:
纣忧蔣氳頑莶驅藥悯骛。
CWnd*pwnd=GetDlgItem(IDC_STATIC1);
CDC*pDC=pwnd->GetDC();
HDChDC=pDC->GetSafeHdc();
if(hDC==NULL)
{
MessageBox("无法获取hdc!
");
returnTRUE;
}
这里将ID为IDC_STATIC1的控件通过pWnd获取控件本身的窗口信息,然后通过这个pWnd来获得有关设备的上下文CDC和HDC,获取不到则出现错误对话框并退出。
如果已经设置了控件的Control类型的变量(如m_s1),则CDC和HDC可以通过这个变量直接获取:
颖刍莖蛺饽亿顿裊赔泷。
CDC*pDC=m_s1.GetDC();
HDChDC=pDC->GetSafeHdc();
2.2.2将IplImage*位图渲染到控件当中
OpenCV的IplImage*类型的图片渲染到控件的HDC前需要得到它的头部信息,这需要开辟一段内存并将它的结构体提取出来,然后分别赋值:
濫驂膽閉驟羥闈詔寢賻。
staticucharbuffer[sizeof(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?
abs(image->height):
-abs(image->height);挤貼綬电麥结鈺贖哓类。
bmih->biPlanes=1;
bmih->biBitCount=(unsignedshort)((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_RGB_COLORS),即可将OpenCV的IplImage*画入到HDC为hDC的控件中。
但其后不能执行pDC->Invalidate()操作,否则原先画的结果会被清空。
塤礙籟馐决穩賽釙冊庫。
2.3摄像头图像的预处理
由于摄像头的图像尺寸千变万化,不一定能满足手的关键点位置的精准度或者图片太大造成延迟和卡顿,而且可能包含了大量的阻碍识别的信息(如点状噪声等),因而需要一些预处理工作。
裊樣祕廬廂颤谚鍘羋蔺。
2.3.1图片的缩放
图片需要缩放到一个合理的大小,如320x240,为了加强精确度有条件的可以加到640x480。
OpenCV提供了一个函数cvResize可以实现这个功能。
如原IplImage*图片是m_Captured,目标图片是m_Frame,则函数可写成:
仓嫗盤紲嘱珑詁鍬齊驁。
cvResize(m_Captured,m_Frame,(m_Captured->width)>(m_Frame->width)?
CV_INTER_LINEAR:
CV_INTER_AREA);绽萬璉轆娛閬蛏鬮绾瀧。
当原图片比目标图片小时应使用双线性或双三次插值的放大算法,来使得手的运动轨迹连续变化,反之,则采用平均值的缩小算法,来减少波纹和边缘的不连续现象。
骁顾燁鶚巯瀆蕪領鲡赙。
2.3.2图片的降噪
噪声可以理解为“妨碍人和传感器对所接收的信源信息理解的因素”。
而图像中各种妨碍信息接受的因素即可称为图像噪声。
噪声被定义为“不可预测而只能用概率统计的方法,来认识的随机误差”。
瑣钋濺暧惲锟缟馭篩凉。
图片噪声按产生的原因可分为外部噪声和内部噪声。
外部噪声是指由于系统外部干扰以电磁波或由电源串进系统内部而引起的噪声。
如电气设备,天体放电现象等引起的噪声,而这种噪声可能就是高斯噪声、脉冲噪声等多个噪声合成累计的。
鎦诗涇艳损楼紲鯗餳類。
内部噪声主要是由光和电的基本性质所引起的噪声。
如电流的产生是由空穴或电子的集合,定向运动所形成的,而这些粒子运动的带有随机性,产生了散粒噪声;而导体中也有自由电子,它们会进行无规则热运动,形成热噪声。
栉缏歐锄棗鈕种鵑瑶锬。
为了消除这些随机因素,可以通过中值滤波或均值滤波的方法法进行滤波。
对应的OpenCV函数是:
voidcvSmooth(constCvArr*src,CvArr*dst,intsmoothtype=CV_GAUSSIAN,intparam1=3,intparam2=0,doubleparam3=0,doubleparam4=0)。
辔烨棟剛殓攬瑤丽阄应。
其中smoothtype是CV_GAUSSIAN时将对图像进行大小为param1×param2的高斯卷积的均值滤波。
而smoothtype是CV_MEDIAN时将对图像进行大小为param1×param1的中值滤波,注意为param1奇数,且不大于7,其效果结果如下图所示:
峴扬斕滾澗辐滠兴渙藺。
(a)原图(b)CV_GAUSSIAN(c)CV_MEDIAN詩叁撻訥烬忧毀厉鋨骜。
图2.2CvSmooth的不同smoothtype的比较
可以看出,中值滤波对边缘的保留效果较强,但实际执行的速度较慢。
不过这些降噪变换都会导致有效细节的丢失。
则鯤愜韋瘓賈晖园栋泷。
为此可以将图片用按一定阈值还原,这分为两种方法——还原与原图像相差小的部分和与还原原图像相差大的部分,为了保持还原后的连续性,可以设置成不在符合阈值内的图像的保留度再按跟还原原图像相差值线性变化,其效果如图2.3至图2-6所示:
胀鏝彈奥秘孫戶孪钇賻。
图2.3中值滤波后的图形
图2.4原图
图2.5低阈值保留后的图形
图2.5高阈值保留后的图形
从上图可以看出,还原与原图像相差小的部分可以消除一些突兀的部分,可称为椒盐噪声,使得图像看起来比较柔和,但形体内部的与原图像相差小斑纹仍然存在;而还与原原图像相差大的部分则可以让形体内部的斑纹大大减弱或消失,使得图像看起来比较平滑,但是突兀的部分也因此更加明显。
鳃躋峽祷紉诵帮废掃減。
因此,这两种还原算法需要配合起来使用才能起到效果,以便于识别为目的,可以使用先还原相差小的部分,并用这个结果作为原图,再还原相差大的部分。
稟虛嬪赈维哜妝扩踴粜。
如图所示,效果已经综合了上述两种效果的优点。
图2.6原图
图2.7双重还原后的图像
2.3.3图片的锐化
经过图片的降噪处理后会显得比较朦胧,有时候需要进行USM锐化方可实现更好的边缘提取。
为此可以先用cvSmooth,smoothtype选CV_GAUSSIAN进行均值滤波到一个临时图像,然后按一定阈值将原图像与临时图像的像素反差扩大即可,反差扩大的公式为:
陽簍埡鲑罷規呜旧岿錟。
式中,x表示原图像的亮度,
表示临时图像的亮度,k表示锐化的强度(k>1),X表示目标图像的亮度。
而通过原图像与临时图像的色差的阈值的调整,可以减少一些不需要锐化的区域,但如上所述,会造成边缘突兀和不连续,为此也可以将位于原图像与临时图像的亮度差在阈值内部分的锐化强度,按这个亮度差线性减弱。
如图2.8所示:
沩氣嘮戇苌鑿鑿槠谔應。
(a)锐化前(b)锐化后
图2.8锐化前后的图像比较
3手的