人脸检测与裁剪系统的设计与实现_第1页
人脸检测与裁剪系统的设计与实现_第2页
人脸检测与裁剪系统的设计与实现_第3页
人脸检测与裁剪系统的设计与实现_第4页
人脸检测与裁剪系统的设计与实现_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四川师范大学本科毕业设计人脸检测与裁剪系统的设计与实现学生姓名院系名称计算机科学学院专业名称软件工程班级学号指导教师完成时间2016年5月10日人脸检测与裁剪系统的设计与实现内容摘要:本设计旨在开发一个从静态图像中检测人脸及对检测到的人脸图像进行归一化的软件系统,具体内容包括:1.学习OpenCV库函数的调用和内在原理及相关编程环境,掌握使用该库的库函数和接口。在学习过程中了解人脸图像归一化的目和归一化的主要内容与方法。制定了本设计采用的归一化方案,编程实现归一化算法,实现一个基于OpenCV的人脸检测和图像归一化系统。2.研究了人脸检测原理和算法,学习了OpenCV内部封装的人脸人眼检测的算法原理。自己编程实现了一种基于人类皮肤颜色特征的人脸检测算法并对人眼检测方法中的灰度投影法进行了学习和改进。实现了手动定位人眼在图像中的位置,然后根据双眼位置进行人脸图像旋转和裁剪的归一化方法。3.本文首先概述人脸检测研究背景、人脸检测的必要性、现状及发展趋势。然后介绍了OpenCV人脸检测算法和肤色人脸检测算法的原理和数学模型。之后对本设计实现的人脸检测和裁剪系统的总体设计方案和详细设计方案进行了论述。最后利用KNN最近邻分类器,对归一化前后的人脸图像进行了人脸识别实验。实验结果显示,利用本系统可以有效地进行人脸检测和归一化,归一化步骤可以提高人脸识别率。关键词:OpenCV人脸检测肤色人眼检测人脸归一化ThedesignandimplementationoffacedetectionandcuttingsystemAbstract:Thispaperaimsatdevelopafacedetectionandanormalizationsystem.LearningTheOpenCV(anopencomputervisionlibrary)andtheprogrammingenvironment,masteringthelibrary’sfunctionsandinterface.Getthepurposeofnormalizingandlearnsomeimportantmethodandalgorithm.Aschemeabouttheimplementonthissystemshouldbemade.ThenimplementthedetectionsystembaseonOpenCVlibrary,andfinishanormalizationalgorithmbymyself.IlearnsomeinternalencapsulationbasedonOpenCVbyresearchingsamefacedetectionalgorithmofOpenCV.DuringthestudyIearnedtheimportantoffaceDetection.SoIplantoimplementonedetectionalgorithmbaseonskincolorandimprovethehumaneyeLocationmethodnamedgray-levelprojectionmethod.Themanualpositioningofthehumaneyepositionwascompleted,andthenrotatingandcuttingaccordingtothebinocularlocation.FirstofallIwillgiveabriefdescribethehistory,presentsituationandthetrendoffacedetectioninthefutureInthepaper.ThentheprincipleandmathematicalmodeloftwokindsoffacedetectionalgorithmsbasedonOpenCVandskincolormustbeexplained.Afterthatthispapertalkabouttheoveralldesignofthesystemdesignanddetaildesignofthissystem.Finally,usethenearestneighborclassifier,recognizethebeforeandafternormalizedfaceimage.theexperimentprovesthattheafternormalizedfacerecognitionratehigherthantheotherone.Keywords: OpenCVfacedetectionskincoloreyeLocationnormalization目录118781概述 1127271.1研究目的和意义 1314141.2研究背景 1130121.2.1国内现状 1279981.2.2国外现状 11301.3文章的结构 2318682预备知识及原理说明 2121112.1人脸检测定义 335212.2人脸特点和人脸开检测的意义 330942.2.1人脸的自然特性 322522.2.2进行人脸检测与裁剪必要性 375502.3一些常用的人脸检测技术 4105212.3.1基于显性特征人脸检测 4109152.3.2基于隐式特征人脸检测 4298602.4本章小结 5142613XFace系统总体设计 593333.1XFace系统设计 5124943.1.1XFace系统框图 5303773.2功能说明 5318313.2.1读取显示文件 5239963.2.2人脸检测 6147693.2.3检测结果归一化 6243453.2.4归一化结果保存 6220093.3本章小结 6172164XFace系统详细设计 6123234.1XFace系统总体设计 630734.1.1XFace系统流程 637804.1.2XFace系统的功能模块 724544.2XFace系统算法详细描述 8320584.2.1OpenCV人脸检测法详细描述 8280804.2.2肤色检测模型详细描述 1248914.2.3归一化算法详细描述 14296064.3XFace系统详细设计 18154.3.1XFace系统关键类 18121394.3.2XFace系统重要数据结构 19183024.4章小结 20248305XFace系统实现 20129935.1OpenCV人脸检测模块实现 20226265.1.1EmguCV概述 20301275.1.2EmguCV封装OpenCV 2057405.1.3EmguCV安装 2283815.1.4OpenCV人脸定位 22309475.2肤色人脸检测模块实现 2353955.2.1二值化图像得到人脸候选区 23298995.2.2候选肤色区域筛选 2446685.3归一化实现 24142865.3.1灰度投影法定位人眼 24292745.3.2旋转人脸图像 2646375.3.3裁剪归一化。 2643655.4本章小结 26215776XFace系统运行 27313316.1系统运行 27268426.2XFace系统对人脸识别率的提高。 28109006.3本章小结 28285967总结与展望 28113537.1总结 2844887.2展望 2948838致谢 2913280参考文献 30人脸检测与裁剪系统的设计与实现1概述1.1研究目的和意义人脸检测(FaceDetection)就是查找图像中人脸的位置,大小及数量REF_Ref755\w\h[1]。裁剪就是将检测到的人脸进行旋转亮度等归一化方法来得到可以用于计算机人脸识别的标准化人脸图像样本,研究人脸检测和裁剪的目的是为了更好的进行人脸识别。意义一:在自拍美图、人脸识别、无人驾驶、人工智能等技术被广泛用于生活的背后始终有一个默默无闻的技术在支撑着他们的发展,那就是人脸的检测。人脸检测与识别的关系就好比人在处理眼睛看到的对象一样我们先需要对看到的对象进行分类然后才能在该类下了解它的具体特性。同样首先我们需要人脸检测来帮助弄清楚对象是什么类,然后才可以知道它的具体内容。意义二:人脸检测可以降低对人脸样本的采样的环境要求,想象一下如果我们为了识别某人而需要他或她在镜头前表情僵硬的一动也不动的才能采集到满足要求的人脸。与能从一张随便拍摄的图片就能检测到人脸的采样条件而言,人脸检测在降低采样环境上着实起到了很大作用。1.2研究背景1.2.1国内现状从全球的人脸识别市场发展来看,中国现在正处于巅峰时刻。如今从事人脸识别的公司有200家。今年中科院人脸识别团队将人脸识别技术运用于铁路安全检测系统这是应用上取得的一大进步。徐州市人事考试办公室也首次应用了人脸识别技术机考防范及排查替考还有目前支付宝已经在某些移动端上也能完成刷脸支付了。学术上微软亚洲研究院视觉计算组同美国ImageNet计算机视觉组织进行挑战。微软亚洲研究院视觉计算组的研究员们凭借深层神经网络技术的最新突破,以绝对优势获得图像分类、图像定位以及图像检测全部三个主要项目的冠军REF_Ref2522\w\h[2]。同时,在另一项图像识别挑战赛MSCOCO中同样取得了很好的成绩,击败了来自企业、学界和研究机构的众多参赛者REF_Ref2522\w\h[2]。相信在将来人脸检测技术会越来越多的应用到生活场景中。我很幸运的选择了人脸检测归一化系统的设计与实现作为本次的毕业选题。1.2.2国外现状最早的二维图像的统计模式识别开始于20世纪50年代。最早的三维机器视觉的研究始于60年代。1977年,MIT人工智能实验室正式开设”computervision”课程。全球性的研究热潮于80年代开始,不久computervision获得了巨大发展,该领域的各种新概念、新理论不断出现。目前在海外,机器视觉人脸检测系统在很多方面已经得到了普遍的应用,而且其产品在很多行业中有着举足轻重的地位。目前大多数应用集中在半导体及电子行业。可以这样说computervision现在国内与国外对于人脸检测计算机视觉方面研发成果处于并驾齐驱、不相上下的地步。1.3文章的结构本文共为八个主要部分:概述,这章主要说明了人脸检测和裁剪系统的必要性和重要性,主要从市场和发展前景来论述为什么进行人检测和裁剪的研究。预备知识和原理说明,如同只有站在巨人的肩膀上才能看的更远才能一样,要更好的了解这项技术就必须要了解一些准备知识。总体设计,主要使用结构图来说明本人脸检测与裁剪系统包括的主要功能。详细设计,用功能模块图来说明系统的工作流程和重要算法原理,并通过系统主要数据结构和关键类介绍系统详细设计是如何实现的。系统实现,本章对Emgucv进行了概要描述,主要实现了OpenCV、肤色定位人脸区域和对检测到人脸进行归一化功能。系统运行及归一化对识别率的影响实验,说明人脸检测和裁剪系统在对静态图像检测归一化归一方面所做的工作。总结篇,对该系统进行了综合评述。总结系统做到了什么,同时还提出了一些系统可能存在的不足及系统没做到什么和对系统改进期望。致谢,对所有帮助我的人和组织表示感谢。最后是本文所参考的各种国内外有价值的论文、图书、期刊、和网络技术博客资料列表。2预备知识及原理说明在开发人脸检测与裁剪系统之前我们必须要了解一些关于人脸检测的预备知识。比如了解什么是人脸检测及人脸检测定义,还需要了解为何进行检测和裁剪及这样做的意义。同时还应该了解一些关于现在常用的一些检测技术。2.1人脸检测定义人脸检测:在实际中人脸检测主要用来预先处理需要进行人脸识别的图像,它的主要任务就是在图像中准确标定出人脸的位置和大小。人脸检测就是把人脸图像中包含的众多的特征,如结构的特征、直方图的特征、人脸颜色的特征、及Haar特征等对检测人脸有用的信息挑出来,并利用这些特征实现人脸检测REF_Ref2663\w\h[3]。2.2人脸特点和人脸开检测的意义2.2.1人脸的自然特性人脸和人的其它生物特征一样从出生就会伴其一生,人脸的唯一性和难复制性为身份鉴别提供了必要的前提。因为如果现实中存在两张完全相同的人脸那么人脸识别就无法进行判断。与其它类型的生物识别比较人脸识别还具有:直接性:就是指和人类辨别人一样主要是通过人脸来区别,而不需要进行种种转换运算。非接触性:用户不需要像采集指纹那样需要和设备直接接触就才能获取图像;并发性:在同一张图片或者图像中我们可以同时检测多个人脸;唯一性:这是我们可以根据人脸达到识别身份的必要前提。每个人的脸具有与他人不同的特点而这些是唯一的,不会存在两个目标脸可以是完全相同的。2.2.2进行人脸检测与裁剪必要性意义一:我们知道图像对于计算机而言就是一串一串二进制数而且他的保存十分耗费资源。针对安全监测视频图像中无人的景象是无用的,那么人脸检测则可以在检测到人脸时才对图像进行存储这样既节约资源又可以提高图像的有用性。意义二:在自拍美图、人脸识别、无人驾驶、人工智能等技术被广泛用于生活的背后始终有一个默默无闻的技术在支撑着他们的发展,那就是人脸的检测。没有人脸检测技术的支持不会有计算机人脸识别的产生。人脸检测与识别的关系就好比人在处理眼睛看到的对象一样我们先需要对看到的对象进行分类然后才能在该类下了解它的具体特性。同样首先我们需要人脸检测来帮助弄清楚对象是什么类,然后才可以知道它的具体内容。意义三:人脸检测可以降低人脸识别前对人脸样本的采样条件,想象一下如果我们为了识别某人而需要他或她在镜头前表情僵硬的一动也不动的才能采集到满足要求的人脸。与能从一张随便拍摄的图片就能检测到人脸的采样条件而言,人脸检测在降低采样环境上着实起到了很大作用。2.3一些常用的人脸检测技术2.3.1基于显性特征人脸检测所谓基于显性特征人脸检测是指人肉眼就可以采集出来的的特征而不需要进行各种处理的特征,如五官结构,人脸皮肤颜色,面部轮廓等五官分布法是根据人脸五官双眼、眉毛、耳朵、鼻子、嘴巴在人脸的位置分布规则对图像进行扫描来检测人脸。基于肤色的人脸检测是指肤色在去除亮度的色度空间内具有内聚性我们可以根据对大量肤色统计发现肤色会内聚到某个范围内从而可以帮助我们将皮肤区域同其他背景中分离出来。其优点是检测快速原理简单而且具有姿态不变性。基于对称性的人脸检测我们知道正面人脸长宽比会在一定范围内,而超过这个范围是人脸的概率比较小可以不予考虑。基于显性特征的检测算法复杂度低检测效率高。但同时也会有相当高的检误率但总的来说基于显示特征的人脸检测方法是比较容易实现的。2.3.2基于隐式特征人脸检测隐式特征的方法就是预先让分类器对大量的人脸和非人脸样本对进行学习,然后再用学习好的分类器检测一个新人脸看是否为人脸。如果送检人脸通过分类器的所有检测,则确认为人脸否则不是人脸。典型例子有以下几种:基于人工神经网络的方法人工神经网络和人自身处理信号的过程类似大致过程为:当大脑或者感受器接收到某个来自外界的刺激,神经细胞就通神经结构将信息传递到其他细胞然后在到其他细胞就这样将刺激迅速通过处理传到其他神经细胞REF_Ref9847\w\h[4]。这样一条通路就是一个信息处理的通路。整个神经网络系统是由无数个相互关联的神经细胞组成,构成一强大的高精度的信号处理机REF_Ref9847\w\h[4]。不过信号不是随机选择下一个神经元来传递信息,而是基于人在成长过程中长期累积的分类信息有条件的选择路径。受这种思想启发人工神经网络算法就是要模拟人类神经的既成分类机制以此达到对待检测样本的检测。基于子空间的方法子空间学习大意是指通过映射,实现从高维度特征向低维度特征空间的映射,是一种经典的思想。就好比你拿到了一组具有很多信息数据要对其做分类,然而数据分布在一个高维空间中,不太方便处理,维度太高导致采用的分类模型的复杂度也相应增高,最终导致分类模型容易出问题。从而导致问题无法解决,但是,数据中往往存在一些特性使得这个问题又有了可以解决的希望,比如数据其实分布在高维空间的一个子空间中,你拿到的高维数据其实是子空间中有效数据加上高维无效数据,而这个子空间的维度数其实一般不那么大,那么找出这个子空间,就能保证尽量不丢失信息又能降低数据维度,在这个子空间中做训练,就可以变得比较容易。2.4本章小结本章我们可以清楚知道什么是人脸检测以及人脸检测为何会如此的有用以及证明了我们很有必要对其进行探究学习,同时我们还大致明白人脸检测的显性特征检测方法及隐性特征检测方法的优缺点。3XFace系统总体设计3.1XFace系统设计3.1.1XFace系统框图如图3.1是XFace人脸检测系统,包含以肤色检测法为指导的肤色检测模块和基于OpenCV图像处理库检测算法原理的OpenCV人脸检测模块,同时还实现了基于灰度投影法的自动定位人眼和手动定位人眼的归一模块。图3-1XFace系统框图XFace系统的运行是从读取文件开始的,然后我们对打开的图片加载到检测模块检测得到人脸,然后就可以对检测到的人脸进行归一化处理最后保存处理结果到文件。3.2功能说明3.2.1读取显示文件读取文件是系统运行的第一步,我选择用C#的System.Windows.Forms.OpenFileDialog类实例化对象进行图片路径的选取。我设置该对象的Filter让可供选择的文件仅限于如Jpg、bmp、png等图片文件。用Bitmap对象来加载选择文件的图片数据。然后显示该图片到界面。3.2.2人脸检测人脸检测就是将读取显示到界面的图片文件加载到OpenCV人脸检测功能模块去或者是以肤色检测法为基础的人脸检测模块去。该模块如果检测到了人脸就返回人脸位置信息加载到数据模型中。否者就不会返回任何信息。我们队数据模型进行读取有数据就显示结果。无数据则显示未检测到任何结果的信息提示。3.2.3检测结果归一化检测结果归一化是将检测到的人脸归一化到大小一致眼睛处于同一水平线上的图片,这是设计XFace系统的最终目的。我们可以选择人脸检测结果来进行人脸归一化。在选取需要归一化的检测人脸后我们就可以执行自动归一和手动归一了;归一结果会显示到界面并根据用户是否对归一化结果满意来进行下一步操作。即用另外一种归一方法还是保存结果。3.2.4归一化结果保存我们进行人脸检测归一化是为了能为人脸识别提供标准的人眼处于同一水平的可靠的识别人脸样本,保存对于整个系统势必是不可或缺的。我们根据用户提供的保存路径先判断文件是否存在,如果存在提示是覆盖文件还是放弃保存,如果文件不存在则直接保存文件。3.3本章小结通过本章我们可以了解人脸检测系统裁剪系统每个模块是如何协同工作的为下一步的详细设计奠定良好基础。4XFace系统详细设计4.1XFace系统总体设计4.1.1XFace系统流程如图4.1XFace系统包括四个功能模块:读取图片文件、检测人脸、归一化人脸、然后保存结果。图4-1XFace系统工作流程4.1.2XFace系统的功能模块图4-2读取文件模块图图4-3人脸检测模块图4-4归一化模块图4-5保存文件模块4.2XFace系统算法详细描述4.2.1OpenCV人脸检测法详细描述图4-6OpenCV人脸检测功能图OpenCVhaar分类器的建立:OpenCV的haar积分图人脸分类器是基于adaboost算法对人脸haar特征进行学习建立起来的。Haar分类器算法的要点如下:①使用Haar特征做检测。②使用积分图(IntegralImage)对Haar特征求值进行加速。③使用AdaBoost算法对弱分类区训练得到区分人脸和非人脸能力更强的强分类器。④使用级联方法把强分类器堆叠级联到一起形成级联分类器,提高准确率。Haar特征Haar特征用法,就是在人脸检测过程中将他视为一个子窗口在检测区域内不断滑动。对于每个位置的每个一种特征都会有一个与之对应的特征值,将这些计算出来的值代入预先训练好的级联分类器。如果特征通过这些分类器则我们就判定该区域是人脸,否则该区域不是人脸区域。下面是Viola提出的Haar特征REF_Ref9267\w\h[5]。图4-7haar特征图REF_Ref9267\w\h[5]下面是Lienhart提出的Haar特图4-8新haar特征图REF_Ref9267\w\h[5]将任意一种haar特征矩形放到人脸样本所在区域内,对于特征覆盖的人脸区用白色区域对应的人脸像素值和减去特征黑色区域覆盖的人脸像素和得到的像素值我们称之为人脸特征值REF_Ref23362\w\h[7]。而如将这个特征覆盖到非人脸区域,那么计算出的值应该和覆盖到人脸区域得到的特征值不一样,其实非人脸区域特征值与人脸区域得出的特征值区别越大越有利于我们区分出人脸来REF_Ref17664\w\h[8]。最终为了达到好的区分效果增加区分度,我们通过使用多种haar特征计算特征值然后将他们叠加在一起得到一个区分度更大的特征值。Haar分类器在2001年,Viola和Jones发表了《RapidObjectDetectionusingaBoostedCascadeofSimpleFeatures》REF_Ref11561\w\h[5]和《RobustReal-TimeFaceDetection》两本经典著作REF_Ref14667\w\h[6]。在这两本著作中详细介绍了haar特征和haar分类器。现在我们知道haar分类器就是利用人脸的haar特征值和adaboost算法训练得到弱分类器,由弱分类器组合成强分类器,再由强分类器分层叠加形成级联分类器。弱分类器对于20000张人脸样本图像和20000张非人脸样本图像,一个如4.9图左边中a型haar特征在每个个位置上都会取得20000个正样本特征值和20000个负样本特征值。在这40000个特征值中会存在一个值能够最好区分出人脸和人非人脸样本。那么我们就选择该特征值对应的haar特征作为一个弱分类器。图4-9最优弱分类器原理图如何选择一个特征值达到对该种特征分类效果好的阀值?对a型特征得到的40000个特征值进行排序。计算每个特征值对应的分类正确率。每一个特征值会对应一个分类的正确率,我们选择分类正确率最大的特征值E所对应的特征得到最优弱分类器。同样对于B型特征我们也可以找到一个最优弱分类器。强类器强分类器的诞生需要循环多轮得出,我们取循环次数为N具体操作如下:对训练样本集U,共M个样本,其中一部分正样本和负样本;N为训练的最大循环次数;2.初始化样本权重为1/M,即为训练样本的一个初始概率分布;3.第一次选择M个样本的某一个特征,得到第一个最优弱分类器4.提高上一轮中被误判的样本的权重;5.选入新的特征特进行新一轮的训练得到一个新的弱分类器。6.经过N次步骤4和5的执行就得到N个弱分类器。7.最后对N个弱分类器组合就可以得到一个强分类器。级联分类器我们将训练出多个强分类器按照一定规则的组合,最终形成正确率可以满足人脸实际需求的分类器。图4-10级联分类器原理图级联分类器级联方法是,将一定数量的强分类器一般20个就够了从分类能力弱排列到分类能力强的经过训练使每个强分类器都有较高检测率,而误识率可以放低,根据错误率F=每层错误率相乘而得,检测率D=每层的检测率相乘而得。级联分类器就是在给定级联分类器错误率和识别率反过来计算每层强分类器的错误率和识别率。积分图对于一个Haar特征在一个窗口中如何排列可更好的体现人脸的特征,这是未知的,只有通过训练才能了解到所以在训练之前我们需要穷举所有特征。对于每一个矩形样本,对于他里面的任何一个子窗口图像,毫无疑问都是需要计算特征值的那么我们知道对于一个24*24的区域就有16万个左右的特征值然而对于大多数的人脸图尺寸会远大于24*24所以运算量可想而知是多大。积分图之所以被广泛采用就在于积分图只遍历一次图像就可得出图像中所有区域像素和这对提高了图像特征值的计算效率很有帮助。它是用一点的值表示该点p(i,j)与坐标原点形成的矩形的所有像素和积分图构建算法:1)用s(i,j)表示行方向的累加和,初始化s(i,-1)=0;2)用Sij(i,j)表示一个积分图像,初始化Sij(-1,i)=0;3)扫描图像,计算每个点P(i,j)行方向的像素f(i,j)累加和得到s(i,j)和积分图像Sij(i,j)的值s(i,j)=s(i,j-1)+f(i,j)Sij(i,j)=Sij(i-1,j)+s(i,j)4)经过对图像一遍的扫描,积分图像Sij就构造好了。对于一个已经运算完的积分图,图中任何矩形框的像素和就都可以通过简单加法和减法运算得到。如图:图4-11积分图设D的四个顶点分别为1,2,3,4则D的像素和可以表示为Dsum=Sij(1)+Sij(3)-(Sij(2)+Sij(4));4.2.2肤色检测模型详细描述图4.12肤色人脸检测细化图HSV颜色空间HSV模型图4-13Hsv模型图色调H所谓的颜色的色调其实指的是图像中画面色彩的大致颜色而H色调(Hue)是用角度来进行度量的,它的取值范围为0°~360°REF_Ref21426\w\h[9]。饱和度S饱和度S表示颜色与光谱色的接近程度比如说一种颜色,可以看成是某种光谱颜色与白色按照一定比例混合而成的结果REF_Ref21426\w\h[9]。如果某种光谱颜色在总体中占的比例大,那么这种颜色显现程度就高,同时颜色的饱和度就会越高。饱和度高,在颜色上表现就是颜色深而艳。明度V明度表示颜色明亮的程度,对于发光物体,明度值与发光体的光亮程度成正比;对于非光源物体,明暗度就是指物体的透射或反射能力的强度。通常取值范围为0%到100%取值越大也就越明亮REF_Ref21426\w\h[9]。RGB与HSV的联系直观的看,只需要把以RGB三维坐标的中轴线为轴线的立方体立起来的,将他扁平化,就能形成HSV空间模型了REF_Ref21426\w\h[9]。V只选取了RGB的一个最大分量与强度无直接关系而RGB则能反映光照强度(或灰度)的变化。v=max(r,g,b)。由RGB到HSV颜色空间转换的伪代码如下:Input(R,G,B);varV=Max(R,G,B); ifV=0 thenS=0;Else thenS=[V-Min(R,G,B)]/V;IfV=R thenH=60*(G-B)/(V-Min(R,G,B));IfV=G thenH=120+60*(B-R)/(V-Min(R,G,B);IfV=B thenH=240+60*(R-G)/(V-Min(R,G,B));IfH<0 thenH+=360;Output(H,S,V);4.2.3归一化算法详细描述图4-13自动归一化模块细化图图4-14手动归一化模块细化图自动人眼定位灰度投影法REF_Ref30616\w\h[11]:由人脸的人眼位置特征将人脸部双眼区域缩小到两个小区域。然后根据灰度图像在人眼区域像素和会低于非人眼区域从而定位人眼坐标;根据在图像预处理与匹配方法研究REF_Ref30616\w\h[11]中人眼定位方法。我们经过对五官定位得到大致矩形人眼位置记为左眼所在框(x1,y1,x2,y2)右眼所在框(x3,y1,x4,y2)。然后进行扫描获得像素最小的区域。取该区域的中心就是眼睛位置。如图4.15所示:从图可看到对区域(x1,y1,x2,y2)进行分割对每个小格子进行像素求和p(x,y)最终找到像素最小矩形块将该中心当做人脸左眼。同理对区域(x3,y1,x4,y2)可以找出右眼。图4-15自动定位人眼图图像旋转图4-16图像旋转模型图如图4.16中我们以P0(x0,y0)为旋转中心建立坐标系,p2(x2,y2)为旋转后的点,我们需要计算旋转前的点p1(x1,y1)线p0p1与线p0p2夹角为Ap0p2与X轴夹角为B线段p0p1=p0p2的长记作r;由于旋转过程不会改变线段长r。我们通过下面的公式推导得出p1(x1,y1)在图片中的坐标。我们根据三角函数公式(4.1)(4.2)(4.3)(4.4) (4.1)(4.2)(4.3)(4.4)将(4.1)展开得到(4.5):(4.5)将(4.2)展开得到(4.6):(4.6)将(4.3)(4.4)带入(4.5)得到(4.7):(4.7)将(4.3)(4.4)带入(4.6)得到(4.8):(4.8)最终结果:(4.9)(4.10)由于现在坐标系的原点是P0也就是人脸左眼位置点,现在计算得到的坐标都是相对于P0点因此还要还原到原来的坐标系,那么最终的结果就是: (4.9) (4.10)如上计算可得到旋转后图像中每个点p(x,y)在原图的位置p’(x,y)由于旋转p’(x,y)可能不是整数点而且有可能超出原图范围就取存在值作为该点的像素值如果点不在原图范围内则赋值为255。双线性插值双向性插值根据距离点p(x,y)距离越小而对该点值影响越大来进行插值。同时,由旋转后图像坐标计算出来的原图像坐标往往不是整数,为了保证旋转效果,进行双线性插值。双线性插值就是对一点进行X方向和Y两个方向进行变量的线性插值,分别对每个变量线性插值就得到最终的插值结果。图4-18双线性插值图在X方向上插入R1,R2值如公式(4.11)(4.12): 公式(4.11) 公式(4.12)在Y方向插值(4.3)如下: 公式(4.13)简化后得到(4.4)如下 公式(4.14)旋转后点p2(x2,y2)对应的像素值f(x,y)我们根据公式(4.14)计算可以得到。图像裁剪在旋转后图像中,以左眼Leye(x,y)做基准两眼间距离为D标准找到人脸矩形左上角的点leftUP(x-0.5D,y-0.5D)。然后以leftUp点,宽2D,长2D构造矩形,裁剪得到归一化人脸即为一个2D*2D的矩形人脸框;如图4.19:图4-19人脸裁剪模型图通过流程图4.13或者图4.14我们可以清晰的看到。经过对图片的处理可以得到人眼,然后对该图片进行以左眼为旋转中心的人脸图像旋转,就可以使得双眼处于同一水平,最后按比例裁剪人脸就完成了人脸几何归一化。在第六章可以看到归一化前后人脸对比图。4.3XFace系统详细设计4.3.1XFace系统关键类图4-20系统关系图图4-21系统重要类的图图4.18是人脸检测裁剪系统的一些重要关联关系图。4.19是XFace系统关键类。根据MVC架构我将XFace系统分为三层。Model层实现类是图的AllFaces类与AllImg类主要对数据进行封装用于显示。View层是显示数据层主要对应了上图的XFace类。Controller层就是从model层取得数然后传递个view层对应上图的Xface类。最底层的两个类DetectFunc类与Helper类则是人脸检测用到的静态函数库与用于显示提示的静态string库;4.3.2XFace系统重要数据结构图4-22系统重要数据结构图如图所示,是XFace系统中的重要的数据结构类每个结构的分析如下:Rect结构:包括一个点和一个Size分别对应与检测得到人脸矩形框的左上角和size;Face结构:包括了rectface和一个eyes[2];分别对应检测得到一张脸与脸的两个眼睛;AllFaces结构:包括一个List<Face>对应于一张图片上检测得到的所有人脸;Image结构:有imageName、ImageData、leye、reye、imgsize分别对应检测结果图的图片名、图片像素数据、图片中左眼右眼位置,和图片大小。AllImgs结构:对应所有需要显示的结果图。4.4章小结本章我们介绍了OepnCV人脸检测原理,肤色检测原理,人脸归一化原理。并对系统进行MVC架构,进行详细设计了Face、AllFaces、Image、AllImgs四个数据结构类,接下来就可以编码实现XFace系统了;5XFace系统实现5.1OpenCV人脸检测模块实现5.1.1EmguCV概述我们将EmguCV3.1看作是Opencv的.net版本是由OpenCV封装而成是一个跨平台的图像处理库。封装使得OPenCV的函数能对.net环境下的C#,VB,IronPyThon等语言进行支持。它很能够在Linux,MacOSX以及一些手机平台上如Android设备iPhone,iPod,iPad上运行REF_Ref25936\w\h[12]。EmguCV优点:.跨平台,支持多语言;.提供泛型颜色和度的图片类Image<color,depth>;.自动内存管理机制;.XML序列化图片;.直接支持图片类和OpenCV函数调用;5.1.2EmguCV封装OpenCV从图5.3可以看出第一层是基础层,它包括了枚举类型,结构体类型和图片处理函数它们的命名空间直接从Opencv封装而来。第二层是上层封装它充分体现了.net框架的优点将各种类融合在一起.图5-1Emgucv封装结构图REF_Ref25936\w\h[12]下图是一些Emgucv与Opencv结构体的对照。图5-2Emgucv与Opencv结构体的对照图REF_Ref25936\w\h[12]下图是.net框架结构体与Opencv结构体对照。图5-3.net框架结构体与Opencv结构体对照REF_Ref25936\w\h[12]这里简洁的介绍了EmguCV,我们应该明白为什么选择它来做开发。那么接下来就人我们看一下如何安装EmguCV。5.1.3EmguCV安装EmguCv安装,我们到/projects/emgucv/下载最新版本的emgucv安装包加压后打开.exe文件开始安装到Windows。统配置环境配置,打开系统配置环境变量在Path上加上...\emgucv3.1\emgucv-windesktop282\bin\X64;添加引用,我们把上述路径下的.dll文件复制到项目debug文件目录下。完成上述操作后就打开vs2012创建新工程向解决方案资源管理器添加前面拷贝到debug文件下的dll到引用。到此我们可以用emgucv库进行开发了。如果某个程序需要用到Emgucv的内库则在该程序的开始添加UsingXXX即可。5.1.4OpenCV人脸定位实现代码:publicModel.AllFacesGetAllFacs(System.Drawing.Bitmapimage){Model.AllFacesmaf=newModel.AllFaces();System.Drawing.Rectangle[]facerectangles=HelpFaceDetect.DetectFunc.DetectFaceUseOpencv(image);if(facerectangles.Length>0){for(inti=0;i<facerectangles.Length;i++){Model.AllFaces.Faceface=newModel.AllFaces.Face();face.Position.Leftup=facerectangles[i].Location;face.Position.Size=facerectangles[i].Size;//获取每个人脸的眼睛位置System.Drawing.Bitmapfaceimg=newImage<Bgr,byte>(image).Copy(facerectangles[i]).Bitmap;List<Rectangle>eyerectangles=HelpFaceDetect.DetectFunc.DetectEyesUseOPencv(faceimg,facerectangles[i].Location);if(eyerectangles.Count==2){face.Eyes[0].Leftup=eyerectangles[0].X>eyerectangles[1].X?eyerectangles[1].Location:eyerectangles[0].Location;face.Eyes[1].Leftup=eyerectangles[0].X<eyerectangles[1].X?eyerectangles[1].Location:eyerectangles[0].Location;if(face.Eyes[0].Leftup.X==eyerectangles[0].X){face.Eyes[0].Size=eyerectangles[0].Size;face.Eyes[1].Size=eyerectangles[1].Size;}else{face.Eyes[0].Size=eyerectangles[1].Size;face.Eyes[1].Size=eyerectangles[0].Size;}}maf.FaceList.Add(face);}returnmaf;}else{thrownewException(AppService.Helper.faceDetectResultMesg);}}5.2肤色人脸检测模块实现5.2.1二值化图像得到人脸候选区参考论文发现在HSV空间H的值在范围9-50可以分辨出亚洲人皮肤。而在RGB颜色空间下有满足不等式(R-G>10)&&(G-B)>5的像素点就可以判定为肤色点。然后我们将是肤色点的像素值设定为255非肤色像素点设置值为0。实现源码如下:if((Rf-Gf>10)&&Gf-Bf>5){srcImg.Data[i,j,0]=255;srcImg.Data[i,j,1]=255;srcImg.Data[i,j,2]=255;if(9<=H&&H<=50){srcImg.Data[i,j,0]=255;srcImg.Data[i,j,1]=255;srcImg.Data[i,j,2]=255;}else{srcImg.Data[i,j,0]=0;srcImg.Data[i,j,1]=0;srcImg.Data[i,j,2]=0;}}else{srcImg.Data[i,j,0]=0;srcImg.Data[i,j,1]=0;srcImg.Data[i,j,2]=0;}}}SrcImg=srcImg;}这里二值化的方法采用了RGB颜色空间和Hsv颜色空间的组合方法其中用于判断的阀值是参考一种基于肤色分割的人脸检测方法REF_Ref2285\w\h[14]的文献。5.2.2候选肤色区域筛选对于一般人脸二值化图像的面积要大于20*20=400可以排除一些小的区域。由于人脸几何特征存在人脸比例范围在0.8-2.5范围可以筛选出人脸。源码如下:#region获取候选肤色区域privatestaticList<Rectangle>getfaceCandidateRect(Image<Gray,byte>BlackWhitesrcImg){List<Rectangle>candidateRectList=newList<Rectangle>();//Image<Gray,byte>candidateImg=newImage<Gray,byte>(BlackWhitesrcImg.Size);using(VectorOfVectorOfPointcontours=newVectorOfVectorOfPoint()){//找到所有连通域contoursCvInvoke.FindContours(BlackWhitesrcImg,contours,null,Emgu.CV.CvEnum.RetrType.Tree,Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple,newPoint(0,0));intcount=contours.Size;//遍历contours根据面积判断是否舍弃for(inti=0;i<count;i++){using(VectorOfPointcontour=contours[i])using(VectorOfPointapproxContour=newVectorOfPoint()){//多边形曲线逼近CvInvoke.ApproxPolyDP(contour,approxContour,CvInvoke.ArcLength(contour,false)*0.05,true);if(CvInvoke.ContourArea(approxContour,false)>400)//onlyconsidercontourswithareagreaterthan100{RectanglerectCandidate=CvInvoke.BoundingRectangle(approxContour);//根据人脸特征比例筛选if(2.5>=((float)rectCandidate.Height/rectCandidate.Width)&&((float)rectCandidate.Height/rectCandidate.Width)>0.8)candidateRectList.Add(rectCandidate);}}}}returncandidateRectList;}#endregion 本算法是基于人脸长和宽比例在[0.8-2.5]范围特征REF_Ref4839\w\h[13]来筛选人脸区域和基于经验的数据人脸面积一般大于20*20像素来排除非人脸。5.3归一化实现5.3.1灰度投影法定位人眼根据上面描述的自动归一。该方法利用了在人眼区域会存在局部灰度值最低从而定位人眼。从而得到双眼位置用于旋转图像。实现源码:#region自动定位人眼privatestaticPointF[]autoLocateEye(Image<Gray,byte>OrGrayImg){//【0】左眼【1】右眼PointF[]twoeyes=newPointF[2];intx1=OrGrayImg.Width/4,x2=OrGrayImg.Width/2,x3=x2,x4=x2+x1;inty1=OrGrayImg.Height/4,y2=OrGrayImg.Height/2;intWstep=(x2-x1)/5;inthstep=(y2-y1)/5;//纵向扫描矩形(x1,x2,y1,y2)(x3,x4,y1,y2)得到twoeyes.Yfloatmingh=255*(x2-x1)*(y2-y1),mingw=255*(x2-x1)*(y2-y1);for(inth=y1;h<=y2;h+=hstep){for(intw=x1;w<=x2;w+=Wstep){floatgh=0.0f;for(intk=0;k<hstep;k++)for(intl=0;l<Wstep;l++)gh+=OrGrayImg.Data[h+k,w+l,0];//[10,10]区域的像素和if(gh<=mingh){twoeyes[0].Y=h+hstep/2;//得到左眼Y;twoeyes[0].X=w+Wstep/2; //得到左眼Xmingh=gh;}}}mingh=255*10000;mingw=255*10000;for(inth=y1;h<=y2;h+=hstep){for(intw=x3;w<=x4;w+=Wstep){floatgh=0.0f;for(intk=0;k<hstep;k++)for(intl=0;l<Wstep;l++)gh+=OrGrayImg.Data[h+k,w+l,0];//小矩形像素和if(gh<=mingh){twoeyes[1].Y=h+hstep/2;//得到右眼Y;twoeyes[1].X=w+Wstep/2;mingh=gh;}}}returntwoeyes;}#endregion从我多次进行的检测结果得出结论:本方法需要预先根据对人脸显性特征来对人眼划分区域如果预分区出错就会导致算法严重错误。比如对于某些人脸处于图片边缘或者人眼并未处于划分出来的区域会出现检测错误。目前还未想到好的解决方案。对于定位失败的人脸,现在只能通过手动选取人眼来达到归一化。5.3.2旋转人脸图像为了使的两眼处于同一水平我们把人脸图像绕左眼所在点旋转人脸。实现伪代码:Begin(算法开始)InputLeye,Reye,SrcImg(输入参数)getAngle(Leye,Reye)(获取旋转角度)Reotate(Leye,SrcImg)(旋转图片)OutPut(SrcImg);(输出结果)5.3.3裁剪归一化。根据左眼裁剪旋转后的人脸并归一化到相同尺寸,目的在于可以得到眼睛在同一水平线上大小相同的去掉会干扰人脸识别的无关区域。裁剪伪代码:Begin(算法开始)InputSrcImg,Leye,Distance(输入参数)getRectangle(Leye,Distance)(获得人脸矩形)Img=SrcImg

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论