智能安防系统中人脸识别系统—陈修伍毕业论文最终稿

更新时间:2024-04-30 00:21:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

本科毕业论文(设计)

题 目: 智能安防系统中人脸识别系统

学 院: 自动化工程学院 专 业: 电子信息科学与技术 班 级: 2009级1班 姓 名: 陈修伍 指导教师: 贺 英

2013年 6 月 3 日

智能安防系统中人脸识别系统

Face recognition system in intelligent security system

青岛大学本科生毕业论文(设计)

摘 要

安防系统是实施安全防范控制的重要技术手段,在当前安防需求膨胀的形势下,其在安全技术防范领域的运用也越来越广泛,随着光电信息技术、微电子技术、微计算机技术与视频图像处理技术等的发展,传统的安防系统也正由数字化、网络化,而逐步走向智能化。而实现自动的面部识别对于智能安防系统有着举足轻重的作用,随着Android的兴起,可以做到移动设备上实现人脸识别技术,这就为智能化安保系统的实现提供了全新的思路。

本文的主题就是基于Android编程平台,基于JAVA编程实现在手机上显示从文件夹中读取的人脸位图,编程实现人脸检测PCA算法,实现在人脸图片上用算法自动画出方框标注人脸区域;可设置一张图片中最多检测的人脸个数。

关键词 智能安防 Android 人脸识别 JAVA编程 PCA算法

青岛大学本科生毕业论文(设计)

Abstract

The security system is the important technical means of security control, in the current security demand expansion of the situation, the security technology field is used more and more widely, With the photoelectric information technology, microelectronics, micro computer technology and deal with video images technology, the traditional security systems are also being used by digital, networked, and gradually move toward intelligent. And the realization of automatic facial recognition has play a decisive role for the intelligent security system, with the rise of Android, can be done on the mobile device to realize the face recognition technology, which provides a new approach for the realization of intelligent security system.

This paper is based on the platform of Android programming, Java programming bitmap display face read from a folder on the mobile phone based on PCA face detection algorithm, programming, realize automatic draw the box labeled face region using the algorithm in image face; face detection can be up to set a picture of.

Keywords intelligent security Android face recognition JAVA programming PCA algorithm

青岛大学本科生毕业论文(设计)

目 录

第一章 绪论 ........................................................................................................... 1

1.1 课题背景 ............................................................................................................................ 1 1.2 人脸识别的发展状况 ......................................................................................................... 1 1.3 本课题研究意义 ................................................................................................................. 2 1.4 本文的主要内容及结构 ..................................................................................................... 3

第二章 研究方案及技术路线 ............................................................................... 4

2.1 研究内容 ............................................................................................................................. 4 2.1.1 研究对象 ...................................................................................................................... 4 2.1.2 制约识别率的关键问题 .............................................................................................. 4 2.2 研究方案 ............................................................................................................................. 4 2.2.1 相关人脸识别算法对比 .............................................................................................. 4 2.2.2 运用程序功能分析 ...................................................................................................... 5 2.2.3 研究方案的确定 .......................................................................................................... 6 2.3 技术路线 ............................................................................................................................. 7

第三章 图像预处理 ............................................................................................... 8

3.1 彩图灰度化 ......................................................................................................................... 8 3.2 直方图均衡化 ..................................................................................................................... 9 3.3 图像平滑滤波 ................................................................................................................... 10 3.4 边缘检测 ........................................................................................................................... 10 3.5 人脸部位提取 ................................................................................................................... 11

第四章 基于Android的人脸检测技术原理 ..................................................... 13

4.1 Android编程平台 ............................................................................................................. 13 4.1.1 Android 开发平台搭建 ........................................................................................... 13 4.1.2 Android开发简介 .................................................................................................... 13 4.2 人脸图像获取 ................................................................................................................... 14 4.2.1 Android 应用程序组件(Activity简介) .................................................................... 14 4.2.2 Bitmap和Drawable和Canvas ................................................................................. 17 4.3 PCA算法原理分析 .......................................................................................................... 18 4.3.1 训练阶段 .................................................................................................................... 18

I

青岛大学本科生毕业论文(设计)

4.3.2 识别阶段 .................................................................................................................... 19 4.3.3 PCA算法实现流程 ................................................................................................... 19

第五章 人脸检测android系统实现 ................................................................. 21

5.1 新建工程 ........................................................................................................................... 21 5.2 重要程序段及设置 ........................................................................................................... 23 5.2.1 应用界面设计程序 .................................................................................................... 23 5.2.2 界面启动程序 ............................................................................................................ 24 5.2.3 创建包 ........................................................................................................................ 24 5.2.4 创建图片 .................................................................................................................... 25 5.2.5 获取人脸图片 ............................................................................................................ 25 5.2.6 人脸的眼部定位 ........................................................................................................ 25 5.2.7 定义图片大小 ............................................................................................................ 27 5.2.8 创建位图及画板 ........................................................................................................ 27 5.3 按钮的设置 ....................................................................................................................... 30

第六章 研究结果及分析 ..................................................................................... 32 第七章 总结 ......................................................................................................... 34

7.1 全文总结 ........................................................................................................................... 34 7.2 前景展望 ........................................................................................................................... 34

参考文献 ................................................................................................................. 36 致 谢 ..................................................................................................................... 37 附 录 ..................................................................................................................... 38

II

青岛大学本科生毕业论文(设计)

第一章 绪论

1.1 课题背景

现在,人们购房时已不仅是追求舒适、温馨的生活环境,而且更加关心居住环境是否具有安全感。对外网络联系系统、社区信息和物业服务的社区网络系统及保障安全的高科技预警监控系统,将是人们衡量小区智能化水平的最基本条件[1]。

但目前所使用的安防系统主要依赖人的视觉判断,而缺乏对视频内容的智能分析。由此使得安防系统只能完成时间内的视频存储记录,仅可为事后分析提供证据。而其在事前预/报警的缺位,也让保平安的意义大打折扣。随着光电信息技术、微电子技术、微计算机技术与视频图像处理技术等的发展,传统的安防系统也正由数字化、网络化,而逐步走向智能化[1]。

智能安防系统结合了先进的现代计算机技术、现代控制技术、现代通信技术、现代图像显示技术实现系统的有机结合,采用国内外先进的监控设备,旨在建立为住户提供一个安全、便捷的生活环境,把本系统建成符合实际需要、经济实用、技术先进、操作方便、可扩展能力强、管理规范的一流的安全防范监控系统[1]。

就智能化安防系统来说,一个完整的智能安防系统主要包括门禁、报警和监控三大部分。智能化是智能安防与传统安防的最大区别,我国安防产业发展虽然很快,也很普及,但是相对来说比较传统,耗费巨大人力物力。因此,如何才能更加有效和方便地进行安防系统的智能控制是一个迫切需要解决的问题。而Android系统的兴起为为我们提供了一条很好的发展道路。

Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发,Android平台具有良好的开放性和出色的性能[2]。并且源程序都是免费开源的,基于这个原因我们在智能安防系统中使用Android平台。Android系统经过最近的发展已经变得非常成熟和稳定,尤其在智能手机上的应用,让我们看到了非常广阔的前景,同时它还有具有以下优点:开放性、不受束缚、丰富的硬件、方便开发、Google应用等。

基于上述背景,Android平台的人脸识别技术将在智能安防系统中发挥关键性的作用。由于人脸识别技术具有如下特点:无接触、方便、直观和隐蔽性好,因而受到了国内外众多学者关注与研究。

1.2 人脸识别的发展状况

人脸识别技术在现在的生活中已经应用到很多领域中,并发挥了重要的作用。人脸识

1

青岛大学本科生毕业论文(设计)

别技术的研究开始于1966年,来源于PRI的Bledsoe的工作,经过这么长时间的发展,人脸识别技术取得了巨大的进步,每年都有大量的学术论文发表。总体来说,人脸识别研究的历史状况大体划分为三个阶段[3]:

第一阶段是20世纪50年代到20世纪60年代,基于面部特征的人脸识别是研究的重点,其中的代表人物是Bertillon、Parke和Allen。Bertillon主要是结合指纹识别技术,并同时使数据库中的一张脸与自己编辑的一个程序语句对应,从而创建起了一个很好的身份识别系统。为了解决人脸识别率问题,Allen提出了一种逼真的摹写给将要识别的人脸,且取得了良好的效果[4]。但是Parke在计算机上第一次完成了Allen的设想,并且首次得到人脸灰度图模型,改模型的质量较高[5]。该阶段的识别几乎都是通过人工完成,没有自动识别的功能,这也正是该阶段系统的缺点。

第二阶段是20世纪70年代,人脸识别研究进入人机交互式的识别阶段,代表人物为 Goldstion、Harmon和Lesk。他们表征人脸正面图像用的是脸部正面矢量图像的几何特征,面部特征用21维特征向量来表示,新的识别系统就是在这个基础上建立起来[6]。Kaya和Kobayashi表征人脸特征用的是欧氏距离。T.Kanad基于使用积分投影方法从单幅图像中提取出一组脸部特征向量,设计了一个高速半自动回溯识别系统,再借助于模式判别分析技术来匹配标准人脸,这种系统实现了对人脸识别的实时、快速的处理[7]。整体上说,这些方法对操作人员的先验知识有很高的要求,属于半自动化。

第三阶段是是实现机器自动识别。尤其是近年来计算机性能和速度的提高,所以计算速度和数据处理能力大大增加,用于人脸模式识别的算法取得了很大的突破,提出了多种全自动人脸识别系统[8]。除此之外,近年来,在奇异值分解为代表的代数特征方法和基于K-L变换的特征脸方法都获得了突破,同时人工神经网络、小波变换技术等在人脸识别技术研究中也都得到了广泛的应用[14]。

早在80年代,我国就开始了在人脸自动识别领域的研究。我国许多研究机构、大专院校已经在图像处理和模态分析等方面都取得了丰硕的研究成果,对人脸识别的研究和应用开发工作领域进行了大量的研究。人脸自动识别系统会对人们的生产生活取得巨大的影响,而人脸识别技术也会有着非常广阔的应用前景[15]。

1.3 本课题研究意义

用来实现个人身份信息确认人脸识别技术是基于生物特征识别技术来确定人的脸部特征信息的。与指纹识别技术相比,人脸识别具有不接触性、准确率高、识别速度快等优点,多应用于重要行业和领域,人脸识别技术在民用市场也有很广应用的前景,如:智能门禁、门锁、考勤、手机、数码相机、智能玩具等。人脸识别主要有一下几种应用:

1、用于电脑、智能访问控制、网络安全、银行业务、边境控制等领域的身份鉴定。 2、将随时采集的面部数据与数据库中的数据对比实现身份确认。

2

青岛大学本科生毕业论文(设计)

3、通过视频监控画面捕捉面相,可以快速识别罪犯并跟踪他和确定他的藏身位置[10]。 近年来,欧美很多发达国家真正把人脸识别技术推进到实用阶段,人脸识别成为了市场的宠儿得到广泛应用从而开启了新的数字化生活方式。可以乐观的预计,在人脸识别时代,智能安防体系将得到全面完善,是智能安防系统走入一个新纪元。

1.4 本文的主要内容及结构

本论文所完成的任务是基于Android编程平台,在Android手机上实现人脸识别功能。对进入小区的人员身份进行确认,保证小区的人员、财产安全等。本论文在总体结构上共分为7章。

第1章绪论, 本章介绍了智能安防系统,Android和人脸识别的背景、意义。 第2章研究方案及技术路线,本章主要介绍人脸识别的各种算法、方案和实现的技术路线。

第3章图像的获取,本章介绍了Android编程平台的基础知识,人脸图像的获取途径,及初步处理方案。

第4章图像预处理,本章介绍了相关图像处理的算法以及实现,其中包括彩色图像的灰度化、灰度图像的直方图均衡化、图像的平滑滤波、边缘检测等。

第5章PCA算法及实现,本章介绍了基于Android编程的程序实现。 第6章研究结果及分析,本章对研究结果叙述,以及分析。 第7章结论,对全文进行总结,并对该课题的前景进行展望。

3

青岛大学本科生毕业论文(设计)

第二章 研究方案及技术路线

2.1 研究内容

2.1.1 研究对象

本文涉及的研究对象是从智能手机存储的图片中的人脸图像,并对人脸图像进行一定算法的处理,以达到相关识别算法的要求,分析出图片中人脸的个数并予以标记,并显示在屏幕上,已达到分辨人脸的效果。同时显示出图片中有多少人脸即人的个数,从而达到分辨人的目的。

2.1.2 制约识别率的关键问题

人脸识别技术进过长时间的发展,在识别率方面有了很大的改善和提高,但是在相关技术领域仍然面临着问题。主要是在一下几方面表现欠佳:

1、 采集设备:人脸的数据图像数据采集时会由于设备的性能和设备的设置,从而使获取的数据变化很大,怎样解决这个问题还值得好好研究。

2、 背景及光照的影响:背景的不同关系到识别的准确率,然而光照却是影响人脸识别性能的最关键因素。对这个问题的解决能直接关系着人脸识别应用程序的稳定性,可靠性,准确率。

3、 人脸姿态:现今人脸识别实用化进程中的一个瓶颈是人脸姿态问题。以后的研究方向会集中在将不同姿态的人脸统一到一个标准人脸结构,从而提高人脸的识别率。

4、 表情问题:人脸表情很是丰富,但是在人脸识别方面会影响数据的采集和提取,这个问题也将对后续的算法处理产生非常大的影响。

2.2 研究方案

2.2.1 相关人脸识别算法对比

现今科技文献中常提及的人脸识别的方法主要有:隐马尔可夫模型的方法、模版匹配的方法[11]、几何特征的方法、特征脸方法、基于神经网络的方法等[12]。

1、基于几何特征:几何特征识别的方法是基于层次聚类思想,用一个几何特征矢量反应人脸,实现人脸识别。可以把人脸器官的形状和与之相对应的几何关系为基础的特征矢量来表示几何特征矢量,通常包括人脸特定两点间的欧氏距离、曲率、角度来反应。人脸器官的关键点分别与不同的积分投影方式产生的波峰波谷相对应。

4

青岛大学本科生毕业论文(设计)

2、基于模版匹配:模板匹配方法是根据人脸轮廓、眼睛、鼻子和嘴巴的轮廓特征或者灰度特征计算结果,手工构造一个标准的人脸模式或者参数化的人脸模式。这个方法大多采用归一化互相关法,直接计算出图像之间的匹配度。

3、隐马尔可夫模型: hidden Markov model ,HMM(中译为隐马尔可夫模型)是用于描述信号系统特征的一种常见的统计模型,多用于语音判定。依照一种自然的顺序,即从上到下、从左到右来表征人脸面部特征的分布,这种顺序不会随着人脸在平面和垂直方向上发生旋转而变化,但是实现起来的难度较大。

4、基于神经网络识别:基于神经网络的方法是近年来研究的一个主流研究方向。人工神经网络(ANN)的神经元中的一个节点的处理单元(一个模拟人的脑细胞和简化)之间的加权连接拓扑。Cottrell 等人进行人脸识别使用的是级联BP 神经网络方法,对部分受损的人像、光照有所变化的人像,有很好的识别能力,但是神经元数目通常很多,训练时间很长,具有固有缺陷:收敛速度慢、容易陷入局部极小、先验参数多且参数的确定凭经验而定。

5、特征脸识别:特征脸法是一种常用的人脸识别方法。这种方法主要是从人脸图像的全局,KL变换使用的理论,原始空间的一组正交向量,并以此构成新的人脸空间,使所有人脸的均方差最小,达到将为的目的。降维的思想,降低了运算量,此算法多运用于硬件配置相对中低端的手持设备中。但是此算法也存在缺陷:特征脸方法容易受多种因素的干扰导致识别率下降,例如:角度、光照、表情等。

通过以上算法的介绍,结合算法的特征还有应用的平台,我们选择PCA算法。因为这样我们可以减少大量的计算过程,从而提高程序运行的效率,因为实现手机上的运行我们更重视考虑到运算量的大小,综合考虑本文的主要算法实现我们采用PCA算法。

2.2.2 运用程序功能分析

本文应用程序最主要的功能就是要能识别出人脸,首先该系统需要通过SD卡中存取的图像而获取到的原始的人脸图片进行一系列处理才可进行下一步的工作,该处理过程也称图像预处理。预处理这个模块在整个人脸识别系统的开发过程中占有很重要的地位,只有预处理模块做的好,才可能很好的完成后面的特征提取这一关键模块。因此本设计中所要完成的主要功能如下所述:

图像存取:在手机SD卡中建立相关文件夹,用于存取人脸图像,其中包括待识别图像以及相关的数据。

图像获取功能:主要是调用SD卡中的图像,进入处理程序。

图像预处理:主要是对获取的图像进行灰度化、直方图均衡化、平滑滤波、等处理。 图像特征的提取:按照PCA算法对图像进行特征提取。

识别功能:这部分功能主要依据程序设置,对图像里人的眼睛进行标注,从而识别出人脸图像。

5

青岛大学本科生毕业论文(设计)

2.2.3 研究方案的确定

通过以上分析本文的研究方案确定为以下几点:

熟悉Java编程语言为进一步熟悉Android编程平台打下基础,初步实现利用Android手机实现存取和读取文件夹里照片的功能。

查阅并重新学习数字图像处理的相关知识,为图像预处理打下坚实的理论基础。学习各种图像处理的算法,然后运行软件编程,通过程序的实际运行效果进行相应的调整、改进。主要预处理步骤如图2.1:图像预处理层次图。

图像预处理 彩色图像的 灰度化 灰度图像的直方图均衡化 图像的平滑 滤波 图像的边缘 检测 图2.1 图像预处理层次图

图像预处理获取标准人脸后,学习人脸识别相关算法,对主要人脸识别算法进行归纳、总结。确定本课题人脸识别算法,并对算法认真研究、理解并写成相应的程序。最终实现人脸识别算法在Android平台上的运行,完成本课题要求。

6

青岛大学本科生毕业论文(设计)

2.3 技术路线

由以上分析,技术路线如图2.2:人脸识别技术路线。

图2.2 人脸识别技术路线

7

青岛大学本科生毕业论文(设计)

第三章 图像预处理

由于使用的人脸图像来源于手机存取图像,这些图像在产生、传输和变换会受到种种原因的影响,使得图像产生变差或是退化,而这种变化会使产生的图像与原始景物之间存在某些差异,这些差异一般会使人脸图像的对比度差、人脸边沿模糊、噪声较大等。这些差异对下一步的图片处理带来了极大困难和不便,因此就很有必要对人脸图像进行一些相应的处理,以来改善图像的视觉效果,来提高图像的清晰度,便于提高后期的图像识别识别率,这一过程就是图像的预处理。

人脸图像预处理的方法主要有:人脸图像灰度化、人脸图像二值化、人脸图像几何校正、直方图均衡化、人脸图像的滤波、图像锐化、像素平均等[13]。

3.1 彩图灰度化

人脸识别技术的研究不是直接利用原始的彩色图像,一般是采用将彩色图片灰度化之后的灰度图像作为研究对象。这是因为彩色图像包含了太多的人脸的信息,而直接将彩色图像作为研究对象会使处理的过程变得相当的复杂,不利于识别也减缓了算法的运行速率。而灰度图在保留人脸信息量不丢失的情况下,减少了信息总量,为后期的识别算法提供了具体的可行性。

把彩色图像进行灰度化,大多采用以下经验公式:

Gray?0.39R?0.50G?0.11B (3-1) 具体过程如:图3.1 彩色图像的灰度变换

读取图像数据 获取 RGB分量 计算像素点灰度值 像素点重新赋值 得到灰度图 图3.1 彩色图像的灰度变换

Android程序实现的主要代码:

int color = pix_result[width * i + j]; int red=Color.red(color);

int green=Color.green(color); int blue=Color.blue(color);

color = (int) ( (float)red*0.3 + (float)green*0.59 + (float)blue*0.11)&0xFF;

8

青岛大学本科生毕业论文(设计)

3.2 直方图均衡化

图像直方图是图像像素的灰度值的统计衡量。反应图像的直方图可以是一个很好的总体概述,图像是值得大大的不同情况,如图像中的目标的背景下,分布,也可以计算出的最大和最小灰度值图像,平均灰度值,对比度等。应用到图像的预处理,我们称为直方图均衡化(也被称为校正直方图),其基本思想是,每个灰度级组件尽可能均匀地分布在整个图像中的空间中,在直方图中的性能上的理由密集的灰度分布变得均匀分布,从而提高了图像的对比度。另外,直方图均衡化也可以降低干扰的线图像,冲击,更容易地使图像的特征提取,并在同一时间,提高图像的主观质量的。实践证明,直方图均衡是一种有效的方法,用于图像增强。

直方图均衡化就是要建立一个T变换,对于连续的图像来说:用变量R来代表待增强图像的灰度级。假设R被归一化到区间[0, 1],且R=0代表黑色、R=1代表白色。之后用一个离散公式并允许像素值在区间[0,L-1]。这样我们建立变换:

S?T(R)0?R?1 (3-2)

在输入图像中,对于每个像素值R产生一个灰度值S。T(R)满足一下条件: (1)T(R)在区间0?R?1上为单值且单调函数 (2)当0?R?1时,0?T(R)?1

这样就保证了T(R)的反变换存在,单调的条件就保证了输出图像是从黑到白的顺序,最后由S到R的反变换可表示为:

R?T?1(S)0?S?1 (3-3)

对于离散的数字图像,其方法可以表示为:

L?1iR??nk?0.5Ak?0(i?0,1,,L?1) (3-4)

其中A为图像面积,L为图像灰度级,nk表示灰度级为k的像素点的总数。 算法实现流程,如图3.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]]; return PixelsGray;

9

获取原图像 信息 统计各灰度级概率密度 原图像直方图均衡化 返回均衡化的像素点数组

图3.2直方图均衡化算法流程

青岛大学本科生毕业论文(设计)

3.3 图像平滑滤波

人脸图像在采集过程中,受到各种因素的干扰,并将收到干扰的信息保留在图像中。为了避免噪声对图像的特征抽取的影响,需要消除噪声,消除噪声的主要方法分为两类:一类是全局处理,包括Wiener滤波、Kal-man滤波等方法。二类是使用局部算法,如均值滤波、中值滤波、梯度倒数加权滤波等经典算法。基于实现方式的简易度,我们采用的是均值滤波的方式。

均值滤波就是每一个像素值用其局部邻域内的所有值的平均值来代替,数学公式如下:

1f(k,l) (3-5) ?m(k,l)?N其中m为邻域内像素点的总数。如在像素点(i,j)处取3x3的邻域,这样得到公式如下:

h(i,j)?1i?1j?1h(i,j)???f(k,l) (3-6)

9k?i?1l?j?1其中值得注意的是邻域N控制着滤波程度,对应卷积模板的大尺度会加大滤波能力,但是这样会导致图像细节的损失。

设计线性平滑滤波器时,为使得滤波器只有一个峰值要合适的选择滤波权值,并且权值模版在水平和垂直方向上都是对称的,以下就是一个典型3x3平滑滤波器的权值模板:

?1?16??1?8?1???161814181?16??1? 8??1??16?线性平滑滤波器过滤掉了高频成分和图像中的锐化细节。如把阶跃变化过渡,平滑成逐渐变化,使得精确定位的能力下降[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);

3.4 边缘检测

图像的边缘是图像非常重要的特征因为原始图像中的大部分相当重要的信息保留在了图像的边缘中。为了使得总的数据量减少,同时为后续特征提取的计算量减少,因此使

10

青岛大学本科生毕业论文(设计)

用图像边缘检测技术。提取图像边缘的标准是在灰度图像中灰度值变化剧烈的地方。

边缘的衡量常由灰度值的剧烈变化来表示,由此我们想到在数学上,最直观的模型就是微分。在进行微分之前,我们应该对要输入的图像进行噪声消除处理,以来保证图像中的高频成分与原始图像中的一致。

比较经典的常用的算法有:差分边缘检测、Roberts边缘检测算子、Sobel边缘检测算子、Prewitt边缘检测算子等。本文就是采用Sobel算子进行图像的边缘检测。

对于数字图像而言,可以用一阶差分来代替一阶微分。对图像x, y两个方向进行差分:

?xf(x,y)?f(x,y)?f(x?1,y) (4-7)

?yf(x,y)?f(x,y)?f(x,y?1) (4-8) 求梯度时,对平方和的开方运算,可以用两个分量的绝对值之和来表示。如下公式:

Gf(x,y)?(?xf(x,y))2?(?yf(x,y))2?xf(x,y)+?yf(x,y) (4-9)

Sobel算子是一种基于梯度幅值的计算方法,通过对数字图像f(x ,y)的每一个像素的四邻域点的灰度值的加权差,与邻点的权值大小。先做成加权平均,再微分,再求梯度。具体的算法表达如下:

?xf(x,y)?f(x?1,y?1)?2f(x,y?1)?f(x?1,y?1) (4-10)

?f(x?1,y?1)?2f(x,y?1)?f(x?1,y?1)?yf(x,y)?f(x?1,y?1)?2f(x?1,y)?f(x?1,y?1) (4-11)

?f(x?1,y?1)?2f(x?1,y)?f(x?1,y?1)根据以上推论,定义Sobel算子如下:

s(x,y)??xf(x,y)??yf(x,y) (4-12)

Sobel算子通过这两个模板在图像区域中移动,完成图像中每个像素点与这两个卷积核的卷积运算,其核心是两个3x3的卷积和。 Sobel算子的卷积和如下:

??101???Sx???202?,??101????121???Sy??000?

??1?2?1???鉴于算法的复杂度非常大,本文采用库函数实现图像的边缘检测,具体实现核心代码如下:

pImgSobelgray = cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1); cvSobel(pImg8uSmooth,pImgSobelgray,0,1,3);

3.5 人脸部位提取

由于用手机提取照片时,提取的照片中常常含有丰富的背景信息,这就为后续的识别步骤带来了困难。本文将通过编程实现检测函数,对人脸部位进行检测,并将人脸部位保

11

青岛大学本科生毕业论文(设计)

存为图像存储下来供后面识别,这样就减少了背景对识别的影响。

检测图像中的人脸,利用库函数vHaarDetectObjects( ),函数原型如下: CvSeq*cvHaarDetectObjects(constCvArr*image, CvHaarClassifierCascade*cascade, CvMemStorage* storage, double scale_factor=1.1, int min_neighbors=3, int flags=0, CvSize min_size=cvSize(0,0) );

12

青岛大学本科生毕业论文(设计)

第四章 基于Android的人脸检测技术原理

4.1 Android编程平台

4.1.1 Android 开发平台搭建

本文android开发平台是在Windows环境下搭建的,具体方法步骤如下:

在Oracle官方网站上可以免费下载最新的JDK安装程序包,网址为:http://www.oracle.com.下载完成后打开,按照默认路径安装JDK软件包。点开开始菜单,在CMD命令窗口输入java -version命令检查是否成功安装程序包。若成功安装会显示出JDK版本号等相关信息。下一步就是配置环境变量:在系统环境变量里添加PATH变量,内容为JDK安装目录中bin文件夹下,并同时增加CLASSPATH变量,内容为JDK安装目录中lib和demo的路径。是用;来做分隔符的。

登陆Android官方网站http://developer.android.com,下载最新版本的SDK安装包,也可下载以往版本的SDK安装包。下载完成后解压,不需要安装。但是要同样需要配置环境变量。将SDK解压后的目录下的tools目录的绝对路径添加到系统Path中,然后同样用DOS CMD 命令 android –h检查是否安装成功。

登陆Eclipse官方网站http://www.eclipse.org,下载适用版本的Eclipse。将下载完成的Eclipse安装包解压硬盘。双击eclipse.exe打开eclipse软件,在Help->Install New Software,安装ADT。完成后重启,在Widows->Preferences下选择android->Browse添加android SDK路径,单击OK完成。

这样android开发环境基本搭建完成。Android开发环境搭建好了就可已进行android应用程序的开发了。

4.1.2 Android开发简介

Android平台是在Linux 2.6.25 版本的基础上改造的,提供了各种的函数库和应用程序的完整框架。Android大体上分为4层:Linux内核,程序库,应用程序框架以及应用程序。具体参看图4.1:Android平台架构图。

13

青岛大学本科生毕业论文(设计)

图4.1 Android平台架构图

应用程序是包括Android平台配置的一套应用程序集,以及用户基于Android平台的应用程序框架,使用Java语言自行开发的程序。

应用程序框架:开发者可以完成使用与那些内核应用程序相同的,用于简化和重用应用程序的组件的框架。通过应用程序,用户自定义的程序可以执行用户程序之外的预设功能,这样可以极大的减少用户程序的额外工作量。

系统开发库:Android定义了一套C/C++ 库供 Android 平台的其他组件使用。这些功能通过Android应用程序框架提供给开发者,开发者不能直接使用这些库[14]。

Linux内核:Android的核心系统服务依赖于Linux2.6内核,如内存管理、进程管理、驱动模型等。Linux内核也同时作为硬件和软件栈之间的抽象层[14]。

4.2 人脸图像获取

4.2.1 Android 应用程序组件(Activity简介)

在 android 中,Activity 拥有四种基本状态,即Active/Running状态、Paused状态、Stopped状态、Killed 状态。

14

青岛大学本科生毕业论文(设计)

(1) Active/Running状态,一个新 Activity 启动入栈后就会自动处于栈的最顶端,它被显示在屏幕的最前端,此时它处于能被用户交互和用户可见的激活状态[15]。

(2) Paused状态,当 Activity 处于后台运行时或被其他的覆盖时,他并没有被退出程序实质上还是在运行态,此时它依然与处在窗口管理器中,系统继续维护其内部状态,所以它仍然可见,但它已经失去了焦点只是不能与用户交互。

(3) Stopped状态就是 Activity 被另外一个 Activity 覆盖、失去焦点并不可见时的状态。

(4) Killed 状态,Activity 被系统回收或者没有被启动时。

Android管理 Activity 的方式是通过一种 Activity 栈来实现的,一个Activity的实际的状态定义了它在堆栈中的位置。处在栈的顶端的是处于前台的 Activity,当前台的 Activity 因异常或其它原因被Killed时,处于栈第二层的 Activity 将被激活顺序移动到栈顶。当新Activity 启动入栈时,新 Activity 会取代当前Activity,原来处于栈顶的Activity被压入到栈的第二层。一个 Activity 在栈中的位置变化反映了它在不同状态间的转换[3]。如图4.2所示是Activity 的状态转换图:

图4.2 Activity 的状态转换图

Android 程序员只可以决定启动一个新的 Activity,但不能手动的,借助外部因素的结束一个 Actity。每个Activity都有自己的生命周期,而Activity的生命周期统一交给系统管理。如图4-3:Activity生命周期示意图。

15

青岛大学本科生毕业论文(设计)

图4.3 Activity生命周期示意图

Android平台定义了一种称为Intent(意向)的异步消息,该消息用于激活Activity、Service和Broadcast Receiver组件。具体用法如下:

Intent intent=new Intent();

Intent.setClass(FaceDetectorActivity.this,Resgistered.class); startActivity(intent);

16

青岛大学本科生毕业论文(设计)

4.2.2 Bitmap和Drawable和Canvas

Drawable就是一个可以在上面作画的对象,可能是BitmapDrawable(一张位图),也可能是ShapeDrawable(一个图形),还有可能是LayerDrawable(一个图层),创建的可画对象要根据画图的需求来确定。

Bitmap位图,用于图的处理。它是android系统中图像处理的最重要类之一。用它可以显示图像文件的信息,进行图像的剪切、旋转、缩放等操作,并可以指定格式保存图像文件。从资源中获得bitmap对象,两个方法:通过bitmapfactory,来完成或者通过BitmapDrawable(inputStream i).getBitmap() 来完成。

1、从资源中获取Bitmap Java代码

Resources res = getResources();

Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon); 2. 获取位图的信息

要获取常常要先获取Bitmap,位图信息包括:位图大小、像素、density、透明度、颜色格式等,在Bitmap中使用Bitmap.Config定义RGB颜色格式,仅包括4种格式:ALPHA_8、ARGB_4444、ARGB_8888、RGB_565。;

Bitmap通过提供compress( )接口来压缩图片,但是在AndroidSAK只支持两种格式的图片压缩:PNG、JPG格式。

3. 显示位图

可以使用核心类Canvas显示位图,通过Canvas类的drawBirmap()显示位图,或者借助于BitmapDrawable来将Bitmap绘制到Canvas。当然,也可以通过BitmapDrawable将位图显示到View中。

常用显示代码如下:

ImageView iv = (ImageView) findViewById(R.id.img); Iv.setImageBitmap(bitmap);

基于第3点,显示位图时可以使用核心类Canvas。Canvas类代表画布,通过该类提供的构造方法,可以绘制各种图形。绘制图像时同样在Android使用的是画笔Paint类。Paint 中包含了很多方法对其属性进行设置,主要方法如下: setAntiAlias: 设置画笔的锯齿效果。 setColor: 设置画笔颜色

setARGB: 设置画笔的a,r,p,g值。 setAlpha: 设置Alpha值 setTextSize: 设置字体尺寸。

setStyle: 设置画笔风格,空心或者实心。

17

青岛大学本科生毕业论文(设计)

setStrokeWidth: 设置空心的边框宽度。 getColor: 得到画笔的颜色 getAlpha: 得到画笔的Alpha值。

4.3 PCA算法原理分析

PCA算法将图像定义为具有一定分布的随机向量。但是由于人脸总体构型的相似性,人脸图像在其中的分布并不是随机的,PCA算法可以获得人脸图像分布的主成分方向,从而使用人脸图像的主成分来表达人脸。它使得图像数据在一个低维的空间进行处理,在保持了原有大部分信息量的基础上,大大的减少了运算量,这样有利于在移动设备上的开发使用。从本质上而言,这是一种基于统计分析的信息压缩算法。

PCA算法运用于人脸识别主要分为连个阶段:训练阶段和识别阶段。

4.3.1 训练阶段

设人脸图像f(x,y)用N=width*height维向量,人脸图像训练集可以看作是M?N维的随机向量X??X1,X2,X3,像的向量表示为:

,Xm?,其中m是训练样本图像数目。则这m幅图像的平均图

1mX??Xi (4-1)

mi?1每个人脸Xi与平均人脸图像X的差值定义为?i:

?i?Xi?X这样训练图像的协方差矩阵表示为:

(i?1,2,3,,m) (4-2)

1m1mT???(Xi?X)(Xi?X)???i?iT (4-3)

mi?1mi?1式中X是N维向量,则?就是N?N维向量。

设?i和Vi分别是协方差矩阵?的特征值和特征向量,其中i?1,2,3,小到大顺序排列:?1??2??3?征向量?i为:

将特征值按从,m,

??m。这样就很容易计算出协方差矩阵?的正交归一特1?Vi?i?i?i?1,2,3,,m (4-4)

进一步我们获得特征脸????1,?2,?3,,?m?

为了进一步减少计算量,我们提出特征值的贡献率(选取的特征值在总的特征值的和比),选取前P个最大特征值以及对应的特征向量[7]。

18

青岛大学本科生毕业论文(设计)

??????i?1i?1i?mi?pi?aa?90% (4-5)

i这样我们就将每一幅人脸图像投影到由Vi组成的子空间中,使得每一幅人脸图像对应于子空间中的一个点。也可以理解为每个子空间中的一个点对应着一个人脸图像,由于这些点很像人脸图像,故我们称之为“特征脸”。这样对于任意一个样本X,它的主成分特征为:

y?(?1,?2,,?m)TX (4-6)

4.3.2 识别阶段

我们采用三阶邻近算法来进行识别阶段,对待测样本的主成分和每一训练样本的主成分求距离,将待测样本归类于最小距离的训练样本类别。具体算法过程如下:

(1)将每幅人脸图像与平均脸的的值做差,其得到的差值脸矢量投影到“特征脸”空间,即:

?i??T(Xi?X)(i?1,2,3,,m) (4-7)

(2)将待识别的人脸图像X与平均脸的差值脸投影到特征脸空间,得到其特征向量?x

?x??T(X?X) (4-8)

(3)定义识别阈值?

??1max?i??j2i,ji,j?1,2,3,?,m (4-9)

(4)采用欧氏距离来计算?x与每个人脸的距离?i

???i??之间的距离

2ix2i?1,2,3,,m (4-10)

为了能区分人脸与非人脸,我们还需要计算待识别图像X与由特征脸空间重建的图像

??X?Tf其中 Tf???x?X最后根据以下规则进行判断:

若:(1)???,则输入图像不是人脸图像

(4-11)

(2)???, 1)且对?i,?i??,则输入图像包含未知人脸

2)且对?i,?i??,则输入人脸图像为人脸库中第i个人脸

4.3.3 PCA算法实现流程

由上文对PCA算法原理的阐述,几个重要的因素:待训练图像数据、平均图像、训练图像协方差矩阵、协方差矩阵的特征值特征向量、特征向量子空间、待识别图像的子空间

19

青岛大学本科生毕业论文(设计)

投影。

以下为PCA算法实现的过程图,如图4.4:PCA算法实现过程。

读取待训练的图将图像数据读入指定的矩阵 平均图像的求取 主成分求解获得特征脸空间 待识别图像投影 欧氏距离的求解 邻近图像寻找 识别结果 协方差矩阵的求解 协方差矩阵特征值特征向量的求解 图4.4 PCA算法实现过程

20

青岛大学本科生毕业论文(设计)

第五章 人脸检测Android系统实现

本文所做的关于人脸系统实现是基于Android平台编程实现的,主要是是基于Java程序实现,同其他编程软件一样,Android程序的实现也是在搭建好的平台上建立新的工程实现的。

5.1 新建工程

首先在新打开的eclipse下,选择菜单file->new 进入如图5.1新建文件界面:

图5.1 新建文件图

点击后进入如图5.2输入工程名界面:

21

青岛大学本科生毕业论文(设计)

图5.2 输入工程名

在application name中输入工程名:AndroidFaceDetection,之后点击next,进入下面界面,如图5-3新建文件图下一步 文件存储空间:

图5.3 文件存储空间

22

青岛大学本科生毕业论文(设计)

之后一直点击next即可,直到出现finish按钮,新工程及建立起来,可以编写程序了。程序编辑完之后程序都存在src文件夹下,我们点击可以看到自己文件下的程序包含几个程序。本文涉及的程序src下主要有2个程序:myimageview.java、tutorialonfacedetect.java。分别是:图像视图、人脸检测程序。如图5.4 工程包含文件:

图5.4 工程包含文件

5.2 重要程序段及设置

5.2.1 应用界面设计程序

在众多的屏幕应用界面给自己的app设置一个合适名字,方便寻找,能直观明白的看出此app的作用,这是基于程序设置实现的,此程序存在于androidmanifest.xml 中,本文将自己的app名字设为:TutorialOnFaceDetect。程序段如下:

android:icon=\

android:label=\

android:name=\ android:label=\

23

青岛大学本科生毕业论文(设计)

5.2.2 界面启动程序

通常程序开始时,我们会载入照片,来作为app启动时的初始界面,并开始进行检测,下面就是我们用的程序段(仅是段程序):

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); // LayoutParams.WRAP_CONTENT)); setContentView(R.layout.main);

mIV = (MyImageView) findViewById(R.id.iv_no); idetifyButton = (Button) findViewById(R.id.indetify); selectButton = (Button) findViewById(R.id.select); idetifyButton.setOnClickListener(new OnClickListener()

//setContentView(mIV,newLayoutParams(LayoutParams.WRAP_CONTENT,

mIV.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.face3)); 为使得欢迎界面更加的美观也可以定义启动欢迎字符定义程序启动欢迎字符串和系统程序名字符串。实现代码如下:

5.2.3 创建包

创建包package cliu.TutorialOnFaceDetect

添加一个通用的Android Activity:TutorialOnFaceDetect import android.media.FaceDetector;

public class TutorialOnFaceDetect extends Activity {

private MyImageView mIV;//引用了facedetector

mIV.invalidate();

super.handleMessage(msg);

public void handleMessage(Message msg) {

执行父类的消息方法

super.onCreate(savedInstanceState);

调用父类的onCreate构造函数savedInstanceState是保存当前Activity的状态信息 mIV = new MyImageView(this);

setContentView(mIV,new

LayoutParams(LayoutParams.WRAP_CONTENT,

24

青岛大学本科生毕业论文(设计)

LayoutParams.WRAP_CONTENT));

5.2.4 创建图片

setContentView就是设置一个Activity的显示界面,

使用setContentView可以在Activity中动态切换显示的View,这样先用LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。

在屏幕上一块区域,WRAP_CONTENT,包裹组件:

Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.face1);

mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true); b.recycle();

采用Bitmap叠加Drawable文件夹中的face1图片

b.copy根据该位图的大小产生一个新位图,根据指定的结构设置新位图的结构,然后把位图的像素拷贝到新位图中,返回的位图和原图有同样的像素密度。参数:config结果图预期的结构,isMutable:如果是true,那么产生的图片是可变的。

mFaceWidth = mFaceBitmap.getWidth();

mFaceHeight = mFaceBitmap.getHeight(); mIV.setImageBitmap(mFaceBitmap);

5.2.5 获取人脸图片

调用doLengthyCalc()方法,实现背景图上检测人脸,最重要的方法实现在setFace(),它将FaceDetector对象实例化,同时调用findFaces,结果存放在faces里,人脸的中点转移到MyImageView。

通过FaceDetector可以设定检测到人脸数目的上限。比如设置最多只检测10张脸: private static final int MAX_FACES = 10;

Android人脸检测返回其他有用的信息,例同时会返回如eyesDistance,pose,以及confidence。我们可以通过eyesDistance来定位眼睛的中心位置。

5.2.6 人脸的眼部定位

本文主要对人脸识别的认证是对人脸中眼的部位进行的确定,也就是说对人眼部的识别来达到识别整个脸部的,因此对眼部的设置至关重要,主要程序段及程序功能介绍:

用类FaceDetector 取最大脸个数,创建对象。

FaceDetector.Face [] faces = new FaceDetector.Face[MAX_FACES]; PointF eyescenter = new PointF();

float eyesdist = 0.0f;//眼睛距离的初始值为0,因为人脸是用双眼来检测人脸的位置。

25

青岛大学本科生毕业论文(设计)

fd = new FaceDetector(mFaceWidth, mFaceHeight, MAX_FACES);

count = fd.findFaces(mFaceBitmap, faces);//调用FaceDetector中的findFaces方法,确定人脸的位置

if (count > 0) {

fpx = new int[count * 2];

fpy = new int[count * 2]; //如果返回人脸的个数大于0,则将记录人脸x和y坐标 for (int i = 0; i < count; i++) { try {

faces[i].getMidPoint(eyescenter);

eyesdist = faces[i].eyesDistance();//每个人脸根据眼睛连线的中点值,确定人脸之间的距离;

// set up left eye location

fpx[2 * i] = (int)(eyescenter.x - eyesdist / 2); fpy[2 * i] = (int)eyescenter.y; 距离值的一半,Y轴为眼睛中心的y值

// set up right eye location

fpx[2 * i + 1] = (int)(eyescenter.x + eyesdist / 2);

fpy[2 * i + 1] = (int)eyescenter.y;//计算左眼位置x轴为眼睛中心值的x坐标加两眼距离值的一半,Y轴为眼睛中心的y值

//计算左眼位置x轴为眼睛中心值的x坐标减两眼

if (DEBUG)

Log.e(TAG,

\

+ i

+ \+ faces[i].confidence() + \+ faces[i].eyesDistance() + \+ faces[i]

.pose(FaceDetector.Face.EULER_X)

+ \+ faces[i]

.pose(FaceDetector.Face.EULER_Y)

+ \+ faces[i]

26

青岛大学本科生毕业论文(设计)

}

}

}

.pose(FaceDetector.Face.EULER_Z)

+ \+ eyescenter.x + \+ \

} catch (Exception e) {

Log.e(TAG, \

mIV.setDisplayPoints(fpx, fpy, count * 2, 1);

实现setDisplayPoints() 在被检测出的人脸上标记渲染,如果参数debug值=1,则提示人脸检测的可信度值。

可信度值在android.media.FaceDetector.Face.CONFIDENCE_THRESHOLD中定义。

5.2.7 定义图片大小

扩展了基类ImageView,设计MyImageView类,引用了android的类库android.graphics.Bitmap; class MyImageView extends ImageView

定义图片尺寸大小:

private bitmap mBitmap;

private Canvas mCanvas; private int mBitmapWidth = 200; private int mBitmapHeight = 200;

private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

5.2.8 创建位图及画板

Android 中的画笔是 Paint类,Paint 中包含了很多方法对其属性进行设置,主方法如下:

setAntiAlias: 设置画笔的锯齿效果。 setColor: 设置画笔颜色

setARGB: 设置画笔的a,r,p,g值。 setAlpha: 设置Alpha值 setTextSize: 设置字体尺寸

setStyle: 设置画笔风格,空心或者实心

27

青岛大学本科生毕业论文(设计)

setStrokeWidth: 设置空心的边框宽度 getColor: 得到画笔的颜色 getAlpha: 得到画笔的Alpha值 空心边框 画笔颜色为红色的线 /**画笔的类型**/

mPaint.setStyle(Paint.Style.STROKE); /**设置画笔变为圆滑状**/

mPaint.setStrokeCap(Paint.Cap.ROUND); /**设置线的宽度**/ mPaint.setStrokeWidth(5); 得到位图的高、宽创建位图和画板 public void setImageBitmap(Bitmap bm) { if (bm != null) { mBitmapWidth = bm.getWidth(); mBitmapHeight = bm.getHeight(); mBitmap

=

Bitmap.createBitmap(mBitmapWidth,

Bitmap.Config.RGB_565);

mCanvas = new Canvas();

mCanvas.setBitmap(mBitmap); mCanvas.drawBitmap(bm, 0, 0, null);

}

用于在画布上绘制图像,通过指定Bitmap对象来实现。 bitmap:Bitmap对象,代表了图像资源。 left:图像显示的左边位置。 top:图像显示的上边位置。 paint:绘制时所使用的画笔。 左上角开始画图,不用画笔 super.onSizeChanged(w, h, oldw, oldh); mBitmapWidth = (mBitmap != null) ? mBitmap.getWidth() : 0; mBitmapHeight = (mBitmap != null) ? mBitmap.getHeight() : 0; if (mBitmapWidth == w && mBitmapHeight == h) {

return;

if (mBitmapWidth < w) mBitmapWidth = w;

if (mBitmapHeight < h) mBitmapHeight = h;

}

28

mBitmapHeight,

青岛大学本科生毕业论文(设计)

在MyImageView中添加setDisplayPoints() ,用来在被检测出的人脸上标记渲染。获取图片的高度、宽度,如果图片小于设定的高、宽,则放大图

public void setDisplayPoints(int [] xx, int [] yy, int total, int style) {

mDisplayStyle = style; mPX = null; mPY = null;

if (xx != null && yy != null && total > 0) { }

mPX = new int[total]; mPY = new int[total]; for (int i = 0; i < total; i++) { }

mPX[i] = xx[i]; mPY[i] = yy[i];

画笔风格是空心,x和y坐标等于xx和yy数组 protected void onDraw(Canvas canvas) {

super.onDraw(canvas); if (mBitmap != null) {

canvas.drawBitmap(mBitmap, 0, 0, null); if (mPX != null && mPY != null) {

for (int i = 0; i < mPX.length; i++) {

if (mDisplayStyle == 1) { }

canvas.drawCircle(mPX[i], mPY[i], 10.0f, mPaint);

canvas.drawRect(mPX[i] - 20, mPY[i] - 20, mPX[i] + 20, } else {

mPY[i] + 20, mPaint);

在画板上画图:

如果位图不是空,则调用canvas.drawBitmap方法从左上角画图,x和y坐标不是空,则根据x的长度值循环,判断mDisplayStyle == 1。

调用画圆圈方法,canvas.drawCircle(mPX[i], mPY[i], 10.0f, mPaint);从x和y的坐标上开始画半径为10的圆,如果不是则画矩形。

29

青岛大学本科生毕业论文(设计)

5.3 按钮的设置

为了方便我们对选择图片的控制,我们引进了两个程序按钮:选择和识别。这两个按钮的引入,方便了我们提取图片,同时增加了操作感,方便了我们的应用。点下选择按钮我们可以在手机SD卡中读取我们事先存好的图片:点击识别按钮我们可以查看图片识别效果。程序界面如图5.4程序界面所示:

图5.4 程序界面

程序实现代码如下:

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// setContentView(mIV, new LayoutParams(LayoutParams.WRAP_CONTENT, // LayoutParams.WRAP_CONTENT)); setContentView(R.layout.main);

mIV = (MyImageView) findViewById(R.id.iv_no);

idetifyButton = (Button) findViewById(R.id.indetify); selectButton = (Button) findViewById(R.id.select);

mIV.setImageBitmap(BitmapFactory.decodeResource(getResources(),

R.drawable.face3));

idetifyButton.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View arg0) {

// load the photo

//Bitmap b = BitmapFactory.decodeResource(getResources(),

30

青岛大学本科生毕业论文(设计)

}

});

// R.drawable.face3);

mIV.setDrawingCacheEnabled(true); mIV.setDrawingCacheEnabled(true); Bitmap b = mIV.getDrawingCache();

mFaceBitmap = b.copy(Bitmap.Config.RGB_565, true); mIV.setDrawingCacheEnabled(false); mIV.setDrawingCacheEnabled(false); mFaceWidth = mFaceBitmap.getWidth(); mFaceHeight = mFaceBitmap.getHeight(); mIV.setImageBitmap(mFaceBitmap);

// perform face detection and set the feature points setFace(); mIV.invalidate();

}

selectButton.setOnClickListener(new OnClickListener() { });

@Override

public void onClick(View arg0) { }

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType(\intent.putExtra(\startActivityForResult(intent, 0);

31

青岛大学本科生毕业论文(设计)

第六章 研究结果及分析

获取待识别人脸图像:利用程序从手机SD卡中获取当前待识别人脸图像,进过相应算法处理获得能让程序顺利识别的图像。

人脸分类:利用PCA算法求解待识别人脸图像的人眼的位置,将待识别人脸图像归类实现眼部的识别,显示识别结果。

正是对图像的预处理,才能为后期算法奠定基础、提高识别率。也正是PCA算法减少了计算量,降低了应用程序对硬件的要求,从而减少了识别所用的时间。

实验证实对人脸的识别基本完成,下面是程序运行的结果: 单人识别结果,如图6.1 单人识别结果:

图6.1 单人识别结果

多人识别结果,如图6.2 多人识别结果:

图6.2 多人识别结果

由于此程序运行起来占用内存较大,并且还要保证整体的运行时间不宜过长,因此在

32

青岛大学本科生毕业论文(设计)

写程序时,故意写入最多只能一次识别10张脸。

从以上运行结果看:此程序基本实现了人脸识别的功能,虽然只是识别了人的眼睛,但是这位我们继续优化提供了有力的依据,但很有很多不足之处,值得我们日后好好研究。

33

青岛大学本科生毕业论文(设计)

第七章 总结

7.1 全文总结

本文是基于Android编程平台,对人脸识别技术的研究。Android编程平台的开放性、灵活性以及其完善的库函数和完整的应用程序框架,在最大程度上给予了程序开发人员很大便利。本文从人脸识别技术的研究现状、课题的研究意义结合当下手持设备的不断发展综合阐述了人脸识别技术应用前景的广阔。

文中从Android编程平台的搭建、Android平台相关简介做了比较详细的阐述。人脸图像预处理从彩图的灰度化、直方图均衡化、图像的平滑滤波、图像的边沿检测等都运用了数字图像处理中的相关知识。人脸识别的核心算法是采用的主成分分析法(PCA),文中对PCA算法的原理进行了详细的阐述。算法的实现是采用编程实现的,计算出协方差矩阵的特征值和特征向量,以及特征脸空间,最后实现了对人脸面部的识别。这也体现出Android编程平台的灵活性和开放性。

本文所运用到知识较多但是不杂。从前端的人脸采集、图像处理、算法实现形成了一条内在清晰的逻辑线,由浅入深,紧密相连。Java、C/C++的熟悉应用,数字图像处理知识的深入学习运用,数学基础知识及各种算法的掌握,数学模型的简历,较好的英语识度理解能力,良好的自学能力,这是完成本文的重要前提,通过此次试验,再次告诉我们在学习过程中掌握重要的基础知识、建模能力,实践技能的重要性。

7.2 前景展望

人脸识别技术经过这么多年的发展,已经取得巨大的进步,该技术在现在生活中已经得到了非常广泛的应用,可用于公安系统、驾驶执照及护照核对系统、银行及海关的监控系统及自动门卫系统、银行信用卡验证、医学、档案管理、视频会议、人机交互系统等多方面。随着技术的发展,人脸识别技术在手持设备上将会得到快速的发展。随着智能手机的普及,手机已经不是传统意义上的手机,它可以使人们生活的交易平台、相关信息收发存储的载体,因此手机的信息安全也得到越来越多人的重视。这也将促进人脸识别的发展。

从近几年生物识别技术市场和技术发展趋势来看,相关产业的集中度不断提高,在国外生物识别产业和市场中各类生物识别技术的发展和推广比较均衡。这也将给人脸识别技术的发展有了良好的基础。

人脸的自然特性决定了人脸识别是一个非常复杂的问题。经过国内外专家的很长时间的研究和积累,目前人脸识别技术已经达到一定的实用性,也有一些公司研制的产品进入市场推广阶段。影响人脸识别的成功的因素很多,现在,在室外的自然条件下,只有很小的部分能达到实用级别。这也说明要使计算机的人脸识别达到与真正人类识别人脸相媲美

34

本文来源:https://www.bwwdw.com/article/x2kg.html

Top