版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
分类号:TP391.4 UDC:D10621-408-(2012)0714-0密级:公开编号:2008023028成都信息工程学院学位论文基于Android编程平台的面部识别技术研究论文作者姓名:钟铺俊申请学位专业:生物医学工程申请学位类别:工学学士王保强(教授)论文提交日期:2012年06年01日独创性声明本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得成都信息工程学院或其它教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示谢意。签名:日期:2012年6月09日关于论文使用授权的说明本学位论文作者完全了解成都信息工程学院有关保留、使用学位论文的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允许论文被查阅和借阅。本人授权成都信息工程学院可以将学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。(保密的学位论文在解密后应遵守此规定)签名:日期:2012年6月09日基于Android编程平台的面部识别技术研究摘要随着Google与33家手机制造商、手机供货商、软硬件供货商、电信业者联合组成的开放手机联盟(OpenHandsetAlliance,OHA),在2011年11月5日发布名为“android”的开放手机平台,Android就以原始码操作系统平台、免费应用程序开发环境,在手持设备,尤其在手机上的应用得到了飞速的发展。本文的主题就是基于android编程平台,利用手持设备对面部识别技术的研究。研究内容:使用智能手机采集人脸图像,并对人脸图像进行预处理,让其达到相关识别算法的要求,适合与人脸库里面的图像进行对比,得出识别结果。研究方法:首先由Android手机获取人脸图像,对人脸图像进行预处理(彩图灰度化、直方图均衡化、图像的平滑滤波等);再通过JavaNativeInterface(JNI)规则将OpenCV平台与android平台实现类库共享,利用PrincipalComponentAnalysis(PCA)算法对人脸图像进行特征提取,获得特征向量(特征脸)完成训练阶段;最后,将待识别的人脸图像投影到特征向量,通过最邻近法得到与特征向量最近的人脸图像完成识别阶段,从而识别此人的身份。研究结果:本文利用PCA算法对人脸进行识别,通过降维的方法减少了计算量,降低了程序对硬件的要求,同时识别率较高,具有一定的使用价值。但是,存在一个问题:拍照时手机离人脸的距离存在差异,提取到的人脸图像也有所不同,这样就影响了识别率。关键词:Android;JNI;OpenCV;图像预处理;面部识别;PCAStudyofthefacerecognitiontechnologybasedontheandroidplatformprogrammingAbstractWiththepublicationoftheopenmobilephoneplatformcalled“Android”inNovember5th,2011,“Android”wastakingshaperapidlyinthefieldofhandhelddevicesandespeciallyinthefieldoftheapplicationofthemobilephonewiththetappingenvironmentofthesourceoperatingsystemplatformandthefreeapplicationprogram.TheopenmobilephoneplatformwaspublishedbyGoogleandtheOpenHandsetAlliancewhichisconsistedof33mobilephonemanufacturersandsuppliers,thesoftwareandhardwaresuppliersandtheTelecommunicationcompanies.Thetopicofmypaperistostudythefacialrecognitiontechnology,makinguseofthehandleddevices,whichisbasedontheprogramplatformofandroid.Themaincontentsofthispaperareasfollowing:First,itusesintelligentmobilephonetogettheimageofhumanface.Then,itadjuststhefaceimagetomeettheneedoftherelativerecognitionalgorithm.Andlastitcomparesthefaceimagewiththeonesinthestoreroomofthefaceimagetogettheresultoftherecognition.Themajormethodsofthispaperisasfollowing:firstly,gettingthefaceimagesfromtheAndrewsphone,andmakingapretreatmenttothefaceimages,suchaswallpapersgraying,histogramequalization,smoothingfilteroftheimagesandsoon;secondly,achievingtheclasslibrarysharingoftheOpenCVplatformandtheAndroidplatformthroughtherulesoftheJavaNativeInterface.AndthenusingPrincipalComponentAnalysismethodtopickupthefeaturesofthefaceimagestoobtaintheeigenvectorswhichistheeigenvectors-faceinordertofinishthetrainingstage;thirdly,makingthefaceimageswhicharetobeidentifiedprojectontotheeigenvectorsandgettingthefaceimagewhichisthenearesttotheeigenvectorswiththemethodoftheclosesttofinishtherecognitionphrase.Thustheperson'sidentityisidentified.Theresultsofthispaperareasfollowings.Firstly,thecalculationwillbereducedandtherequirementsoftheprogramonthehardwarewillbeloweredwiththemethodsofthePrincipalComponentAnalysisandthedimensionalityreductionintherecognitionofpeople’sface.Meantime,therecognitionratewillbeimproved.PCAmethodhassomepracticalvalues.However,whentakingaphotograph,itwillcauseoneproblemthattheextractedfaceimageswillbedifferentduetothedifferenceofthedistancebetweenthephoneandtheface.Thustherecognitionratewillbeinfluenced.Keywords:Android;JNI;OpenCV;Imagepreprocessing;Facerecognition;PCA目录1引言 11.1背景和意义 11.2人脸识别技术研究现状 11.3本课题研究意义 21.4本文主要内容及结构 32研究方案及技术路线 42.1研究内容 42.1.1研究对象 42.1.2制约识别率的关键问题 42.2研究方案 42.2.1相关人脸识别算法比较 42.2.2运用程序功能分析 52.2.3研究方案的确定 62.3技术路线 63 人脸图像获取 73.1Android编程平台 73.1.1Android开发平台搭建 73.1.2Android开发简介 83.2人脸图像获取 93.2.1Android应用程序组件(Activity简介) 93.2.2相关文件夹建立 113.2.3控制照相机照相 114图像预处理 124.1彩图灰度化 124.2直方图均衡化 134.3图像平滑滤波 144.4边沿检测 154.5人脸部位提取 175 PCA算法及实现 185.1AndroidNDK简介 185.2PCA算法原理分析 185.2.1训练阶段 195.2.2识别阶段 205.3OpenCV实现PCA算法 205.3.1OpenCV简介 205.3.2PCA算法实现 215.4.SO库文件编译 215.4.1JNI规则 215.4.2库文件编译 236研究结果及分析 247总结 257.1全文总结 257.2前景展望 25参考文献 27致谢 28附录 29附录一:图像预处理效果图: 29附录二:程序界面截图 291引言1.1背景和意义21世纪是移动互联网发展的时代,未来也是移动互联网的时代。移动互联网的发展对人类的生活产生了巨大的影响。而移动手持设备正是在3G移动互联网时代得到了飞速的发展,手机已成为人们普遍使用的小型移动设备。2007年11月5日,android智能手机操作系统正是发布,由于其开放性,可定制性得到了众多手机制造商的重视。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2012年2月数据,Android占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。AndroidOS是Google发布基于Java并运行在Linux内核上的手机操作系统。Android操作系统采用分层架构,从高层到底层一共四层,分别是应用程序层、应用程序框架层,系统层和Linux核心层。而Android底层方面使用C/C++语言作为开发语言。随着Android的快速发展,如今已允许开发者使用多种编程语言来开发Android应用程序。从而受到众多开发者的喜爱,成为真正意义上的开放式操作系统[2]。随着移动互联网的发展,手机已经超越了它最初的设计本能。它不仅仅应用于通讯这单一功能,还是移动的支付平台、管理着用户的众多信息。所以手机的信息安全也成为急于解决的技术问题。本文就是运用Android编程平台,在手机上进行人脸识别技术的研究。从而对手机使用者的身份进行确认,保障手机所有者的信息、财产等安全。1.2人脸识别技术研究现状人脸识别的研究历史比较悠久,Galton在1888年和1910年就分别在Nature两篇关于利用人脸进行身份识别的文章。自动人脸识别的研究最早的论文出现于1965年Chan和Bledsoe在PanoramicResearchInc.发表的技术报告。近年来,人脸识别更是得到了长足的发展,每年都有大量的学术论文发表。人脸识别研究的历史现状大体划分为以下三个阶段[1]:第一阶段(1964-1990)。这一时期人脸识别通常作为一个一般性的模式识别问题被研究,所采用的技术方案是基于人脸几何结构特征的方法。这集中体现在人们对于剪影的研究上,人们对面部剪影曲线的结构特征提取与分析进行了大量研究。人工神经网络也一度被研究员用于人脸识别问题中。第二阶段(1991-1997)。在这短暂的时间里人脸识别技术进入高潮期,硕果累累。不但诞生了若干代表性的人脸识别算法,而且出现了商业化运作的人脸识别系统。最为著名的Identix的FaceIt。在这一阶段所提出的算法在理想图像采集条件、对象配合、中小规模正面人脸数据库上达到了非常好的性能。从技术方案上来看,2D人脸图像线性子空间判别分析、统计表观模型、统计模式识别是这一阶段的主流技术。第三阶段(1998-现在)。由于主流的人脸识别技术对光照、姿态等非理想条件或是用户不配合造成的变化条件下鲁棒性比较差。因此成为时下研究的热点。如此同时商业系统进一步发展。而非线性建模方法、统计学理论、基于Boosting的学习技术、基于3D模型建模与人脸识别方法等逐渐成为备受重视的技术发展趋势。人脸识别技术是从最初的单一的正面灰度图像的识别,经过对多姿态人脸识别研究,发展到能够实现动态识别,目前正在向三维人脸识别的方向发展。与其他的学科不同的是:人脸识别技术融合了数字图像处理、计算机图像学、模式识别、计算机视觉、人工神经网络和生物特征等多个学科的理论和方法。另外人脸自身所处环境的复杂性,如表情、姿态、图像的环境光照强度等条件的变化以及人脸上的遮挡物等,都会使人脸识别方法受到很大的影响。因此,人脸识别技术仍然是21世纪具有挑战性的课题。1.3本课题研究意义人脸识别,是一种基于人的脸部特征信息进行身份认证的生物特征识别技术。相比指纹识别技术,人脸识别具有非接触、识别速度快、准确率高等优点,因而深受欢迎并且应用广泛,特别是比起IC卡更具发展优势。除了重要行业和领域的应用外,人脸识别技术在智能门禁、门锁、考勤、手机、数码相机、智能玩具等民用市场也有着广泛的应用。人脸识别主要有一下几种应用:身份鉴定:在鉴定模式下,可以快速的计算出实时采集到的面纹数据与人脸数据库中的已知人员的面纹数据之间的相似度,给出一个按相似度递减排列的可能的人员列表,或是简单的返回鉴定结果和相对应的可信度。身份鉴定可用于电脑、网络安全、银行业务、智能访问控制、边境控制等领域。身份确认:在确认模式下,面纹数据可以存储在智能卡中或是数码记录中,只需要简单地将实时面纹数据与存储的数据相比对,如果可信度超过一个指定的值,则比对成功身份得以确认。视频监控应面像捕捉,人脸识别技术可以再监控范围中跟踪一个人和确定的位置[1]。面像数据压缩能将面纹数据压缩到小于84字节以内便可以应用于智能卡、条形码或是其他存储空间有限的设备中。近年来,随着欧美发达国家人脸识别技术开始进入实用阶段后,人脸识别迅速成为市场热点。据调查报告显示:2007年全球生物识别市场收入超过30亿美元,并且今后5年内将以每年8亿美元的幅度递增[9]。新技术的应用带来了全新的数字化生活方式。可以想象,在人脸识别时代,走入地铁需要刷卡、去银行取钱需要输入密码、上班考勤需要按指纹等方式都将改变。1.4本文主要内容及结构本论文所完成的任务是基于Android编程平台,在Android手机上实现人脸识别功能。对手机使用者的身份进行确认,保证手机所有者的信息、财产安全等。本论文在总体结构上共分为5章。第1章引言,本章介绍了Android和人脸识别的背景、意义。第2章研究方案及技术路线,本章主要介绍人脸识别的各种算法、方案和实现的技术路线。第3章图像的获取,本章介绍了Android编程平台的基础知识,并通过控制手机摄像头进行人脸的捕捉,人脸数据库的建立,图像的存取。第4章图像预处理,本章介绍了相关图像处理的算法以及实现,其中包括彩色图像的灰度化、灰度图像的直方图均衡化、图像的平滑滤波、边缘检测等。第5章PCA算法及实现,本章介绍了JNI规则,以及OpenCV编程平台与Android编程实现类库的共享。利用OpenCV实现PCA算法。第6章研究结果及分析,本章对研究结果叙述,以及分析。第7章结论,对全文进行总结,并对该课题的前景进行展望。2研究方案及技术路线2.1研究内容2.1.1研究对象本文涉及的研究对象是从智能手机的摄像头获取的人脸图像,并对人脸图像进行一定的处理,让其达到相关识别算法的要求,适合与人脸库里面的图像进行对比,得出结果。2.1.2制约识别率的关键问题目前随着人脸识别技术的发展,在识别率方面有了较大的提高,但是在相关技术方面仍然面临着诸多问题。主要表现在以下几个方面:(1)采集设备:采集设备的性能和采集时的设置使得获取的人脸图像数据的变化较大,如何解决这个问题也值得关注。(2)光照、背景的影响:光照是影响人脸识别性能的最关键因素,背景的不同也影响着识别的准确率。对该问题的解决直接关系着人脸识别应用程序的可靠性、识别的准确率。(3)人脸姿态:人脸姿态也是目前人脸识别实用化的一个巨大的障碍。如何将各种姿态统一到标准人脸,也是提高识别准确率的关键之所在。(4)表情问题:人脸表情的不同也会影响数据的采集和提取,这也将影响到后期的算法处理。2.2研究方案2.2.1相关人脸识别算法比较人脸识别的方法大致可以分为基于几何特征的方法、基于模板匹配的方法、隐马尔可夫模型的方法、基于神经网络的方法、特征脸方法。(1)基于几何特征:几何特征的识别方法首先将人脸用一个几何特征矢量表示,用模式识别中的层次聚类思想来对人脸进行识别。几何特征矢量是以人脸器官的形状和几何关系为基础的特征矢量,其分量通常包括人脸自定两点间的欧氏距离、曲率、角度。人脸器官的关键点分别对应于不同的积分投影方式产生的波峰波谷。(2)基于模板匹配:模板匹配的方法大多是用归一化互相关,直接计算两幅图像之间的匹配程度。由于这种方法要求两幅图像上的目标要有相同的尺度、取向和光照条件,所以预处理要做尺度归一化和灰度归一化的工作。识别时,未分类的图像跟数据库中的所有图像数据进行比较,采用相关作为典型的匹配函数。(3)隐马尔可夫模型:隐马尔可夫模型(hiddenMarkovmodel,HMM)是用于描述信号系统特征的一种常见的统计模型,被广泛应用于语音判定中。人脸面部特征的分布都依照一种自然的顺序,即从上到小、从左到右,即使人脸在平面和垂直方向上发生旋转,这种顺序也不会变化,但是实现起来的难度较大。(4)基于神经网络识别:神经网络的方法是近年来比较活跃的一个研究方向。人工神经网络(ANN)是一种以大的量处理单元(神经元)为节点,处理单元之间实现加权值互联的拓扑结构,处理单元是人类大脑神经单元的简化。Cottrell等人使用级联BP神经网络进行人脸识别,对部分受损的人像、光照有所变化的人像,个人识别能力较好,但是神经元数目通常很多,训练时间很长,具有固有缺陷:收敛速度慢、容易陷入局部极小、先验参数多且参数的确定凭经验而定[8]。(5)特征脸识别:特征脸法是人脸识别中常用的一种方法。该方法主要是从人脸图像的全局出发,运用K-L变换理论,在原始人脸空间中求得一组正交向量,并以此构成新的人脸空间,使所有人脸的均方差最小,达到将为的目的。降维的思想,降低了运算量,有利于此算法运用于硬件配置相对中低端的手持设备中。但是此算法也存在缺陷:特征脸方法容易受角度、光照、表情等干扰导致识别率下降。通过以上算法的介绍,结合算法的特征还有应用的平台,我们选择PCA算法。它可以为我们减少大量的计算,从而提高程序运行的效率,因为实在手机上运行我们更应该考虑到运算量的大小,综合考虑本文的主要算法实现我们采用PCA算法。2.2.2运用程序功能分析本文应用程序最主要的功能就是要能识别出人脸,首先该系统需要对通过摄像头拍照而获取到的原始的人脸图片进行一系列处理才可进行下一步的工作,该处理过程也称图像预处理。预处理这个模块在整个人脸识别系统的开发过程中占有很重要的地位,只有预处理模块做的好,才可能很好的完成后面的特征提取这一关键模块。因此本设计中所要完成的主要功能如下所述:图像的获取功能:主要是通过手机摄像功能获取人脸图像。图像的存取功能:在手机SD卡中建立相关文件夹,用于存取人脸图像,其中包括训练图像、待识别图像以及相关的数据。图像的预处理功能:主要是对获取的图像进行灰度化、直方图均衡化、平滑滤波、边缘检测等处理。图像特征提取的功能:按照PCA算法对图像进行特征提取。识别功能:这部分功能主要实现待识别图像与训练后图像数据进行比对,得出相应的结果。2.2.3研究方案的确定通过以上分析本文的研究方案确定为以下几点:熟悉Java编程语言为进一步熟悉Android编程平台打下基础,初步实现利用Android手机实现拍照和存取功能。进一步学习数字图像处理相关知识,为图像的预处理打下坚实的基础。研究各图像处理的算法,然后进行编程运行,通过编程的实际运行效果进行相应的变换、改进。主要预处理步骤如图2-1:图像预处理层次图。图像预处理彩色图像的灰度化图像预处理彩色图像的灰度化灰度图像的直方图均衡化图像的平滑滤波图像的边缘检测图2-1图像预处理层次图图像预处理获取标准人脸后,学习人脸识别相关算法,对主要人脸识别算法进行总结、归纳。确定本课题人脸识别算法,并对算法认真理解、研究。最终实现人脸识别算法,完成本课题要求。2.3技术路线由以上分析,技术路线如图2-2:人脸识别技术路线。相关文献阅读学习相关文献阅读学习C/C++、Java基础复习数字图像处理学习初步框架构想图像的预处理知识的准备PCA算法学习程序框架的搭建图像预处理PCA算法实现程序完善运行结果分析程序优化查资料图2-2人脸识别技术路线人脸图像获取3.1Android编程平台3.1.1Android开发平台搭建本文android开发平台是基于Windows环境下搭建的,具体方法步骤如下:在Oracle官方网站免费下载最新的JDK安装程序,网址为:://oracle.下载完成后按照默认路径安装JDK软件。打开DOSCMD命令窗口输入java-version命令检查是否安装成功。若成功会显示JDK版本号等相关信息。接下来配置环境变量:在系统环境变量里添加PATH变量,内容为JDK安装目录中bin文件夹路径,并且同时添加CLASSPATH变量,内容为JDK安装目录中lib和demo的路径。并且用;来隔开的。登陆Android官方网站://developer.android,下载对应版本的SDK安装包。下载完成后只需要解压,不需要安装。但是要同样需要配置环境变量。将SDK解压后的目录下的tools目录的绝对路径添加到系统Path中,然后同样用DOSCMD命令android–h检查是否安装成功。登陆Eclipse官方网站://,下载适用版本的Eclipse.将下载完成的Eclipse安装包解压硬盘。双击eclipse.exe打开eclipse软件,在Help->InstallNewSoftware,安装ADT。完成后重启eclipse,在Widows->Preferences下选择android->Browse添加androidSDK路径,单击OK完成。这样android开发环境基本搭建完成。Android开发环境搭建好了就可已进行android应用程序的开发了。3.1.2Android开发简介程序库表面管理程序库表面管理媒体框架SQLiteOpenGLFreeTypeWebKitSGLSSLlibc应用程序框架活动管理窗体管理视图系统包管理管理资源管理位置管理通知管理内容提供Linux内核显示驱动相机驱动IPC驱动键盘驱动WiFi驱动电源管理闪存驱动音频驱动应用程序活动管理活动管理活动管理活动管理图3-1Android平台架构图Android平台是在Linux2.6.25版本的基础上改造的,提供了各种的函数库和完整的应用程序框架。我们把Android大体上分为4层:Linux内核,系统开发库,应用程序框架以及应用程序。具体参看图3-1:Android平台架构图应用程序是包括Android平台配置的一套应用程序集,以及用户基于Android平台的应用程序框架,使用Java语言自行开发的程序。应用程序框架:开发者可以完成使用与那些内核应用程序相同的框架,这些框架是用于简化和重用应用程序的组件。通过应用程序,用户自定义的程序可以执行用户程序之外的预设功能,这样可以极大的减少用户程序的额外工作量。系统开发库:Android定义了一套C/C++库供Android平台的其他组件使用。这些功能通过Android应用程序框架提供给开发者,开发者不能直接使用这些库。Linux内核:Android的核心系统服务依赖于Linux2.6内核,如内存管理、进程管理、驱动模型等。Linux内核也同时作为硬件和软件栈之间的抽象层[5]。3.2人脸图像获取3.2.1Android应用程序组件(Activity简介)在android中,Activity拥有四种基本状态:(1)Active/Running状态,一个新Activity启动入栈后,它在屏幕最前端,处于栈的最顶端,此时它处于可见并可和用户交互的激活状态。(2)Paused状态,当Activity被另一个透明或者Dialog样式Activity覆盖时的状态。此时它依然与窗口管理器保持连接,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点故不可与用户交互。(3)Stopped状态,当Activity被另外一个Activity覆盖、失去焦点并不可见时处于Stopped状态。(4)Killed状态,Activity被系统杀死回收或者没有被启动时处于Killed状态。Android是通过一种Activity栈的方式来管理Activity的,一个Activity的实例的状态决定它在栈中的位置。处于前台的Activity总是在栈的顶端,当前台的Activity因为异常或其它原因被销毁时,处于栈第二层的Activity将被激活,上浮到栈顶。当新的Activity启动入栈时,原Activity会被压入到栈的第二层。一个Activity在栈中的位置变化反映了它在不同状态间的转换[3]。Activity的状态与它在栈中的位置关系如图3-2所示:重新激活失去焦点不在栈顶的Activity,可能被系统销毁、收回资源重新激活失去焦点不在栈顶的Activity,可能被系统销毁、收回资源Activity1(Running)Activity2(Paused/Stopped/Killed)Activity3(Paused/Stopped/Killed)………图3-2Activity的状态与它在栈中的位置关系图Android程序员可以决定一个Activity的“生”,但不能决定它的“死”,也就时说程序员可以启动一个Activity,但是却不能手动的“结束”一个Activity。每一个Activity都有自己的生命周期,而Activity的生命周期统一交给系统管理。如图3-3:Activity生命周期示意图。onCreate()onStart()onCreate()onStart()onResume()onPause()ActivitystartsActivityisrunningonStop()onDestroy()onRestart()ActivityisshutdownProcessiskilled图3-3Activity生命周期示意图Android平台定义了一种称为Intent(意向)的异步消息,该消息用于激活Activity、Service和BroadcastReceiver组件。具体用法如下:Intentintent=newIntent();Intent.setClass(FaceDetectorActivity.this,Resgistered.class);startActivity(intent);3.2.2相关文件夹建立Android文件的实体操作包括文件的创建和删除,本文将用到文件夹的建立,文件夹主要用于存储相关图像。程序中主要的核心代码如下://判断是否插入SD卡booleansdvalue=Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);//创建文件夹FilefileTake=newFile(String_SDroot+"/FaceDetector/Take"); if(!fileTake.exists()) { fileTake.mkdirs(); }3.2.3控制照相机照相使用Camera类的“open”方法获得一个照相机的接口。(Cameracamera=Camera.open();)通过照相机的接口的setPreviewDisplay()方法可以指定承载预览内容的视图组件,通过setPreviewCallback()方法可以设定对预览事件的回调处理。设置完成后可以通过照相机接口的setPreview()和stopPreview()方法来启动或是停止对照片的预览。并通过takePicture()方法进行照片拍摄,通过快门事件的回调函数,开发者可以处理开门关闭后的事件,而通过获取照片事件的回调接口,开发者可以获取照相机所得到的图片数据,从而进行下面的图像预处理等等操作。最后通过release()方法来断开与照相机设备的连接,并释放该照相机接口有关的资源。程序中核心代码如下:/*启动Camera*/mCamera=Camera.open();mCamera.setPreviewDisplay(holder);publicvoidtakePicture(){if(mCamera!=null){ mCamera.takePicture(null,null,jpegCallback);}}//通过快门事件回调存储图像CameraBitmap=BitmapFactory.decodeByteArray(_data,0,_data.length);FilemyCaptureFile=newFile("/sdcard/FaceDetector/Take/takePH.jpg");BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream(myCaptureFile));CameraBitmap.setDensity(8);CameraBitmappress(BitmappressFormat.JPEG,100,bos);4图像预处理在人脸图像的产生、传输和变换上,往往由于多种因素使得图像产生变劣或是退化,劣变退化就是产生的图像与原始景物之间的某些差异,这些差异一般包括人脸图像对比度差、人脸边沿模糊、噪声较大等。这些退化对下一步的处理带来了困难和不便,因此这很有必要对人脸图像进行一些恰当的处理,改善图像的视觉效果,从而提高图像的清晰度,便于后期的图像识别提高识别率,这一过程就是图像的预处理。人脸图像预处理的方法主要有:人脸图像的灰度化、人脸图像的二值化、人脸图像的几何校正、直方图均衡化、人脸图像的滤波、图像的锐化、像素平均法等。4.1彩图灰度化人脸识别技术的研究一般是一灰度图像作为研究对象。彩色图像包含了人脸较多的信息,直接将彩色图像作为研究对象这样就是的处理的过程变得复杂化,不利于识别。而灰度图在保留了人脸信息量不丢失的情况下,加少了信息总量,为后期的识别算法提供了可行性。将彩色图像灰度化,通常采用以下经验公式:(4-1)具体过程如:图4-1彩色图像的灰度变换读取图像数据获取RGB分量读取图像数据获取RGB分量计算像素点灰度值像素点重新赋值得到灰度图图4-1彩色图像的灰度变换Android程序实现的主要代码:intcolor=pix_result[width*i+j];intred=Color.red(color);intgreen=Color.green(color);intblue=Color.blue(color);color=(int)((float)red*0.3+(float)green*0.59+(float)blue*0.11)&0xFF;4.2直方图均衡化图像的灰度直方图是图像各个像素点灰度值的统计度量。运用直方图能很好的反应图像的大体概貌以及图像灰度值得大体分别情况。如图像中的目标、背景的分布情况,还可以计算图像中的最大最小灰度值、平均灰度值、对比度等。应用于图像的预处理上我们称其为直方图均衡化(也称直方图修正),其基本的思想是将各灰度级分量尽量平均分布在整个图像空间,在直方图上的表现为由密集的灰度分布变为均匀的分布,从而增强图像的对比度。此外,直方图均衡化还可以减少管线对图像的干扰、影响,使得对图像的特征提取更加的容易,同时提高了图像的主观质量。实践证明,直方图的均衡化是一种有效的图像增强方法。直方图均衡化就是要建立一个T变换,对于连续的图像来说:用变量R来代表待增强图像的灰度级。假设R被归一化到区间[0,1],且R=0代表黑色、R=1代表白色。之后用一个离散公式并允许像素值在区间[0,L-1]。这样我们建立变换:(4-2)在输入图像中,对于每个像素值R产生一个灰度值S。满足一下条件:(1)在区间上为单值且单调函数(2)当时,这样就保证了的反变换存在,单调的条件就保证了输出图像是从黑到白的顺序,最后由S到R的反变换可表示为:(4-3)对于离散的数字图像,其方法可以表示为:(4-4)其中A为图像面积,L为图像灰度级,表示灰度级为k的像素点的总数[2]。算法实现流程,如图3-2直方图均衡化算法流程获取源图像信息统计个灰度级概率密度获取源图像信息统计个灰度级概率密度源图像直方图均衡化返回均衡化的像素点数组图4-2直方图均衡化算法流程Android中核心代码:Gray=PixelsGray[i];FrequenceGray[Gray]++;SumGray[i]=SumGray[i-1]+FrequenceGray[i];SumGray[i]=(int)(SumGray[i]*255/length);PixelsGray[k]=SumGray[PixelsGray[k]];returnPixelsGray;4.3图像平滑滤波人脸图像在采集过程中,受到各种干扰时不可避免的,并在获得的图像中留下了痕迹。为了避免噪声对图像的特征抽取的影响,需要消除图像的噪声。现在消除噪声的主要方法分为两类:一类是全局处理,包括Wiener滤波、Kal-man滤波等方法。二类是使用局部算子,如均值滤波、中值滤波、梯度倒数加权滤波等经典算法。本文就是运用的均值滤波方法对获得的人脸图像进行平滑滤波。均值滤波就是对信号进行局部平均,以平均值来代表该像素点的灰度值,换言之,每一个像素值用其局部邻域内所有值得平均值来代替:(4-5)其中m为邻域内像素点的总数。如在像素点处取3x3的邻域,这样得到公式如下:(4-6)其中值得注意的是邻域N控制着滤波程度,对应大卷积模板的大尺度会加大滤波程度,但是这样会导致图像细节的损失。在设计线性平滑滤波器的时候,选择滤波权值使得滤波器只有一个峰值,并且在水平和垂直方向上市对称的,下面就是程序中运用的一个典型3x3平滑滤波器的权值模板:线性平滑滤波器除去了高频成分和图像中的锐化细节。如把阶跃变化平滑成逐渐变化,使得精确定位的能力下降[4]。程序中实现的核心代码如下:average=(1/4*data[i*width+j]+1/8*data[i*width+j-1]+1/8*data[i*width+j+1]+1/8*data[(i-1)*width+j]+1/16*data[(i-1)*width+j-1]+1/16*data[(i-1)*width+j+1]+1/8*data[(i+1)*width+j]+1/16*data[(i+1)*width+j-1]+1/16*data[(i+1)*width+j+1])/9;filterData[i*width+j]=(int)(average) filterData[i]=(filterData[i]-min)*255/(max-min);4.4边沿检测图像的边缘是图像非常重要的特征之一。图像的边缘保留了原始图像中相当重要的部分信息,而又使得总的数据量得以减少,这为后续的算法,也就是特征提取的计算量得以大大的减少,这正是符合特征提取的要求。而用于图像识别的边缘提取比视觉效果增强的边缘提取要复杂一些。边缘对应于物体的边界,在灰度图像中灰度值变化剧烈的地方符合这一要,一般会以这个特征来提取图像的边缘。灰度值得剧烈变化可以度量边缘,由此我们想到在数学上,最直观的方法就是微分。在此之前我们应该对输入图像进行噪声消除的处理,这样保证图像中的高频成分是原始图像中的。经典的边缘检测是以原始图像为基础,对图像中的像素考察它的某个领域内的灰度阶跃变化,利用边缘邻近一阶或是二阶方向导数的变化规律进行边缘检测。比较经典的常用的算法有:查分边缘检测、Roberts边缘检测算子、Sobel边缘检测算子、Prewitt边缘检测算子等。本文就是采用Sobel算子进行图像的边缘检测。对于数字图像而言,可以用一阶差分来代替一阶微分。对图像x,y两个方向进行差分:(4-7)(4-8)求梯度时,对平方和的开方运算,可以用两个分量的绝对值之和来表示。如下公式:(4-9)Sobel算子是一种梯度幅值的计算方法,通过对数字图像f(x,y)的每一个像素的四邻域点的灰度值的加权差,与邻点的权值大小。其先做成加权平均,再微分,再求梯度。具体的算法表达如下:(4-10)(4-11)根据以上,定义Sobel算子如下:(4-12)Sobel算子的核心是两个3x3的卷积核,通过这两个模板在图像区域中移动,完成图像中每个像素点与这两个卷积核的卷积运算[4]。Sobel算子卷积核如下:由于算法的复杂度本文采用OpenCV中的库函数实现图像的边缘检测,具体实现核心代码如下:pImgSobelgray=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1);cvSobel(pImg8uSmooth,pImgSobelgray,0,1,3);4.5人脸部位提取在用手机进行拍照时,拍下来的人脸图像含有背景,这就为后面的识别带来了误差。本文将通过OpenCV中目标检测函数,对人脸部位进行检测,并将人连部位保存为图像存储下来供后面识别,这样就减少了背景对识别的影响[10]。目标检测方法最初由PaulViola提出,并由RainerLienhart对这一方法进行了改善.首先,利用样本(大约几百幅样本图片)的HARR特征进行分类器训练,得到一个级联的boosted分类器。训练样本分为正例样本和反例样本,其中正例样本是指待检目标样本(例如人脸或汽车等),反例样本指其它任意图片,所有的样本图片都被归一化为同样的尺寸大小。分类器训练完以后,就可以应用于输入图像中的感兴趣区域(与训练样本相同的尺寸)的检测。检测到目标区域(汽车或人脸)分类器输出为1,否则输出为0。为了检测整副图像,可以在图像中移动搜索窗口,检测每一个位置来确定可能的目标。为了搜索不同大小的目标物体,分类器被设计为可以进行尺寸改变,这样比改变待检图像的尺寸大小更为有效。所以,为了在图像中检测未知大小的目标物体,扫描程序通常需要用不同比例大小的搜索窗口对图片进行几次扫描[6]。分类器中的“级联”是指最终的分类器是由几个简单分类器级联组成。在图像检测中,被检窗口依次通过每一级分类器,这样在前面几层的检测中大部分的候选区域就被排除了,全部通过每一级分类器检测的区域即为目标区域。目前支持这种分类器的boosting技术有四种:DiscreteAdaboost,RealAdaboost,GentleAdaboostandLogitboost,"boosted"即指级联分类器的每一层都可以从中选取一个boosting算法(权重投票),并利用基础分类器的自我训练得到。基础分类器是至少有两个叶结点的决策树分类器[11]。主要过程分为两步:(1)从文件中装载训练好的级联分类器或者从OpenCV中嵌入的分类器数据库中导入,利用库函数cvLoadHaarClassifierCascade(),函数原型如下:CvHaarClassifierCascade*cvLoadHaarClassifierCascade(constchar*directory,CvSizeorig_window_size)(2)检测图像中的目标,利用库函数vHaarDetectObjects(),函数原型如下:CvSeq*cvHaarDetectObjects(constCvArr*image,CvHaarClassifierCascade*cascade,CvMemStorage*storage,doublescale_factor=1.1,intmin_neighbors=3,intflags=0,CvSizemin_size=cvSize(0,0));PCA算法及实现5.1AndroidNDK简介AndroidNDK的全称是AndroidNativeDevelopmentKit,是一系列开发工具。允许程序开发人员在Android应用程序中嵌入C/C++语言编写的非托管代码(unmanagedcode)在公共语言运行库的环境的外部由操作系统直接执行的代码,称之为非托管代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务。AndroidNDK版本1.5集成了交叉编译,支持ARMv5TE处理器指令集,JNI接口和一些稳定的库文件。它提供了一系列的说明文档、示例代码和开发工具,指导程序员使用C/C++语言进行开发,并提供便捷工具将库文件打包到.apk文件中。更重要的是Android虚拟机允许应用程序源代码通过JNI调用在本地实现的方法。这样极大的提高了Android应用程序开发的灵活性。在Windows下AndroidNDK编译环境的配置方法主要分为以下四步:(1)下载AndroidNDK的安装包(2)下载并安装Cygwin(3)配置Cygwin的NDK开发环境(4)测试开发环境是否可以正常工作5.2PCA算法原理分析PCA将图像看作具有一定分布的随机向量。由于人脸总体构型的相似性,人脸图像在其中的分布不是随机的,PCA可以获得人脸图像分布的主成分方向,从而使用人脸图像的主成分来表达人脸。它使得图像数据在一个低维的空间进行处理,在保持了原有大部分信息量的基础上,大大的减少了运算量,这样有利于在移动设备上的开发使用。从本质上而言,这是一种基于统计分析的信息压缩算法。PCA算法运用于人脸识别主要分为连个阶段:训练阶段和识别阶段。5.2.1训练阶段设人脸图像用N=width*height维向量,人脸图像训练集可以看作是维的随机向量,其中m是训练样本图像数目。则这m幅图像的平均图像的向量表示为:(5-1)每个人脸与平均人脸图像的差值定义为:(5-2)这样训练图像的协方差矩阵表示为:(5-3)式中是N维向量,则就是维向量。设和分别是协方差矩阵的特征值和特征向量,其中,将特征值按从小到大顺序排列:。这样就很容易计算出协方差矩阵的正交归一特征向量为:(5-4)进一步我们获得特征脸为了进一步减少计算量,我们提出特征值的贡献率(选取的特征值在总的特征值的和比),选取前P个最大特征值以及对应的特征向量[7]。(5-5)这样每一幅人脸图像都可以投影到由组成的子空间中,因此每一幅人脸图像对应于子空间中的一个点。同样子空间中的一个点也代表着一个人脸图像,由于这些点很想人脸图像,所以我们称之为“特征脸”。这样对于任意一个样本,它的主成分特征为:(5-6)5.2.2识别阶段识别阶段本文采用三阶邻近算法,对待测样本的主成分和每一训练样本的主成分求距离,将待测样本归类于最小距离的训练样本类别。具体算法过程如下:(1)将每幅人脸图像与平均脸的差值脸矢量投影到“特征脸”空间,即:(5-7)(2)将待识别的人脸图像与平均脸的差值脸投影到特征脸空间,得到其特征向量(5-8)(3)定义识别阈值(5-9)(4)采用欧氏距离来计算与每个人脸的距离(5-10)为了能区分人脸与非人脸,我们还需要计算待识别图像与由特征脸空间重建的图像之间的距离(5-11)最后根据以下规则进行判断:若:(1),则输入图像不是人脸图像(2),1)且对,,则输入图像包含未知人脸2)且对,,则输入人脸图像为人脸库中第i个人脸5.3OpenCV实现PCA算法5.3.1OpenCV简介OpenCV于1999年由Intel建立,现在由WillowGarage提供支持。OpenCV是一个基于BSD许可证授权(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。它具有三个重要的特性:(1)OpenCV拥有包括300多个C函数的跨平台的中、高层API。它不依赖于其它的外部库——尽管也可以使用某些外部库。(2)OpenCV对非商业应用和商业应用都是免费(FREE)的。(3)OpenCV为Intel®IntegratedPerformancePrimitives(IPP)提供了透明接口。这意味着如果有为特定处理器优化的的IPP库,OpenCV将在运行时自动加载这些库[4]。OpenCV可以应用于人机交互、物体识别、图像分割、人脸识别、动作识别、运动跟踪和机器人7大邻域。5.3.2PCA算法实现由上文对PCA算法原理的阐述,几个重要的因素:待训练图像数据、平均图像、训练图像协方差矩阵、协方差矩阵的特征值特征向量、特征向量子空间、待识别图像的子空间投影。以下为PCA算法实现的过程图,如图5-1:PCA算法实现过程。识别训练读取待训练的图像识别训练读取待训练的图像平均图像的求取将图像数据读入指定的矩阵协方差矩阵的求解协方差矩阵特征值特征向量的求解主成分求解获得特征脸空间待识别图像投影欧氏距离的求解邻近图像寻找识别结果图5-1PCA算法实现过程5.4.SO库文件编译5.4.1JNI规则JavaNativeInterface简称JNI,中文为JAVA本地调用。从Java1.1开始,JavaNativeInterface(JNI)标准成为Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。设计的主要目的在于标准的Java类库可能不支持你的程序所需的特性。或许你已经有了一个用其他语言写成的库或程序,而你希望在Java程序中使用它。简而言之就是在C/C++与Java搭建一个接口平台。如图5-2:JNI接口图。FunctionsLibrariesFunctionsLibrariesExceptionsVMClasses图5-2JNI接口图JNI最重要的好处是它没有对底层Java虚拟机的实现施加任何限制。因此,Java虚拟机厂商可以在不影响虚拟机其它部分的情况下添加对JNI的支持。由于Android的应用层的类都是以Java写的,这些Java类编译为Dex形式的Bytecode之后,必须靠Dalvik虚拟机(VM:VirtualMachine)来执行。所以VM在Android平台里扮演着很重要的角色。此外,在执行Java类的过程中,如果Java类需要与C组件沟通时,VM就会载入C组件,然后让Java的函数顺利的调用到C组建的函数。此时VM就成了Java与C/C++连接的纽带,让Java与C组件能通过标准的JNI界面而相互沟通。Java的程式将通过System.loadLibrary(*.so的档案名)这一指令要求VM去载入所指定的C组件。如程序实现:publicclassLibImgFun{ static{ System.loadLibrary("ImgFun"); }}这就要求VM去载入Android的libImgFun.so档案,载入后Java与libImgFun.so档案就组合起来,一起执行。当Android的VM执行到System.loadLibrary()时首先会调用JNI_OnLoad()函数,这个函数将告诉VM此C组件使用的是哪一个JNI版本,所有C组件内的初期值皆由此函数进行初始化。而当VM释放C组件的时候就会调用JNI_UnLoad()来进行善后的清除动作。接下来就是编辑.c/.cpp文件实现本地方法,编译.c/.cpp文件生成动态库。5.4.2库文件编译在工程文件夹下建立jni文件夹,然后新建Application.mk和Android.mk。内容如下:(1)Application.mk文件:#BuildbothARMv5TEandARMv7-Amachinecode.APP_OPTIM:=debugAPP_STL:=gnustl_staticAPP_CPPFLAGS:=-frtti–fexceptionsAPP_ABI:=armeabi-v7aarmeabi(2)Android.mk文件:NDK_USE_CYGPATH=1LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)include../includeOpenCV.mkifeq("$(wildcard$(OPENCV_MK_PATH))","")#trytoloadOpenCV.mkfromdefaultinstalllocationinclude$(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mkelseinclude$(OPENCV_MK_PATH)endifLOCAL_LDLIBS:=-llogLOCAL_MODULE:=ImgFunLOCAL_SRC_FILES:=ImgFun.cppinclude$(BUILD_SHARED_LIBRARY)(3)建立接口文件函数如下例子:JNIEXPORTjintJNICALLJava_com_FaceIdentify_LibImgFun_Recognize(JNIEnv*env,jobjectobj,jstringfilename)(4)利用Cygwin编译工具编译,键入$NDK/ndk-build命令开始编译,结果如图5-3所示图5-3生成库文件6研究结果及分析组成人脸库:将摄像头拍摄下来的人脸图像进行大小统一、图像预处理、人脸提取和边缘检测,再将预处理后的图片进行保存在人脸库中。在程序中可以实现多对一的识别。当然,也可以实现一对一识别(将人脸库里面的人脸图像全部存储为一个人的人脸图像)。程序中设置的是3个人,每人5张图片。读取待训练的图片:将人脸
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电力行业助理的工作职责简述
- 高校人才培养方案的更新
- 2025年全球及中国石油和天然气行业用有机缓蚀剂行业头部企业市场占有率及排名调研报告
- 2025-2030全球桶形立铣刀行业调研及趋势分析报告
- 2025年全球及中国医疗推车液晶显示器行业头部企业市场占有率及排名调研报告
- 2025-2030全球轮胎式破碎机行业调研及趋势分析报告
- 2025年全球及中国剧场动作自动化设备行业头部企业市场占有率及排名调研报告
- 2025年全球及中国单线金刚石线切割机行业头部企业市场占有率及排名调研报告
- 2025-2030全球履带调节器行业调研及趋势分析报告
- 2025-2030全球防水低光双筒望远镜行业调研及趋势分析报告
- 安全生产网格员培训
- 小学数学分数四则混合运算300题带答案
- 林下野鸡养殖建设项目可行性研究报告
- 心肺复苏术课件2024新版
- 2024年内蒙古呼和浩特市中考文科综合试题卷(含答案)
- 大型商场招商招租方案(2篇)
- 会阴擦洗课件
- 2024年山东泰安市泰山财金投资集团有限公司招聘笔试参考题库含答案解析
- 近五年重庆中考物理试题及答案2023
- 全科医医师的临床诊疗思维
- (七圣)七圣娘娘签诗
评论
0/150
提交评论