当前位置:   article > 正文

人脸识别技术_人脸识别是每输入一张

人脸识别是每输入一张

第1章 绪  论

所谓人脸识别,是指对输入的人脸图像或者视频.判断其中是否存在人脸,如果存在人脸,则进一步给出每张人脸的位置、大小和各个主要面部器官的位置信息。并且依据这些信息,进一步提取每张人脸蕴含的身份特征,并将其与已知人脸库中的人脸进行对比,从而识别每张人脸的身份。人脸识别研究涉及的范围广泛,内容涉及模式识别、计算机视觉、图像处理、人工智能等方面。人脸识别还涉及到神经网络等学科, 也和人脑的认识程度紧密相关。 这诸多因素使得人脸识别成为一项极富挑战性的课题。

1.1人脸识别技术的研究意义

人脸识别是机器视觉和模式识别领域最富有挑战性的课题之一,同时也具有较为广泛的应用意义。人脸识别技术是一个非常活跃的研究领域,它覆盖了数字图像处理、模式识别、计算机视觉、神经网络、心理学、生理学、数学等诸多学科的内容。如今,虽然在这方面的研究已取得了一些可喜的成果,但是FRT在实用应用中仍面临着很严峻的问题,因为人脸五官的分布是非常相似的,而且人脸本身又是一个柔性物体,表情、姿态或发型、化妆的千变万化都给正确识别带来了相当大的麻烦。如何能正确识别大量的人并满足实时性要求是迫切需要解决的问题。

1.2国内外的研究现状 

人脸识别系统现在在大多数领域中起到举足轻重的作用,尤其是用在机关单位的安全和考勤、网络安全、银行、海关边检、物业管理、军队安全、智能身份证、智能门禁、司机驾照验证、计算机登录系统。我国在这方面也取得了较好的成就,国家863项目“面像检测与识别核心技术”通过成果鉴定并初步应用,就标志着我国在人脸识别这一当今热点科研领域掌握了一定的核心技术。北京科瑞奇技术开发股份有限公司在2002年开发了一种人脸鉴别系统,对人脸图像进行处理,消除了照相机的影响,再对图像进行特征提取和识别。这对于人脸鉴别特别有价值,因为人脸鉴别通常使用正面照,要鉴别的人脸图像是不同时期拍摄的,使用的照相机不一样。系统可以接受时间间隔较长的照片,并能达到较高的识别率,在计算机中库藏2300人的正面照片,每人一张照片,使用相距1--7年、差别比较大的照片去查询,首选率可以达到50%,前20 张输出照片中包含有与输入照片为同一人的照片的概率可达70%。

美国陆军实验室也是利用vc++开发,通过软件实现的,并且FAR为49%。在美国的进行的公开测试中,FAR,为53%。美国国防部高级研究项目署,利用半自动和全自动算法。这种算法需要人工或自动指出图像中人的两眼的中心坐标,然后进行识别。在机场开展的测试中,系统发出的错误警报太多,国外的一些高校(卡内基梅隆大学(Carnegie Mellon University)为首,麻省理工大学(Massachusetts Institute of Technology )等,英国的雷丁大学(University of Reading))和公司(Visionics 公司Facelt 人脸识别系统、Viiage 的FaceFINDER 身份验证系统、Lau Tech 公司Hunter系统、德国的BioID 系统等)的工程研究工作也主要放在公安、刑事方面,在考试验证系统的实现方面深入研究并不多。

1.3本系统研究内容

本系统主要对人脸的检测与定位做了深入研究。在人脸检测部分主要是对图像进行获取和预处理。图像获取主要是获取图像的基本信息,以便对图像的像素进行处理。预处理的包括对图像灰度化,中值滤波,对比度变化以及边缘提取。人脸预处理过程是计算机人脸识别中一个重要过程。人脸图像预处理的好坏对整个系统至关重要,对人脸预处理的研究具有非常重要的意义。特征定位是人脸识别的目的是确定单张人脸在图像中的位置,它通过标记人脸区域 来确定和计算人脸的各器官定位。人脸特征检测是检测人脸特征的有无和位置,比如说眼睛、鼻子、鼻孔、嘴巴、嘴唇等的有无和位置。

值得指出的是,人脸检测涉及的方法种类繁多(据报告可知,用于人脸检测方法的有150多种),且涉及的知识点较深,并各有特点,所以我们小组将人脸检测与人脸识别区分开来,因为后者只是前者一个简单问题。同时,我们把注意力集中在人脸检测方法上,而没有实现与数据库中的人脸匹配问题。

1.4目前研究中存在的问题

虽然人类的人脸识别能力很强,,能够记住并辨别上千张不同人脸,可是计算机则困难多了。其表现在:人脸表情丰富;人脸随年龄增长而变化;人脸所成图像受光照、成像角度及成像距离等影响;而且从二维图象重建三维人脸是病态( ill2po sed) 过程,目前尚没有很好的描述人脸的三维模型。另外,人脸识别还涉及到图象处理、计算机视觉、模式识别以及神经网络等学科,也和人脑的认识程度紧密相关。这诸多因素使得人脸识别成为一项极富挑战性的课题。

第2章 系统需求分析

2.1 系统功能需求

系统功能主要围绕人脸检测和人脸特征定位进行设计,首先该系统会对图像进行人脸检测,人脸检测主要是对图像进行预处理的过程,预处理这个模块在整个人脸识别系统的开发过程中占有很重要的地位。该系统主要是将处理后的人脸图片进行定位,将眼睛、鼻子、嘴巴标记出来。

2.1.1功能划分及描述

图像的处理方法很多,我们可以根据需要,有选择地使用各种方法。在确定脸部区域上,通常使用的方法有肤色提取。肤色提取,则对脸部区域的获取则比较准确,成功率达到95%以上,并且速度快,减少很多工作。

图像获取模块:

该模块主要是从图片库中获取图片,获取后的图片可以在软件的界面中显示出来以便进行识别。

图像预处理模块:

图像预处理就是对获取得来的图像进行适当的处理,使它具有的特征能够在图像中明显的表现出来。该模块中的子模块有如下几个,下面对它们进行概述:

中值滤波:在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量,因此需要将图片进行平滑操作以此来消除噪声。

灰度化:图像灰度化的过程就是把彩色图像转换为灰度图像的过程,彩色图像包含较多人脸特征信息,但是直接作为处理对象会使过程复杂化.相比之下灰度图像在保留了人脸主要特征信息的基础上,减少了总信息量。

Sobel提取(边缘提取):采用梯度微分锐化图像,使噪声、条纹等得到增强;对图像中的随机噪声也有一定的平滑作用;标记人脸的边缘,使其边缘显得粗而亮。

对比度增强:对比度增强,就是对图像的进一步处理,将对比度再一次拉开。它针对原始图像的每一个像素直接对其灰度进行处理的,其处理过程主要是通过增强函数对像素的灰度级进行运算并将运算结果作为该像素的新灰度值来实现的。通过改变选用的增强函数的解析表达式就可以得到不同的处理效果。

相似度计算:相似度计算是为了判别两对象的相似程度而设定的算法,比如文字、指纹、人脸等。为了便于二值化阈值的确定,肤色相似度计算的意义是通过计算出与人脸肤色相近的像素点,确定人脸区域,用灰度图象显示出来,并为二值化提供一个可计算出阈值的比较值。

二值化:通过一些算法,通过一个阈值改变图像中的像素颜色,令整幅图像画面内仅有黑白二值,该图像一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,以便有利于我们对特征的提取。

直方图:直方图是图象处理中一种十分重要的图象分析工具,它描述了一幅图像的灰度级内容,任何一幅直方图都包含了丰富的信息。从数学上来说图像直方图是图像各个灰度值统计特性与图像灰度值的函数,它统计了一幅图像中各个灰度级出现的次数和概率。

2.1.2 开发环境

  1. 硬件环境

硬件配置原则:具有可靠性,可用性和安全性,具有完善的技术支持。能够满足个人学习和设计需要。

运行本软件所需的硬件资源:CPU: 800M及以上;内存: 128M及以上

  1. 软件环境

系统软件配置原则能够满足该软件的可靠性,可用性和安全性的要求系统软件配置方案

① 配置有持续工作能力、高稳定性、高度可集成的开放式标准的操作系统,如Windows2000,Windows NT,UNIX,Linux等。

② 配备符合ANSI/ISO标准的高级程序设计语言处理软件。如:Visual C++ 6.0。

③ 熟悉C++高级程序设计语言。

2.1.3 运行环境

(1)硬件环境

CPU:800M以上;内存:128 M及以上。

(2)软件环境

可以运行在微软公司近年来所出的各种操作系统。如Windows 98、Windows Me、Windows 2000、Windows NT等。

2.2 可行性分析

在开发该人脸识别软件之前,我们查询了前人所写过的诸多论文以及源程序,在开发之时,结合了资料中的算法并揉进了自己的一些思想,使程序可以对人脸图片进行简易识别。

2.2.1操作可行性

该人脸识别软件需要如下的运行环境:CPU:800M及以上;内存:128 M及以上。安装有Windows 98、Windows Me、Windows 2000、Windows NT等操作系统中的其中一种。因此,从操作可行性来看,只要系统用户的硬件软件设备满足以上条件,即可用该人脸识别软件进行人脸的识别。    

2.2.2 技术可行性

图像的处理方法很多,我们可以根据需要,有选择地使用各种方法。在确定脸部区域上,通常使用的方法有肤色提取。肤色提取,则对脸部区域的获取则比较准确,成功率达到95%以上,并且速度快,减少很多工作。人脸自身变化的挑战:同一个人的人脸图像因为表情、精神状态、健康状况、姿态、整容、年龄变化、意外损伤、化妆、眼镜帽子、头发胡须等变化而发生巨大的变化;外部环境的挑战:光照环境条件、摄像设备、人与摄像设备的距离角度、图像存储质量等,都会使人脸图像发生教大变化。面队这些就要求我们进一步研究基于人脸肤色提取的算法,提高识别精度,,提高识别速度,提高系统的适用性。

2.3 预处理方案选择

2.3.1设计方案原则的选择

本应用程序的设计方案原则如下:

①采用较为先进的技术力量,保证应用程序在技术上具备一定的优势。

②采用成熟的技术,保证应用程序的安全性和可靠性。

③应用程序便于扩展和维护,易于技术的更新。

④应用程序充分利用现有的资源,尽量减少不必要的再投资。

⑤编写的代码必须严谨易读,代码的解释必须清楚明白,为应用程序的再开发提供应尽的责任。

2.3.2 图像文件格式选择

    图像采集是在Windows操作系统下开发的,需要了解在此环境下图像的存储、显示等方面的机制。在Windows操作系统中,任何图像格式(如.jpeg格式,.gif格式)在系统中显示之前最终必须转化为位图格式。BMP图像文件格式(位图格式)是微软公司为其Windows环境设置的标准图像格式,在设计的过程中,为了定位和特征提取的方便,我们采用的是BMP格式的图像。     

2.3.3开发工具选择

本次设计所用的开发工具是Microsoft Visual C++ 6.0。 Visual C++ 6.0是Microsoft公司推出的一种可视化编程工具。它支持多平台和交叉平台的开发,将各种编程工具如编辑器、连接器、调试器等巧妙的结合在一起,构成一个完美的可视化开发环境。用户无需通过繁杂的编程操作,即可完成Windows下应用程序的编辑、编译、测试和细化等工作。

2.3.4算法选择分析

本文主要研究的对象是图像预处理模块,该模块分为中值滤波、图像灰度化、相似度计算、二值化每个小模块的实现都有许多相应的算法。下面将本系统采用的算法进行介绍:

中值滤波:在图像的采集过程中,由于各种因素的影响,图像中往往会出现一些不规则的随机噪声,如数据在传输、存储时发生的数据丢失和损坏等,这些都会影响图像的质量,因此需要将图片进行平滑操作以此来消除噪声。但是如果平滑不当,就会使图像本身的细节如边界轮廓、线条等变的模糊不清,为了既平滑掉噪声有尽量保持图像细节,本系统采用中值滤波算法处理。

图像灰度化:图像灰度化是将图像变成灰色,本系统中采用加权平均值法来实现图像的灰度化,这样可以获得最合理的灰度图像。

肤色相似度计算:相似度计算是为了判别两对象的相似程度而设定的算法,比如文字、指纹、人脸等。为了便于二值化阈值的确定,肤色相似度计算的意义是通过计算出与人脸肤色相近的像素点,确定人脸区域,用灰度图象显示出来,并为二值化提供一个可计算出阈值的比较值。

二值化:通过一些算法,通过一个阈值改变图像中的像素颜色,令整幅图像画面内仅有黑白二值,该图像一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,以便有利于我们对特征的提取。

第3章 系统的概要设计

本章主要介绍系统的结构设计的流程以及系统各模块的功能及相关原理。应用程序的总体结构设计流程图如图3-1所示:

图像预处理的层次图如图3-2所示:

图3-2   预处理的层次图

人脸定位的层次图如图3-3所示:

图3-3  人脸定位的层次图

3.1 各模块功能概述

以上是该系统的总体结构设计图以及图像预处理模块的层次图。下面介绍系统中的各模块的具体功能。

3.1.1图像获取模块

该模块主要是从图片库中获取,获取后的图片可以在软件的界面中显示出来以便进行识别。

3.1.2人脸区域获取

该系统中图像里人脸区域的获取,主要是根据肤色来进行获取,通过肤色非线形分段色彩变换来实现。这一非线性分段色彩变换得到的肤色模型属于色彩空间中的聚类模型,这一类肤色模型的建立首先要选取一种合适的色彩空间。

3.1.3图像预处理模块

图像预处理就是对获取得来的图像进行适当的处理,使它具有的特征能够在图像中明显的表现出来。该模块中的子模块有如下几个,下面对它们进行概述:

★ 中值滤波

中值滤波将对图像进行平滑处理,在图像采集过程中,由于各种因素的影响,图像往往会出现一些不规则的噪声,入图像在传输、存储等都有可能产生数据的丢失。从而影响图像的质量。处理噪声的过程称为滤波。滤波可以降低图像的视觉噪声。

★ 灰度化

图像灰度化的过程就是把彩色图像转换为灰度图像的过程,彩色图像包含较多人脸特征信息,但是直接作为处理对象会使过程复杂化.相比之下灰度图像在保留了人脸主要特征信息的基础上,减少了总信息量。

★ 对比度增强

对比度增强,就是对图像的进一步处理,将对比度再一次拉开。使图象原本模糊的边缘变得清晰。

★ Sobel边缘提取

Sobel提取的优点:采用梯度微分锐化图像,同样使噪声、条纹等得到增强,Soble算子则在一定程度上克服了这个问题:由于引入了平均因素,因而对图像中的随机噪声有一定的平滑作用;由于它是相隔两行或两列之差分,故边缘两侧之元素得到了增强,故边缘显得粗而亮。

★ 相似度计算

相似度计算是为了判别两对象的相似程度而设定的算法,比如文字、指纹、人脸等。为了便于二值化阈值的确定,肤色相似度计算的意义是通过计算出与人脸肤色相近的像素点,确定人脸区域,用灰度图象显示出来,并为二值化提供一个可计算出阈值的比较值。

★ 二值化

二值化的目的是将采集获得的多层次灰度图像处理成二值图像,以便于分析理解和识别并减少计算量。二值化就是通过一些算法,通过一个阈值改变图像中的像素颜色,令整幅图像画面内仅有黑白二值,该图像一般由黑色区域和白色区域组成,可以用一个比特表示一个像素,“1”表示黑色,“0”表示白色,当然也可以倒过来表示,这种图像称之为二值图像。这便有利于我们对特征的提取。该设计中采用组内方差和组外方差来实现二值化。

3.1.4图像模块定位

对候选特征进行筛选时,首先割据颜色信息提出那些伪特征。然后用PCA模板和几何特征确定眼睛和嘴巴。

★  颜色筛选

无论是眼睛还是嘴巴,都位于人脸的非肤色区域。而且眼睛的颜色是黑暗分明,利用这些知道可以淘汰很多候选,减少PCA验证的负担。

★  双眼的定位

把筛选过的特征区域两两配对,再用PCA模扳进行严整,就可以得到真正的双眼

大使,PCA严整有时候难以区分眉毛与眼睛,所以还要用一些几何特性进一步筛选,由于假定姿态是正的,双眼必定位于人脸的上半部分,他们的连线是近似水平的,而且他们的中心比眉毛低,运用这些判据,可以区分眉毛和眼睛。

★  鼻子的定位

在确定了眼睛的位置以后,鼻子的位置基本确定,以眼睛的瞳距为1来计算,鼻子到两眼中心的距离为0.7到1。在这附近搜索颜色较深的区域,大致能得到鼻孔的位置(有的侧面图一个鼻孔基本不可见,也就无法检测出来了)。然后在两鼻孔上访一定范围内(鼻孔的距离的1/2左右)找亮度最高的点作为鼻尖。

★  嘴巴的定位

找到双眼之后,可以在它们的下方搜索候选特征区域,寻找非肤色面积较大、近似位于双眼对称的候选作为嘴巴。然后根据先验知识调整嘴巴的大小。

第4章 系统详细设计

本章主要对图像处理这一模块进行详细介绍,对其子模块所用到的算法及具体实现进行详细讲述。

4.1 系统的运行流程图

图4-1   系统流程图

4.2 图像处理详细设计

4.2.1图像灰度化

彩色图像包含较多人脸特征信息,但是直接作为处理对象会使过程复杂化。相比之下灰度图像在保留了人脸主要特征信息的基础上,减少了总信息量。

  1. 算法思想

      灰度化的处理方法主要有3种:

  • 最大值法:使RGB的值等于3值中的最大一值,即,

                           式(4.1)

最大值法会完成亮度很高的灰度。

  •  平均值法:取R,G,B的平均值,即,

                             式(4.2)

平均值法会完成比较柔和的灰度。

③  加权平均值法:根据重要性或其他指标给R,G,B赋予不同的权值,并使RGB的加权值平均,即,

                        式(4.3)

其中

分别为R,G,B的权值。实验和理论推导证明当

 时,即当,

                     式(4.4)

                                        式(4.5)

时,能得到最合理的灰度图像。

  1. 具体实现灰度化功能

①  在明白了灰度化的原理之后,就可进行编码来实现该功能。在编辑界面中添加一个按钮控件,将其命名为‘灰度化’,并其ID号设为IDC_BTHD, 对应文件CFaceDetectDlg.Cpp中的函数OnBthd()实现.

②现该模块的核心代码如下:

//编写就算像素点灰度值的函数

int CPreProcess::CalGray1(int blue,int green,int red)

{

//利用灰度计算公式

int ColorGray=(int)((green * 59 + red * 30 + blue * 11) / 100);

//将像素值限制在0到255

if (ColorGray<0)

{

ColorGray=0;

}

else if (ColorGray>255)

{

ColorGray=255;

}

return  ColorGray;

}

//编写OnBtGray()函数

//获取红色分量

int ColorRed=m_tOriPixelArray[i][j].rgbRed;

//获取绿色分量

int ColorGreen=m_tOriPixelArray[i][j].rgbGreen;

//获取蓝色分量

  int ColorBlue=m_tOriPixelArray[i][j].rgbBlue;

//调用函数,计算灰度值

int cgray=method3->CalGray1(ColorBlue ,ColorGreen  , ColorRed ) ;

//显示灰度图像

m_tResPixelArray[i][j].rgbBlue = m_tResPixelArray[i][j].rgbGreen =

  m_tResPixelArray[i][j].rgbRed  =cgray;

//重置位图

MakeBitMap( );

}

//method3是定义的一个函数指针,定义如下:

CPreProcess  *method3;

//初始化如下

method3 = new CPreProcess(m_tOriPixelArray,m_nWndWidth,m_nWndHeight);

  • 图像灰度化效果:

     

     

         

    图4-2   图像灰度化

4.2.2 灰度变换

按照一定的规律修改像素的灰度值,使图像的亮度或者对比度发生改变,使之更易于分辨,达到更好的视觉效果。

  1. 具体实现功能

进行编码来实现该功能:

在编辑界面中添加一个滑动条控件和文本编辑器,将其命名为‘灰度化变换’,并其ID号分别设为IDC_SLIDER1, IDC_EDIT1,对应文件CFaceDetectDlg.Cpp中的函数OnReleasedcaptureSlider1()和OnChangeEdit1()实现。

打开ClassWizard的Member Variables标签,给每个控件添加所需的成员变量,参数如下:

表4.1

空间ID号

变量类型

变量名

范围和大小

IDC_SLIDER1

CSliderCtrl

m_Slider

――

IDC_EDIT1

int

m_Gray

0~255

在滑动条的消息处理函数OnReleasedcaptureSlider1()中设置滑动条的值使它等于文本编辑框的初始值。代码为:

//设置滑动条的初始值

m_Slider.SetPos(m_Gray); 

 //刷新界面

UpdateData(true);     

在滑动条的消息处理函数OnReleasedcaptureSlider1()中进行灰度化变换,将滑动条的值赋给灰度,并将其控制在【0,255】之间。代码为:

cgray+=m_Gray;

  if (cgray<0)

 {

 cgray=0;

 }

 if(cgray>255)

 {

 cgray=255;

 }

m_tResPixelArray[i][j].rgbBlue = m_tResPixelArray[i][j].rgbGreen = m_tResPixelArray[i][j].rgbRed  =cgray;

   }

   }

MakeBitMap();

}

//重置位图 MakeBitMap();的主要代码

{

   CClientDC ClientDC(pDCShow->GetWindow());

if(m_pResMap!=NULL) delete m_pResMap;

m_pResMap=new CBitmap();

m_pResMap->CreateCompatibleBitmap(&ClientDC,m_nWndWidth,m_nWndHeight);

CDC  dc;

dc.CreateCompatibleDC(&ClientDC);

dc.SelectObject(m_pResMap);

for(int i=0; i<m_nWndHeight; i++)

for(int j=0; j<m_nWndWidth; j++)

dc.SetPixelV(j,i,RGB(m_tResPixelArray[i][j].rgbRed,m_tResPixelArray[i][j].rgbGreen,m_tResPixelArray[i][j].rgbBlue));

dc.DeleteDC();

MyDraw();

}

  1. 效果图

图4-3  比较柔和的灰度图像

图4-4  灰度较强图像

4.2.3 sobel边缘提取

图像边缘:是指图像中象素灰度值有阶跃变化或屋顶状变化的那些象素的集合。图像边缘是一种重要的视觉信息,图像边缘检测是图像处理、图像分析、模式识别、计算机视觉以及人类视觉的基本步骤。其结果的正确性和可靠性将直接影响到机器视觉系统对客观世界的理解。实现边缘检测有很多不同的方法,也一直是图像处理中的研究热点,人们期望找到一种抗噪强、定位准、不漏检、不误检的检测算法。经典的算法[1-2]中主要用梯度算子,最简单的梯度算子是Roberts算子,比较常用的有Prewitt算子和Sobel算子,其中Sobel算子效果较好。

  1. 算法思想

Sobel边缘检测算子使用两个如下有向算子(一个水平的,一个是垂直的),每一个逼近一个偏导数:

       

   

                                式(4.6)

然后将

的值赋给待求点的灰度值。

(2) 具体实现Sobel功能

首先对整张图片的像素点进行扫描,得到每个像素点的R , G , B ,然后计算得到这个像素点的灰度值,

// -1    0    1

// -2    0    2

// -1    0    1

col=temp6 + 2 * temp7 + temp8 - temp1 - 2 * temp2 - temp3;                   式(4.7)

// -1    -2    1

//  0     0    0

//  1     2     1

 row=temp3 + 2 * temp5 + temp8 - temp1 - 2 * temp4 - temp6;                   式(4.8)

        

temp=method3->CalSobel(col,row);                                    式(4.9)

//对计算的值进行限制

 if (temp<0)

 {

 temp=0;

 }

 if(temp>255)

 {

 temp=255;

 }

 //重置像素

     m_tResPixelArray[i][j].rgbBlue = m_tResPixelArray[i][j].rgbGreen =

          m_tResPixelArray[i][j].rgbRed  =temp;

   }

   }

   

MakeBitMap();

}

{

CClientDC ClientDC(pDCShow->GetWindow());

if(m_pResMap!=NULL) delete m_pResMap;

m_pResMap=new CBitmap();

m_pResMap->CreateCompatibleBitmap(&ClientDC,m_nWndWidth,m_nWndHeight);

CDC  dc;

dc.CreateCompatibleDC(&ClientDC);

dc.SelectObject(m_pResMap);

for(int i=0; i<m_nWndHeight; i++)

for(int j=0; j<m_nWndWidth; j++)

dc.SetPixelV(j,i,RGB(m_tResPixelArray[i][j].rgbRed,m_tResPixelArray[i][j].rgbGreen,m_tResPixelArray[i][j].rgbBlue));

dc.DeleteDC();

MyDraw();

}

  1. 效果图

    

                      

  图4-5  sobel边缘提取

4.2.4 对比度增强

(1)进行编码来实现该功能:

在编辑界面中添加一个滑动条控件和文本编辑器,将其命名为‘灰度化变换’,并其ID号分别设为IDC_SLIDER2, IDC_EDIT2,对应文件CFaceDetectDlg.Cpp中的函数OnReleasedcaptureSlider2()和OnChangeEdit2()实现。打开ClassWizard的Member Variables标签,给每个控件添加所需的成员变量,参数如下:

表4.2

空间ID号

变量类型

变量名

范围和大小

IDC_SLIDER1

CSliderCtrl

m_Slider2

――

IDC_EDIT1

int

m_Degree

0~255

       

在滑动条的消息处理函数OnReleasedcaptureSlider2()中设置滑动条的值使它等于文本编辑框的初始值。代码为:

for (int i=0;i<m_nWndHeight;i++)

 {

for (int j=0;j<m_nWndWidth;j++)

{

        //获取红色分量

int r=m_tResPixelArray[i][j].rgbRed;

           //获取绿色分量

int g=m_tResPixelArray[i][j].rgbGreen;

           //获取蓝色分量

int b=m_tResPixelArray[i][j].rgbBlue;

  //对RGB进行变换

int red=abs((127-r)*m_Degree)/255;

int green=abs((127-g)*m_Degree)/255;

int blue=abs((127-b)*m_Degree)/255;

//使颜色对比度更加明显

if(r>127)r+=red;

else

    r-=red;

if (g>127)

{

g+=green;

}

else

   g-=green;

if (b>127)

{

b+=blue;

}

else

b-=blue;

 if (r > 255) r = 255;

     if (r < 0) r = 0;

     if (g > 255) g = 255;

     if (g < 0) g = 0;

     if (b > 255) b = 255;

     if (b < 0) b = 0;

    m_tResPixelArray[i][j].rgbRed=r;

m_tResPixelArray[i][j].rgbGreen=g;

m_tResPixelArray[i][j].rgbBlue=b;

}

 }

 MakeBitMap();

 UpdateData(true);

(2) 效果图

图4-6  原图像

图4-6  对比度增强后效果图

第5章 系统综合与测试

5.1 系统综合

人脸识别应用程序采用Visual C++6.0作为开发工具,利用MFC采用面向对象的方法,用C++语言编写程序。将面向对象的编程技术直接应用于图像处理知识,并按功能进行细化,建立通用的类,从而减少了繁琐性,增加代码的可重用性和可移植性,提高了效率。本设计中建立的多层次类结构都是可以修改和维护的。所有的类都是开放的,可以向其中添加新方法以支持新功能,而不会对原有功能构成任何威胁。本设计中建立的多层次类结构都是可以修改和维护的。所有的类都是开放的,可以向其中添加新方法以支持新功能,而不会对原有功能构成任何威胁。

5.2 结构设计

图像预处理设计:

 表5.1

函  数

功   能

OnBtGray()

图象灰度化

CalGray1(int,int,int)

计算图象的灰度值

OnChangeEdit1( )

设置滑动条的初始值

OnReleasedcaptureSlider( )

改变灰度变化

MakeBitMap( )

重置位图

SetRange()

设置滑动条的范围

GetPos( )

得到滑动条的值

SetPos()

设置滑动条的值

OnBUTTONSobel( )

实现Sobel边缘提取

OnCustomdrawSlider1( )

将滑动条的消息映射给文本框

各成员函数解析

函数名称   :        OnBtGray

参数       :        CSliderCtrl  m_Slider  ---- 灰度滑动条的值

                     int  m_Gray   ---- 编辑框的值

返回值     :        void

说明       :       该函数将编辑框的值映射给滑动条

函数名称   :        CalGray1

参数       :       int Blue ----   待求点像素的蓝色值

                    int Green ----  待求点像素的绿色值

int Red    ---- 待求点像素的红色值

返回值     :       int     ----    待求点的灰度值

说明       :       该函数计算某像素点的灰度值

函数名称   :        OnChangeEdit1

参数       :        CSliderCtrl  m_Slider  ---- 灰度滑动条的值

                     int  m_Gray   ---- 编辑框的值

返回值     :        void

说明       :        该函数将编辑框的值映射给滑动条

函数名称   :        OnReleasedcaptureSlider

参数       :        void

返回值     :        void

说明       :        该函数将编辑框的值映射给滑动条

函数名称   :        MakeBitMap

参数       :        void

返回值     :        void

说明       :        重新设置位图

函数名称   :        SetRange     

参数       :        int nMin ----灰度滑动条的最小值

                     int nMax----灰度滑动条的最大值

                     BOOL bRedraw  

返回值     :        void

说明       :        设置滑动条的最大最小值,确定滑动条的范围

函数名称   :        GetPos     

参数       :        void

返回值     :        void

说明       :        得到滑动条的当前值

函数名称   :        SetPos     

参数       :        int nPos  ----设置滑动条的值

返回值     :        void

说明       :        设置滑动条的值

函数名称   :        OnBUTTONSobel     

参数       :        void

返回值     :        void

说明       :        设置滑动条的值

5.3 系统测试

测试是为了找出程序的错误。正如测试的规则所确定的一样:测试是为了发现程序中的错误而执行程序的过程;好的测试方案是极可能发现迄今为止尚未发现的错误的测试方案;成功的测试是发现了迄今为止尚未发现的错误的测试。本系统主要由图像处理、人脸定位、特征提取组成,而图像处理对于后面的工作结果好坏起着至关重要的作用,因此从软件开发的最初阶段我们就要对软件进行不断的测试,对图像处理模块中的各个子模块进行测试以便检测经过处理后的图像效果是否达到预期的效果。下面对图像处理模块的测试过程进行描述:

图像处理模块 :

该模块分为、图像变成灰色、对比度变换、实现图像对比度增强、Sboel边缘提取。对该模块进行测试的方法是:采用多张24位的彩色图像来进行逐一测试,看这些图片经过处理后是否达到预期的效果,如图像灰度化模块的检测则需看所测的彩色图片是否变成灰色;而灰度变换就是为了调试图像最适合的灰度级。图像对比度增强是为了将图像的特征一步一步显现出来,在测试的过程中,用含人脸的图片进行检测看是否图像的特征显示出来的是否足够明显。

5.3.1 测试原则

1、应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。

2、测试用例应由测试输入数据和与之对应的预期输出结果两部分组成。  

3、程序员应避免检查自己的程序。(注意不是指对程序的调试)

4、在设计测试用例时,应当包括合理的输入条件和不合理的输入条件。不合理的输入条件是指异常的,临界的,可能引起问题异变的输入条件。

5、充分注意测试中的群集现象。经验表明,测试后程序残存的错误数目与该程序中以发现的错误数目或检错率成正比。应该对错误群集的程序段进行重点测试。 

6、严格执行测试计划,排除测试的随意性。测试计划应包括:所测软件的功能,输入和输出,测试内容,各项测试的进度安排,资源要求,测试资料,测试工具,测试用例的选择,测试的控制方法和过程,系统的组装方式,跟踪规则,调试规则,以及回归测试的规定等等以及评价标准。

7、应当对每一个测试结果做全面的检查。  

8、妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。

知道了测试的目的和测试的原则之后,现在进行软件的具体测试,对软件的功能实现进行详细的测试。

第6章 总结

经过几个月的毕业设计,对我各方面的影响都很大,对此我体会颇多。虽然这次设计成品还存在着很多问题,但我从中学到了不少知识。在开发过程中遇到的问题不计其数,其中最令人感到头痛的是一些不容易注意到的小错误,例如在编写Sobel边缘提取这个按钮的时候,没有考虑到BMP图片的文件格式,所以编写程序得到的效果一直不能达到预想的效果,后来通过请教我们小组做文件存储这方面的成员才发现了这个错误;开发一个大的系统的时候,不管是个人还是团队,必须作好需求分析,建立好数据库,如果需求分析不成功,那到后面是很难做下去的,本系统的开发就遇到这样的情况,以至做了很多无用功,经常全部从新部署。一个好的需求分析报告将给系统带来很大的惊喜,它会很大程度上减少程序员的负担。

系统完成在后,发现做事情不但要独立自主的完成任务,也要通过周围的朋友或是网络资料库等获取信息,只有大量的使用周围方便的活资源,而不只依赖与书本上的例子,才能得到更大的进步,做起事情来才有事半功倍的效果。

本次毕业设计是针对我们大学四年来所学知识而进行的一次全面性的检验,它涵盖的知识面广,涉及到多个领域,需要我们具有较高的综合知识水平及较强的解决问题的能力。同时也是对我们工作能力,团队合作精神的一次考验。通过这次设计,一方面让我更进一步的熟悉和掌握了C++语言的基本语法以及更深入的了解了算法和Visual C++开发工具的使用。另一方面在动手能力上有了很大的提高,以前学的知识只是“知识”,而现在是将“知识”转化成自身的本领,全面提高了自身解决具体问题的能力。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/488233
推荐阅读
相关标签
  

闽ICP备14008679号