基于opencv的人脸识别系统毕业设计论文

发布时间:2017-08-14 16:20:15

本科毕业设计(论文)

基于OPENCV的人脸检测与检测系统



毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作 者 签 名:       日  期:       

指导教师签名:        日  期:       

使用授权说明

本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:        日  期:       



学位论文原创性声明

本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。

作者签名: 日期: 年 月 日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名: 日期: 年 月 日

导师签名: 日期: 年 月 日



近几年来计算机网络传输、监控及视频分析在社会上不断的兴起,数字信息已经超越了模拟信息其主要原因在于数字信息更易于存储和分析,因此,在视频监控领域采用计算机对视频信息进行采集、压缩、分析、存储得到了很多人的青睐。

基于OPENCV的人脸检测与检测系统在计算机模式计算和模式检测等方面具有极其重要的作用。在基于人脸检测,图像压缩,视频监控,运动物体检测等方面有着更重要的应用价值。近年来计算机视觉技术在视觉领域中取得了飞速的发展,并在其他领域中得到了广泛的应用。本论文以OPENCV库为基础,采用QT作为图形界面开发,具有人脸采集,图片训练,数据库管理及人脸检测等功能。该系统能够进行长时间的运行并测试稳定,在程序中提供了统一的接口以并进行二次开发

关键词:人脸检测,人脸检测,级联分类检测器



ABSTRACT

In recent years, computer network transmission, monitoring, and video analysis showed that the continuous rise in the social, digital information has gone beyond the main reason is that analog information is easier to store digital information and analysis, therefore, in the field of video surveillance video information by computer acquisition, compression, analysis, storage get a lot of people of all ages.

Opencv based on face detection and recognition system in the computer model and pattern recognition, and so has an extremely important role. Based on face recognition, image compression, video surveillance, detection of moving objects and so has a more important application value. In recent years, in the visual field of computer vision technology has made rapid development, and in other areas has been widely used. This thesis is based opencv library, using qt as a graphical interface development with human face capture, image training, database management, and face recognition and other functions. The system is capable of stable long run and test the program in order to provide a unified interface and secondary development.

KeywordsFace detection, face recognition, cascade classification detect





1 绪论

人脸检测与检测是计算机视觉与模式检测领域中重要的研究方向,人脸检测在图像处理与视频检索、视频监控、视频显示等方面占据着重要的位置。本文提出了基于32位彩色图像对人脸进行检测的方法,介绍的主要内容是图像处理,重点分析基于OPENCV人脸检测与检测的原理及方法,采用基于OPENCV的级联分类检测器,能够根据视频图像提取人脸特征进行训练。

目前,高性能的微电子和视觉处理系统已经运用在各个领域中,特别是基于视觉处理系统中的人脸检测系统已经走在了科学前沿。在生物检测技术中人脸检测是运用最为广泛的技术,对图像进行处理主要用到,光线补偿技术、高斯平滑技术和二值化技术等。对图像先进行补光处理,处理过后的图片通过定位眼睛、鼻子、嘴唇来确定脸部区域,最后根据人脸固有的眼睛对称性来确定是否是一个人脸,再使用高斯平滑,用来消除图像的噪声,最后进行二值化处理,采用局部阈值来进行二值化,接下来就对图片中的人脸进行定位,特征提取和检测操作。经过验证,图像通过预处理对以后的检测率有很大的影响,可以提高人脸检测和检测的准确率。在其他国家,人脸检测技术已经运用在智能家居、智能机器人、以及军事安防和其他安全部门。在国内,我们对人脸检测技术的研究始于20世纪90年代,主要用在公共安全领域、智能家居、金融管理、物业管理、以及网络安全和考勤等方面。

1.1 课题提出的背景

随着数字信号和模拟信号处理理论和计算机的发展,通过CMOS摄像头获取的模拟信号转化为数字信号,然后使用计算机实现对视觉信息的处理,这就提出了一个新的理念“怎样通过计算机来进行生物的检测”,随着科学技术的不断创新及发展这个理念被实现了,生物特征检测技术中人脸的自动检测占有重要的地位人脸检测技术与其他生物检测方法相比,人脸检测具有算法简单、设计更直接、友好和方便等特点,因而人脸自动检测问题的研究不仅具有重要的应用价值,而且具有重要的理论意义。人脸检测主要用在公共安全领域、智能家居、金融管理、物业管理、以及网络安全和考勤等方面。由于数字信息比模拟信息更易于存储和处理,因此,在视频监控领域采用计算机对视频信息进行采集、存储、分析得到许多人的青睐[1]

基于OPENCV的人脸检测和检测在计算机模式检测与视觉领域中占有重要的地位,人脸检测和检测利用分析比较人脸特征来进行身份鉴定的生物技术,通过级联分类检测器来进行人脸图片的训练,然后从摄像头上采集图片在库中进行比对,如果比对结果在预设的阀值之内,则表示检测成功。

1.2 人脸检测技术的研究意义

怎样使计算机能够像人一样能够分析各种视觉信息,使用一种编制的方式来计算获得的视觉数据。使机器智能化,通过机器来模拟人类所拥有的能力,像人类一样通过眼睛来观察和获得视觉信息,并使用大脑来处理视觉所获得的信息。近年来各个领域使用了计算机视觉技术来解决该问题,该技术在视觉模式中具有重要的应用价值。人脸检测技术采用了视频数据的采集,为采集的数据分配PCA空间,将视频数据进行格式的转换,将数据库中存储的视频数据进行训练,最后得到一个32位的浮动图,该技术具有操作更简单、直接等优点。人脸检测与检测在生物体特征检测技术中具有重要的应用价值。视频跟踪检测技术除了在智能视频监控系统中具有非常重要的应用外,在视频会议、人机交互、门禁控制、家庭娱乐以及信息安全等场合也有着重要的应用 [2]

1.3 课题研究方法

1.3.1 人脸检测的原理

采集的图片进行人脸检测通过以下步骤,先对需要检测的目标进行特征的提取,利用这些特征数据建立目标检测模型,然后将需要检测的图像与目标模型进行匹配,如果匹配成功则使用矩形来进行标记。

1.3.2 人脸检测的原理

人脸检测技术股由于受到一些光线,环境的影响会造成检测的精度不高,

现在大多数都集中研究在正面人脸图像的检测上,但由于人脸面部表情、拍照角度或拍照光照等条件的变化下,得到的人脸照片中的特征不同,因此使用数据库中存储的样本的有限个角度拍摄的照片,去检测任意角度的照片,使检测范围得到很大的限制。

为了解决以上出现的问题,现在人们提出了使用几何特征检测法来进行人脸的检测选取的特征点必须具有代表性,能代表一个人的面部特征,唯一标识该个体选取眼角点、鼻翼点、嘴角点等标识眼、耳、口、鼻及脸部轮廓的特征点

1.4 人脸检测的国内外发展概况

在许多领域中已经使用到了人脸检测与检测技术,人脸检测技术在世上起到了举足轻重的作用,英国的布莱索在1996年开始了对人脸检测技术的研究,经过三十多年的发展,人脸检测技术已经得到了高速的发展,且取得了巨大的成功。

1.4.1 国内发展概况

在我国对人脸检测技术的研究始于20世纪80年代,国内主要有清华大学,北京理工大学,和自动化所的研究人员从事人脸检测与检测的研究,国内主要从以下三个方面进行研究:

(1)基于几何特征的人脸正面自动检测方法。

(2)基于代数特征的人脸正面自动检测方法。

(3)基于连接机制的人脸正面自动检测方法。

近年来,随着计算机硬件性能的不断发展,基于图像传感器的视屏监控系统获得了迅猛的发展,各种面向复杂的应用背景的视频监控系统也随之大量涌现,随着信息技术的不断发展,视频监控系统在商业、国防安全和军事应用领域中的需求将日益增加。由于视频监控系统具有如此大的应用背景,它引起了许多国家的高度重视,一些国家投入了大量资金和科研人员进行了广泛的研究[3]

1.4.2 国外发展概况

国外很多人从事对人脸检测与检测问题的研究,主要有著名的MIT,CMU,欧洲,日本等国家,随着人脸检测的深入发展研究,国际上发表的有关论文数量也在大幅度的增加,国外主要从以下几个方面进行研究:

(1)模板匹配

(2)示例学习

(3)神经网络

(4)基于隐马尔可夫模型的方法

(5)基于AdaBoost人脸检测算法

(6)基于彩色信息的方法

(7)基于形状分析的方法

2 系统的需求分析与方案选择

基于OPENCV人脸检测系统应用非常广泛人脸检测技术现已经日趋成熟,且现在都具有高可靠性,高检测率等特点,在我国及其他一些国家的专家学者正处于研究阶段,该技术在不断的改进与更新,以便使系统的检测率达到新的高度。

2.1 可行性分析

现在一些科研人员已研发了一套算法,很精确的能够在一定的环境下进行人脸的检测还存在一些科研爱好者来研究人脸检测算法,使得现在基于OPENCV人脸检测技术已经发展的非常迅速,我在原有的算法基础上进行了改进,融合了自己的一些方法提高了检测精度。

2.1.1 技术可行性

在对视频图像的处理方法有很多,我根据系统的需要,有选择地使用了一些算法。

在对视频图像脸部进行标记及采集,使用的方法有肤色检测我主要使用的特征采集及转换技术来进行人脸的检测检测率率可以达到90%缩短了检测的时间并且该检测算法简单易懂

光线补偿技术:因为在不同的环境中,光线对图像会产生干扰,图像就会变得或明或暗,我们就要对其进行调整,所以采用光线补偿来处理图像的亮度变化。

高斯平滑技术:在视频图像的采集过程中,由于外界条件的干扰,则采集的图片中会出现一些噪音,这就会使图像在进行转化、检测时发生的数据的遗失和损坏等,这些会对以后图片的训练产生干扰所以将图片进行平滑处理来消除噪声的干扰

灰度变换技术:进行灰度转换时,我们要保证图像信息保持不变。我们在使用灰度转换时先对图像数据进行统计,经过比较后得出一个合适的灰度值,然后对图像进行灰度变换。

灰度均衡技术:经过灰度转换后,就要进行灰度均衡化操作最后通过灰度分布来对图像进行灰度均衡。

对比度增强技术:通过对某个图片的点进行定位,然后将其周围的像素值进行统计,再通过聚集技术将相邻的像素值拉开,使他们之间的差距拉大。

2.1.2 操作可行性

基于OPENCV人脸检测技术运行在以下环境中:CPU500M以上;内存:64 M以上。安装有Linux fedoraLinux ubuntuLinxu core等操作系统中的其中一种。另还装有摄像头进行图片采集和检测,该系统主要使用的为CMOS摄像头,也可使用USB摄像头来进行图像的采集。因此,从操作可行性来看,只要系统用户的硬件软件设备满足如上的要求就可以使用该系统进行人脸的检测

2.2 需求分析

2.2.1 应用程序的功能需求分析

通过这个系统先通过CMOS摄像头对人脸进行采集,然后对人脸进行检测,将采集到的人脸图片进行训练得到一个模型,最后使用当前的图像与该模型进行比对,这个过程称之为预处理。预处理这个模块在整个人脸检测系统的开发过程中占有很重要的地位,只有预处理模块做的好,才可能很好的完成后面的人脸定位和特征提取这两大关键模块[4]。本系统的主要具备如下功能:

(1)图像获取功能:

图片的获取主要是通过从CMOS或者USB摄像头来获取图像,从CMOS摄像头获取的为模拟信号,必须要通过YUV转换得到数字信号,得到的图片保存在数据库中。

(2)图像预处理功能:

该模块主要包括图像光线补偿、图像变成灰色、高斯平滑、均衡直方图、实现图像对比度增强、二值化变换等[8]

(3)人脸定位功能:

从摄像头获取的图片经过前期的预处理后,将通过检测器来标记眼睛、鼻子、嘴唇来确定人脸区域,并对该图片的特征进行提取。

(4)特征提取功能:

对人脸检测通过后将对人脸进行特征的提取,因为每个人的脸型不一样,而且两眼之间的距离等因素,可以确定每个人的不同特征。

(5)检测功能:

从摄像头获取的图片进过处理后,将提取的特征值与预先训练好的目标模型进行比对,来对当前的图片进行检测

2.2.2 开发环境需求分析

2.2.2.1 硬件环境

(1)硬件配置原则

硬件的配置需要该硬件具有可靠性、稳定性、安全性等特点,在软件支持的环境下,能实时的运行程序。

(2)运行本软件所需的硬件资源

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

2.2.2.2 软件环境

(1)检测系统的软件运行规则

能够在指定的运行环境下,满足该软件的耦合性,易扩性和规范性

(2)系统软件的配置方案

软件的配置需要有高度集成性,高稳定性,能够运行在嵌入式的平台下,Windows2000Windows NTUNIXLinux等。

配置需要满足ISO的标准,并且能够保持系统的兼容性。如:Qt designer

熟悉C++/C等编程语言。

2.2.2.3 运行环境需求分析

(1)系统运行的硬件环境

CPU500M以上;内存容量:64 M以上。

(2)系统运行的软件环境

该系统可以使用在以下操作系统中。如Linux 3.0.5内核、Linux ubuntu系统、Linux ferdor系统等。



3 究方案及技术路线

3.1 人脸检测方案

在生物特征检测技术中人脸检测不同于其他的计算机视觉检测技术,人脸检测通过将视觉信号转换为机器能够检测的数字信号,从而使用计算机来进行判断处理。计算机通过摄像头看到的东西要简单的多,简单来说,就是一堆由数字组成的矩阵,这些数字表明了物体发出的光的强弱,摄像头的光敏元件将光信号转化成数字信号,将其量化为矩阵[5]

计算机如何能够从训练出来的数据库中比对出这是一个人脸,这是一个比较困难的事但是计算机可以通过对颜色数据的判断来进行处理。彩色图片中的像素是由许多色彩通道组成的,所有的彩色图片由RGB三通道组成分别代表有红色通道,绿色通道和蓝色通道灰度图都是由RGB组成,如果某个点由6位组成,该像素的通道值为2^6=64那么该像素的总和通道值为3*6=18则该图片由18位色彩值组成的18位的图片进行转换是很复杂的事情,我们就需要先对图片进行前期的转换,即是将彩色图片转换为灰度图片,通过这样的转换后可以减低数据量。先将图片转化为灰度图,然后将这个灰度图的对比度增高,这样可以使得图片本来暗的地方更暗,亮的地方更亮一些。这样处理以后,图片就更容易被算法设别出来了[6]

图3.1 级联分类器

在扫描待检测图片的时候,以边界特征中的(a)为例,正如前面提到的那样,计算机中的图片是一个数字组成的矩阵,程序先计算整个窗口中的灰度值x,然后计算矩形框中的黑色灰度值y,然后计算(x-2y)的值,得到的数值与x做比较,如果这个比值在某一个范围内,则表示待检测图片的当前扫描区域符合边界特征(a),然后继续扫描,因为是基于视频流的目标检测,我们事先不太可能知道要检测的目标的大小,这就要求我们的级联表中的分类器具有按比例增大(或者缩小)的能力。当小的窗口移动完整个待检测图片没有发现目标时,我们可以调整分类器的大小,然后继续检测,直到检测到目标或者窗口与待检测图片的大小相当为止[7]

在从CMOS摄像头中获得图片后,首先对这张图片进行前期的处理,将获取的图片从RGB模式转化为灰度图,然后进行灰度图直方均衡化操作。

基于OPENCV的人脸检测中,先进行图像的采集,然后建立自适应模型并将该模型进行训练,使用XML文件保存该训练模型数据有了这个模型后我们就可以从新使用新的模型来进行图片的对比,把当前的图片与该模型进行匹配得出的结果使用矩形进行标记,并在QT界面上画出该目标区域,并保存。

3.2 人脸检测方案

因为噪声会对视频图像产生干扰,为了提高检测精确度,经常使用的自适应加权均值滤波方法对视频图像进行去噪预处理,通过减弱噪声来提高检测精度。然后,将降噪后视频图像再进行一些优化对后面进行图片的检测、检测有很大的帮助

图3.2 系统框图

当前许多视频图像中的运动目标检测系统中大都采用滤波技术来减弱噪声

对目标的影响,在对噪声图像的预处理中,使用中值滤波法,中值滤波首先确定一个目标点,然后以该点为中心周围的像素进行排列,然后将获取的像素中间值作为该区域的所有像素的值。当目标区域中有运动物体时,可以使用中值滤波的方式对运动目标进行平滑处理 [8]

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个临域中各点值的中值代替,让周围的像素值接近的值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为gx,y=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y)g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*23*3区域,也可以是不同的的形状,如线状,方形,圆形,十字形,圆环形,菱形等例如平滑锐化滤波就含有取中值和样点计算的过程,另一种方法是先计算周边像素灰度的平均值,若所考虑像素的灰度与此平均值的差异超过一定临界值时,则判定该像素为干扰,该点的值应采用先前计算所得的平均值来替代,若不超出临界则用该点实际像素的灰度值作为滤波器的输出,此种方法更接近于人眼的实际感觉[9]

中值滤波的实质是通过一种计算方式来处理图片像素差异很大的像素点,即保留那些处于中间的像素值,然后将该像素值作为整个图像的像素。通过中值滤波可以使图像的像素处于柔和的状态,通过中值滤波的处理后,不仅可以消除图片的一些不规则噪音,也可以使图片更加清晰。采用中值滤波器对于消除脉冲噪声是有很大的作用的[10]

对背景图像的获取先通过背景差法来获取当前的像素点,然后减去前一张图片的像素点,得到的就是静止的像素点。通过获取的背景图像建立模型,将从当前的摄像头获取的图片与该模型进行比对,通过这个方式可以得到运动的物体,并进行标记。但是由于环境,光线等影响就会造成许多伪目标的出现,为了避免这种干扰,就必须建立高斯混合模型来进行对多模型的运算。混合高斯法是将每个像素按照多个高斯分布混合建模,以同时处理多种背景变化,该模型的参数可以自适应更新,不像非参数模型要缓存视频[11]

混合高斯模型是利用前景和背景进行建模,当摄像头在移动的过程中,背景像素以及前景像素都会发生改变,所以我们就需要对这两种背景进行建模,在当前的像素下与模型进行比对,但是当光线及外界条件太复杂则建模过程很复杂,就需要不断的降低模型参数来进行建模,当检测的目标太大或者移动台慢,则使用该模型检测达不到预期的效果。缺点是它对全局亮度的突然变化非常敏感,如果场景很长时间没变,则背景分量的变化就非常小,但是全局亮度的突然变化会将整个视频帧认为是前景[12]

3.3 使用技术

3.3.1 子空间

开始时人脸检测技术只能用在对单一图片进行检测,经过科学家不断的改进和发展,现在已经发展到能够动态实时的对人脸进行检测与检测。目前,一些学者提出了向三维空间的人脸检测与检测方向研发。

子空间分析的思想就是根据一定的性能目标来寻找线性或非线性的空间变换,把原始信号数据压缩到一个低维的子空间中,使数据在子空间中的分别更加紧密,为数据的更好描述提供了手段[13]。现在的人脸检测技术能够处理一些比较简单的背景图片,但是由于环境等因素的影响,人脸检测技术就要向更深层次的发展,以便能够处理那些具有复杂背景中的人脸检测,所以现在的人脸检测技术是需要不断的发展与更新。

子空间法即基于特征空间的方法,子空间法的工作原理是根据人脸区域图像变换到某一个特定的空间,通过线性计算来区分出人脸和背景,利用统计分析和线性计算来找出图片中的人脸样本和非人脸样本,综合两者之间的特征来构建分类器,再利用构建好的分类器来进行人脸的检测。子空间方法主要包括两类,主分量分析(PCA)方法和线性判别分析(LDA)方法。PCA方法根据图像的特征进行正交变化(KL变换),以消除原来各分量之间的相关性,取变换后所得到的最大的若干个特征向量来表示原来的图像,保留了原图像差异的最大信息,这若干个特征向量就称为主分量[14]

人脸检测的原理,将人脸图像投影到一个由若干个最大的特征向量构成的子空间,若要显示某个特定的人脸,通过对这些特征向量加权求和即可,则根据定义的阀值来进行判断是否为库内人员[15]

使用背景差法来对正在进行运动的物体的进行判断,通过获取前一张图片的图片数据与当前获取的图片数据进行比对,如果在当前位置的图片像素与前一帧在当前位置的图片像素一致,则说明该像素点是静止得,否则表示该物体移动了。

3.3.2 meanshift算法

meanshift算法利用概率密度的梯度爬升来寻找局部最优meanShift利用均值漂移,在聚类、图像平滑、分割、跟踪等方面应用很广泛,输入一个图像的范围,然后根据反向投影图和输入的方框进行meanshift迭代,它是向重心移动,即向反向投影图中概率大的地方移动,所以始终会移动到目标上,meanshift算法是一个变步长的梯度上升算法[16]

3.4 信息查询与维护流程图

管理员通过获取管理权限后就可以进行数据的查询和对库内人员进行更改了,主要的功能包括,增加库内人员,修改库内人员,删除库内人员。

通过系统管理员进入系统后则可以操作库内的人员,登录系统需要用户名和密码来进入系统,还可以为每个普通用户增加超级权限,库内现在进行信息的登记,采集的人员图片数目为9张图片,经过测试分析,采集9张图片能够更好的提高检测精度,增加了库内人员后,需要通过数据库对库内人员进行保存,保存的数据以二进制的形式保存。

图3.3 信息查询与维护流程图



4 系统的概要设计

本节介绍了该系统的运行流程和设计思路,详细的介绍各个模块的原理和功能,介绍各个模块功能和他们之间的联系

4.1 应用程序的总体结构设计流程图

图4.1总体结构设计流程图

4.2 图像预处理的层次图

对图像的处理主要包含以下几个步骤:

图4.2 图像预处理

4.3 各模块功能概述

4.3.1 图像获取模块

图像的获取主要通过USB摄像头或者CMOS摄像头来进行图片的获取,将获取后的图片通过一系列的转换后就可以进行建立模型

4.3.2 人脸区域获取

对图片中人脸区域的检测,主要是基于肤色来进行获取,通过非直线的肤色分割彩色变换技术来实现。非线性分段色彩变换得到的皮肤颜色模型,这种类型的色彩空间中的肤色模型的建立必须首先选择一个合适的色彩空间。

4.3.3 图像预处理模块

对图像的预处理分为几个步骤后,在获得一帧图像,经过一些处理后,将图像中的特征表现出来。预处理分为一下五个子模块:

(1)光线补偿技术

因为系统可能在不平衡的光照条件下得到的视频图片,这对我们的对特征的提取产生干扰,系统会使用YCrCb颜色空间,所以必须对图片进行图像光补偿。它的特点是,体现在图像中。YcrC同时是的颜色空间,它将用在视频系统中,在颜色空间中,Y分量表示一个像素的亮度,Cr代表的红色成分,Cb表示蓝色,通常简称为CrCb为色度[17]

(2)灰度变化技术

灰色图像处理是将彩色图像转换为黑白图像,使用更加简单、具体的方式将图片信息诠释出来,但是,这样做的弊端是会丢失图像信息。因此,尽可能地在转化的过程中,用简单的方式来显示图像的复杂信息。

(3)高斯平滑处理技术

图像将通过高斯平滑技术进行平滑处理,视频图像在采集过程中,由于各种环境因素的影响,图像经常出现不规则的噪声,比如图像在进行传输,存储都可能会产生数据丢失。从而将对图像的质量产生影响。图像经过平滑处理可以减少视觉噪声,没有明显的低频分量图像的高频部分更易于检测。通过实现卷积平滑。能够提供更好的图像卷积平滑后的水平投影,二值化。

(4)对比度增强

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

(5)二值化

原理:图像二值化也叫图像黑白化,彩色图像黑白化处理通常有三种方法:最大值法、平均值法、加权平均值法。下面详细介绍三种方法的原理:

最大值法:最大值法是每个像素点的RGB值等于原像素点的RGB值中最大的一个,即R=G=B=MAX( R,G,B )最大值发产生亮度很高的黑白图像

平均值法:平均值法使每个像素点的RGB值等于原像素点的RGB值的平均值,即R=G=B=R+G+B/3 

加权平均法:加权平均法根据需要指定每个像素点RGB的权数,并取其加权平均值,即R=G=B=(Wr*R+Wg*G+Wb*B )/3 WrWgWb表示RGB的权数,均大于零,通过取不同的权数可实现不同的效果 [19]

(6)直方图均衡

直方图均衡化的目的是使一输入图像转换为在每一灰度级上都有相同的象素点数,它的处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布,它的研究思路是:通过直方图变换式来

进行直方图的均衡处理,直方图变换式是

但是直方图均衡化存在着两个缺点:

变换后图像的灰度级减少,某些细节消失;某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。

4.3.4 人脸定位模块

对视频图像的人脸进行检测,则通过将脸部特征进行标记,人脸定位通过对眼睛、鼻尖、嘴唇进行标记来进行定位,因为眼睛是有对称性,可以很容易的检测出来,鼻子和嘴唇在人脸的下方,也很容易的进行标记出来。

图4.3 人脸检测界面

4.3.5 特征提取模块

对图片进行特征的提取,根据以下的步骤进行获取

(1)先进行标记人眼,来获取两眼的距离。

(2)通过一些算法来获取眼睛的角度。

(3)对眼睛、嘴巴和鼻子的标记。

(4)将各个特征提取出来后,通过一个矩形框来标记。

在对图片的所有特征进行标记提取后,将标记的数据及特征值进过计算处理后存入本地数据库中。

4.3.6 检测模块

CMOS采集的人脸图片进行处理后获得的新图片,将新图片与前期训练出来的数据模型进行比对,以确定最相似的特征参数,然后进一步分析这个参数。如果得到的结果在我们预设的阀值中内,那么该人的信息已采集到数据库中,然后从库中提取出该人的个人信息并显示在软件界面上,如果没有则进行报警。

4.4 人脸检测界面

4.3.7 数据库存储模块

该系统主要采用的 SQLite数据库,基于OPENCV人脸检测系统采用QT作为界面设计工具。嵌入式支持的数据库为SQLite数据库,该数据库主要使用在嵌入式环境下,所以使用SQLite作为该系统的数据存储单元。

基于QT的数据库分为以下几个内容:

(1)人员信息的录入

进入系统后则要求新增加的人员进行刷卡进行信息的登记和采集。

4.5 数据库人员信息采集界面

(2)人员信息的部门更改

将采集的人员信息需要指定一个特定的部门来管理这个人员。

4.6 增加新的部门信息

(3)人员信息的更改

管理人员可以登录进入系统后对库内存在的人员信息进行更新

4.7 更改人员信息

(4)管理人员可以查看当前库内的人员信息

管理者通过登录系统后,可以查看库内人员的所有信息。

4.8 查看人员信息

4.3.8人脸采集注意事项

(1) 人脸距摄像头距离80-120公分,可适当前后移动调整位置

(2) 头发不遮眼眉;不戴墨镜;不带口罩;不做鬼脸;不闭眼。

(3) 进行人脸的采集时,平视前方,并且轻微抬头与低头,稍微左右转头。

错误的采集方法:

图4.3 人脸错误的姿势

正确的采集方式:

图4.4 人脸正确的姿势



5 统的详细设计

本章主要对视频图像采集及处理这一模块进行详细说明,对其子模块所用到的函数和实现方式进行详细描述

5.1 系统的运行流程图

5.1 系统的运行流程图

5.2 图像处理详细设计

5.2.1 人脸检测详细设计

人脸检测的流程为,从摄像头采集图片后对图片进行灰度化处理。分配PCA存储空间,再使用级联分类检测器对图片进行特征提取训练。提取出采集的人脸图片的特征,保存数据到flash中为facedata.xml文件。

使用的主要函数为:

5.1 检测流程函数集

learn()

程序训练入口

recognize()

从摄像头采集一帧图片

recFromFrame(IplImage *faceImage)

将图片进行灰度化处理

average(vector personConfi)

计算该图片的平均值

unloadTrainingdata()

释放内存空间

storeEigenfaceImages()

保存为矢量图

doPCA()

分配PCA空间

storeTrainingData()

储存图片数据

loadTrainingData(CvMat ** pTrainPersonNumMat)

下载图片数据

findNearestNeighbor(float * projectedTestFace)

找出临近的相似度

loadFaceImg(const char * filename)

下载位图数据

(1)得到一个32位的浮动图像

IplImage* convertFloatImageToUcharImage(const IplImage *srcImg)

{

IplImage *dstImg = 0;

if ((srcImg) && (srcImg->width > 0 && srcImg->height > 0))

{

double minVal, maxVal;

cvMinMaxLoc(srcImg, &minVal, &maxVal);

if (cvIsNaN(minVal) || minVal < -1e30)

minVal = -1e30;

if (cvIsNaN(maxVal) || maxVal > 1e30)

maxVal = 1e30;

if (maxVal-minVal == 0.0f)

maxVal = minVal + 0.001;

dstImg = cvCreateImage(cvSize(srcImg->width, srcImg->height), 8, 1);

cvConvertScale(srcImg, dstImg, 255.0 / (maxVal - minVal), - minVal * 255.0 / (maxVal-minVal));

}

return dstImg;

}

(2) 保存源图片的所有特征向量

void FaceRec::storeEigenfaceImages()

{

if (nEigens > 0)

{

int COLUMNS = 8; // Put upto 8 images on a row.

int nCols = min(nEigens, COLUMNS);

int nRows= 1 + (nEigens / COLUMNS);// Put the rest on new rows.

int w = eigenVectArr[0]->width;

int h = eigenVectArr[0]->height;

CvSize size;

size = cvSize(nCols * w, nRows * h);

IplImage *bigImg = cvCreateImage(size, IPL_DEPTH_8U, 1);

for (int i=0; i

{

IplImage*byteImg=

convertFloatImageToUcharImage(eigenVectArr[i]);

int x = w * (i % COLUMNS);

int y = h * (i / COLUMNS);

CvRect ROI = cvRect(x, y, w, h);

cvSetImageROI(bigImg, ROI);

cvCopyImage(byteImg, bigImg);

cvResetImageROI(bigImg);

cvReleaseImage(&byteImg);

}

cvSaveImage("out_eigenfaces.bmp", bigImg);

cvReleaseImage(&bigImg);

}

}

(3) 下载需要训练的数据,并将训练好的数据保存到xml文件中

void FaceRec::learn()

{

int i, offset;

char *szFileTrain;

szFileTrain = "40.txt"; //训练数据的路径

nTrainFaces = loadFaceImg(szFileTrain);

fprintf(stderr,"Got %d training images.\n", nTrainFaces);

if( nTrainFaces < 2 )

{

fprintf(stderr,

"Need 2 or more training faces\n"

"Input file contains only %d\n", nTrainFaces);

return;

}

doPCA(); //为人脸训练分配PCA空间

projectedTrainFaceMat = cvCreatempat( nTrainFaces, nEigens, CV_32FC1 );

offset = projectedTrainFaceMat->step / sizeof(float);

for(i=0; i

{

//int offset = i * nEigens;

cvEigenDecomposite(

faceImgArr[i],

nEigens,

eigenVectArr,

0, 0,

pAvgTrainImg,

projectedTrainFaceMat->data.fl + i*offset);

}

storeTrainingData(); //将训练好的数据保存到xml文件中

if (SAVE_EIGENFACE_IMAGES)

{

storeEigenfaceImages(); //保存这些训练图片为一张位图

}

}

(4) 从摄像头中获取一帧图片

int FaceRec::recFromFrame(IplImage *faceImage)

{

const char *answer;

QFileInfo facedata("facedata.xml");

if (facedata.exists() && trainPersonNumMat == 0 && projectedTestFace == 0 ){

loadTrainingData( &trainPersonNumMat ) ;

projectedTestFace = (float *)cvAlloc( nEigens*sizeof(float) );

}

cvEigenDecomposite(

faceImage,

nEigens,

eigenVectArr,

0, 0,

pAvgTrainImg,

projectedTestFace);

int iNearest,nearest;

iNearest = findNearestNeighbor(projectedTestFace);

if(10 == iNearest)

{

//fprintf(stderr,"this is ten!\n");

return 10;

}

else{

nearest = trainPersonNumMat->data.i[iNearest];

}

return nearest;

}

(5) facedata.xml下载训练好的数据

int FaceRec::loadTrainingData(CvMat ** pTrainPersonNumMat)

{

CvFileStorage * fileStorage;

int i;

fileStorage = cvOpenFileStorage( "facedata.xml", 0, CV_STORAGE_READ );

if( !fileStorage )

{

fprintf(stderr, "Can't open facedata.xml\n");

return 0;

}

personNames.clear();

nPersons = cvReadIntByName(fileStorage,0,"nPersons",0);

if (nPersons == 0)

{

printf("No people found in the training database 'facedata.xml'.\n");

return 0;

}

for (i=0; i

{

string sPersonName;

char varname[200];

sprintf(varname,"personName_%d",(i+1));

sPersonName = cvReadStringByName(fileStorage,0,varname);

personNames.push_back(sPersonName);

}

nEigens = cvReadIntByName(fileStorage, 0, "nEigens", 0);

nTrainFaces = cvReadIntByName(fileStorage, 0, "nTrainFaces", 0);

*pTrainPersonNumMat = (CvMat *)cvReadByName(fileStorage, 0, "trainPersonNumMat", 0);

eigenValMat = (CvMat *)cvReadByName(fileStorage, 0, "eigenValMat", 0);

projectedTrainFaceMat = (CvMat *)cvReadByName(fileStorage, 0, "projectedTrainFaceMat", 0);

pAvgTrainImg = (IplImage *)cvReadByName(fileStorage, 0, "avgTrainImg", 0);

eigenVectArr = (IplImage **)cvAlloc(nTrainFaces*sizeof(IplImage *));

for(i=0; i

{

char varname[200];

sprintf( varname, "eigenVect_%d", i );

eigenVectArr[i] = (IplImage *)cvReadByName(fileStorage, 0, varname, 0);

}

cvReleaseFileStorage( &fileStorage );

return 1;

}

(6) 为图片分配PCA空间

void FaceRec::doPCA()

{

int i;

CvTermCriteria calcLimit;

CvSize faceImgSize;

nEigens = nTrainFaces-1; // set the number of eigenvalues to use

faceImgSize.width = faceImgArr[0]->width;

faceImgSize.height = faceImgArr[0]->height;

eigenVectArr = (IplImage**)cvAlloc(sizeof(IplImage*) * nEigens);

for(i=0; i

eigenVectArr[i] = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1);

eigenValMat = cvCreatempat( 1, nEigens, CV_32FC1 );

pAvgTrainImg = cvCreateImage(faceImgSize, IPL_DEPTH_32F, 1);

calcLimit = cvTermCriteria( CV_TERMCRIT_ITER, nEigens, 1);

cvCalcEigenObjects(

nTrainFaces,

(void*)faceImgArr,

(void*)eigenVectArr,

CV_EIGOBJ_NO_CALLBACK,

0,

0,

&calcLimit,

pAvgTrainImg,

eigenValMat->data.fl);

cvNormalize(eigenValMat, eigenValMat, 1, 0, CV_L1, 0);

}

5.2.2 图像点处理详细设计

在图像的处理中点运算是一个非常重要的技术,点运算允许用户改变图像数据所占用的灰度范围,从摄像头采集到的图像经过点运算后可以得到一副新的图像,根据输入图像像素点的灰度值可以决定输出图像像素点的灰度值,然而,点操作不能改变视频图像内的空间结构[20]

通过用户自己设定的方式使用点运算来改变一副图片的灰度值,灰度值的改变可以根据某种灰度变换函数来进行变换。点运算的基本原理是“从原来的像素到新的像素”的拷贝操作。如果输入图像为Kxy),输出图像为Zxy),则点运算可表示为:

Zxy = f [ Kxy] 式(5.1

其中函数fD)为灰度转换函数,该函数反应了输入灰度值与出灰度值的联系。当fD)确定下来后则该点运算也就被定下来了

点运算有时又称为对比度增强、对比度拉伸或灰度变换,它是图像数字化软件和图像显示软件的重要组成部分[21]

5.2.3 光线补偿

从摄像头对图像进行采集过程中采集的图片会受到设备的干扰及环境因素的影响从而会使图像的色彩向某个固定的方向移动,比如说图像的色彩偏黄、变蓝、变黑等。为了抵消这种整个图像中存在着的色彩偏差,使用检测图像中亮度在前5%的像素(参考白),按一定公式计算出调整值,则对图像的RGB三个分量进行线性调整,如果整张图片较暗,前5%平均灰度值会比255较小,调整值较大,把整个图片的颜色调亮。整幅图像的其他像素点的色彩值也都按这一调整尺度进行交换,通过这种技术可以更好的进行图像的处理和后期的检测[22]

5.2.4具体实现光线补偿功能

通过上面的讲解知道了光线补偿这功能的算法与设计思想,下面通过编程来实现其算法,具体过程如下:

QT下通过增加菜单栏,在其顶部添加一子目录,将命名为“预处理”,并在其下方的属性栏中命名为“弹出”菜单,右击预处理则该选项会自动生成一个子菜单项,属性名为“光线补偿”,并在右下面的属性中把ID号设置ID_READY_LIGHTERGTHNSATE,对应文件FaceDetect.Cpp中的函数recognize()实现,并在recFromFrame(IplImage *faceImage)中添加如下代码:

hDIBTempp = gDib.CopyHandle(hDIB);

gDib.LightingComper(hDIB);

GlobalUnlock(hDIB);

Invalidate();

光线补偿通过函数实现,通过对图像的RGB进行转换而使图片的光线变亮或变暗。函数LightingComper()是类facerecognize的一个目标函数。其核心代码如下所述:

//下面通过该算法来实现光线补偿技术

for(i =0;i

for(int j=0;j

{

//获取像素偏移

lOffset = this->PixelOffset(i,j,wBytesPerLine);

//得到蓝色分量

*(lpData+lOffset) = colorb;

//绿色分量

colorb = *(lpData+lOffset+1);

colorb *=co;

if(colorb >255)

colorb = 255;

*(lpData+lOffset+1) = colorb;

colorb = *(lpData+lOffset+2);

colorb *=co;

if(colorb >255)

colorb = 255;

*(lpData+lOffset+2) = colorb;

}

5.3 图像灰度化

5.3.1 图像灰度化的算法思想

(1) 将彩色图片转换成灰度图像

彩色图像通过式(5.2)转化成灰度图像:

blue0.39×R0.50×G0.11×B 式(5.2

该公式中,blue为灰度值,RBG分别代表红色分量值、蓝色分量值、绿色分量值。

(2) 灰度比例的变换

灰度比例变换的实质是把图片原像素的灰度值乘以一个预设的值使得最后获得的值在[0,255]这个范围之内

(3) 灰度线性的变换

由于受到光线的影响,会造成图像在成像时曝光不足,从而使图像在显示的时候颜色差异太大这就会使图像的结构模糊不清。所以将图像灰度进行线性变换,就能够改变图片的内部结构。灰度线性变换的公式为:

f,其他

5.3中,f是原图片像素的灰度值,g为变换后的灰度值。该变换把属于[a,b]的灰度级变换至灰度区间[c,d],而没有在[a,b]区间的原像素灰度将保持不变。这里abcdfg均为[0,255]之间的整数值。可见,a被映射为cb被映射为d

(4)灰度线性截断

在对灰度线性进行判断前,需要预设一个特定的值a,如果f的值小于这个a值,则将该像素的灰度等级经过运算从新设为cf大于这个a则该像素的灰度等级进过运算设为d

5.3.2 图像灰度化的编程实现

具体实现灰度化功能

获取蓝色分量

ColorB=*(lpData + lOffset);

获取绿色分量

ColorG=*(lpData + lOffset+1);

获取红色分量

ColorR=*(lpData + lOffset+2);

计算灰度值

gray = (ColorG*50+ColorR*39+ColorB*11)/100;

显示灰度图像

*(lpData + lOffset)=gray ;

*(lpData + lOffset+1)=gray ;

*(lpData + lOffset+2)=gray ;

其中lpData是图片数据区域,lOffset是像素的偏移,gray 是图像变化前的灰度值。

5.4 高斯平滑

5.4.1 算法思想

引进高斯平滑,首先介绍模板操作。经常被用来作为模板操作的算法有:数字图像处理算法,图像平滑处理技术,图像锐化和细化,一击图像的边缘检测操作。例如:平滑算法是将原始图像像素的灰度值和其相邻的8个像素的灰度值进行求和,然后为新的图像的像素的灰度值。

1 1 1

1 1 1

1 1 1

1 1 1

在图像采集过程中,由于各种因素对图像的影响,往往会产生一些不规则的随机噪声,比如在数据传输,储存时发生的数据丢失和损坏等,这将影响图像质量。通过平滑化处理图片可以降低噪音得到除噪图片,同时除去除图像的高频部分,因为原始低频部门很容易被检测。噪声在整个图片数据分布中是一些孤立的点,噪声点像素的灰度值与其相邻像素值有明显的差异,灰度变化总在这附近的高频突变点。用于平滑卷积核被称为一个低通滤波器,低通滤波器具有以下特点:1行的卷积核的列数的数量,通常是3×3的矩阵;2个卷积系数的中心点对称分布中心;3个卷积系数是为正;4是远离中心的卷积系数的值较小或保持不变;卷积的结果不改变图像的亮度。随后的水平投影卷积平滑,提供了更好的图像二值化。水平投影的曲线是平滑的,二值化图像的孤立点较少[23]

以下是几个常用的卷积核:

1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16

1/9 1/9 1/9 1/10 1/5 1/10 2/16 4/16 2/16

1/9 1/9 1/9 1/10 1/10 1/10 1/16 2/16 1/16

L P1 LP2 LP3

通常的处理方法:周围8个点的中心点的像素值乘以各自的矩阵相应的系数后相加后得到一个值,将这个值与中心点的系数相乘得到的新值作为中心点的系数。一般来说,不同的噪声具有不同的卷积算法。本系统才用的是一个高斯卷积核卷积算法,这是上述的卷积核LP3。高斯卷积得到的是经过抽样的二维高斯函数。高斯平滑算法的优点是平滑后图像的失真少,能够去除噪声的干扰[24]

5.4.2 具体实现高斯平滑功能

上面讲解了高斯平滑原理,下面可进行编码将其实现:

编辑菜单IDR_MAINFRAM,在菜单“预处理”中添加一子菜单项,命名为“高斯平滑”并将其ID设为ID_READY_Mteplate

在类CFaceDetectView中添加“高斯平滑”菜单项的事件处理程序,其代码如下:

//进行模板操作

Mteplate(temp ,3,3, maxs);

Invalidate(TRUE);

其中temp是模板参数,maxs是模板系数;Mteplate()函数

实现高斯平滑的主要函数,其核心代码是:

for(m=i-((temp_h-1)/2);m<=i+((temp_h-1)/2);m++)

{

for(n=j-((temp_w-1)/2);n<=j+((temp_w-1)/2);n++)

smin+=Gray[m][n]* temp[(m-i+((temp_h-1)/2))*

temp_w+n-j+((temp_w-1)/2)];

}

//maxs乘上预设的值

smin=(int)smin*maxs;

//计算绝对值

smin = fabs(smin); //计算其绝对值

//如果小于0,强制赋值为0

if(smin<0)

smin=0;

//如果大于255,强制赋值为255

if(smin>255)

smin=255;

Height[i][j]=smin

5.5 灰度均衡

5.5.1 算法思想

灰度均衡也称直方图均衡,为了使图片在每一个灰度级上有相同的像素点数的输出,就必须使用点运算输入转换,这样转换的结果是使图像进行灰度化,这对于在进行图像比较或分割之前将图像转化为一级的格式是十分有效的。

按照图像的概率密度函数(PDF,归一化带单位面积的直方图)的定义:

Px = * Hx 式(5.5

其中Hx)为直方图,A0为图像的面积,设转换前图像的概率密度函数为

Prr),转换后图像的概率密度函数为PsS),转换函数为s = fr),由概率论知识,我们可以得到:

PsS = Prr* 式(5.6

这样,转换后我们需要使概率密度函数变为1

Prr= 式(5.7

等式两边积分,得:

S = fr= 0 rP2udu =0 r Hudu 式(5.8

该转换式被称为图像的累积分布函数

上面的式是通过使用归一化来判断没有经过归一化的情况,只要求以最大的灰度值即可,灰度均衡的转换式为:

DB = f DA= Hudu 式(5.9

对于离散图像转换式为:

DB = fDA= 式(5.10

式中Hi为第i级灰度的像素个数。

5.5.2 编程实现

在对图像进行灰度均衡操作时,不需要改变DIB的调色板位置和文件夹的打开方式,但是需要把DIB像素起始位置的指针和DIB高度、宽度等信息传递给需要调用的子函数就可以完成灰度均衡转换工作,其核心代码如下:

*(lpData + lOffset)=state ; //显示灰度均衡

*(lpData + lOffset+1)=state ;

*(lpData + lOffset+2)=state ;

5.6 图像对比度增强

5.6.1 算法思想

均衡直方图的图像处理也可以增强图像的对比度,并进一步拉大对比度。通过对图像灰度值的统计,小于最小设定值被认为是相关的信息,它被当作一个黑色来处理,如果大于的最大设定值,则认为这是无用的信息并被删除,若处在两者之间,且对比度增强,将他们在总的灰度值里面的比例作为新的像素信息保存起来。

5.6.2 编程实现

(1) QT界面的顶端的编辑菜单IDR_MAINFRAM,在菜单“预处理”中添加一个子菜单项,命名为“图像对比度增强功能”,并将其ID值设置为ID_READY_ContrastEnhance.

(2) CFaceDetectView中添加程序。

其代码如下:

lOffset = gDib.PixelOffset(i, j, gwBytesPerLine);

获取图像灰度增强函数

int state=IncreaseContrast(ZFT[k][k1], 100);

显示灰度增强后的图像

*(lpData + lOffset ) = state ;

*(lpData + lOffset+1) = state ;

*(lpData + lOffset+2) = state ;

其中IncreaseContras()函数是实现图像对比度增强的关键函数,该根据参数n来调节对比度,n越大,对比越强烈,其核心是:

如果数据很小,设置为0

if(pByte<=Low) return 0;

获得中间数据,并进行对比增强处理

else if ((Low

return int(((pByte-Low)/Grad));

如果数据很大,设置为255

Else return 255;

5.7 编程时遇到的问题及解决方法

5.7.1 光线补偿

因为需要改变每一个像素的亮度值,起初,我通过对视频图像使用一个预设的值进行验证,得到的效果比较不错,但是当对多个图片进行处理时,该预设值则与理想的效果相差太大,最终只有采用离散概率的方法最后得到了预期的效果

5.7.2 高斯平滑

高斯平滑技术主要用于消除图片的噪音,该技术使用了模板来进行操作,因此模板参数的选择是很重要的。高斯平滑得到的效果图的好坏取决与模板的参数选择。在编程设计的时候,进行参数的预设,然后进行比较,得出那组参数可以达到比较好的效果。预设的模板参数为:

第一组数据

1/9 1/9 1/9

1/9 1/9 1/9

1/9 1/9 1/9

得到的效果不理想。

第二组数据

1/10 1/10 1/10

1/10 1/5 1/10

1/10 1/10 1/10

得到的效果没有达到预期的目的。

第三组数据

1/16 2/16 1/16

2/16 4/16 2/16

1/16 2/16 1/16

达到了比较理想的效果。

5.7.3 均衡直方图

开始时,图像的灰度回一直都处于很零散的状态,并且图像的特征模糊,原来采用高斯平滑技术对图像进行处理,然后进行灰度转换,但图像效果没有达到预期所想。最终采用均衡直方图的方法,使图像处理的效果处于比较理想的状态。

6 统调试

系统测试是为了增加系统的稳定性和调试程序中的BUG,通过对该系统进行测试后找出了系统中存在的问题,最后改进了人脸检测算法及模块之间的联系。使得整个系统的稳定性有了提高,增加了检测率,提高了视频帧的采集及处理速度,界面设计清晰美观。

6.1 测试原则

(1)根据前期写的功能需求进行整个系统的测试

(2)需要清晰明了的书写测试文档和测试结果。

(3)程序员需要根据测试文档对自己的系统进行改进和说明。

(4)在进行对整个系统进行综合的测试时,应当提出合理的测试条件和合理的输入条件,支出该系统需要改进的功能等。

(5)测试员要避免在程序的测试中出现的群集现象,测试后程序中出现的错误数目与该程序中以发现的错误数量成正比,应该对该系统容易出现的问题进行反复的测试及验证。

(6)严格的根据测试要求来进行测试,排除测试中的随意性,测试要求应该包括:该系统的功能,输入和输出,测试内容,界面的可控性,系统的稳定性等方面。

(7)在测试完系统后需要对每一个测试报告进行全面的检测与核对。

(8)对测试报告及测试计划进行归档保管,测试具有出错统计和最终的分析报告,这样为了改进系统,维护系统等方面有了很大的帮助性。

6.2 测试方案

基于OPENCV的人脸检测与检测系统主要由视频图像的采集、人脸的定位、特征的提取、人脸检测四个部分组成,视频图像的采集及处理对以后的检测阶段有很大的影响,因此在进行该系统的开发时我就对该系统进行了整体的安排和测试,对图像采集及处理模块上进行整体的检测及改进。

图像采集及处理模块主要分为五个步骤:对图像进行光线的补偿、图像灰色变换、均衡直方图的建立、图像的对比度增强、图像的二值化处理。对该模块进行测试的方法是:在摄像头上采取图像来进行逐一的测试,通过在前期编写的测试方案来进行测试,通过这个测试可以判断是否该系统达到了预期的目标,主要测试的内容包括系统的稳定性,系统在不同的工作环境下能够进行长时间的工作,通过光线补偿技术是否能够从摄像头采集的图片经过处理后图片的亮度增强;测试图像灰度化模块图像是否会进行灰色的变换;测试高斯平滑技术能够进行模板的操作,通过对高斯平滑技术的测试可以得到模板参数;对图片进行平滑的操作可以增加检测率,测试图片对比度增强技术,看图像是否能够将特征进行明显的显示出来。

经过测试之后得到如下结论:系统能够进行长时间的工作,不会造成内存的泄露;系统能够工作在背景不是很是复杂的环境下;使用光线补偿技术可以将图像的像素亮度增强,并且图片中的曝光率能够达到预期的平衡效果;使用图像灰度化技术可以将图片由彩色转变为灰色;使用高斯高斯平滑技术能有效的消除图像噪音,提高了图像质量;而增强图像对比度模块能够较好的把图像特征表现出来。

6.3 测试文档

6.1 人脸检测测试文档

产品名称/版本号

基于opencv人脸检测系统

V1.0.0

序号

测试项目

项目要求

测试结果

一、安装于卸载

1

系统安装

根据用户文档进行安装

通过

2

系统卸载

系统应能正常,全部卸载

通过

二、功能(测试该软件的所有功能)

1

人员采集

正常采集人员信息

通过

2

人员检测

能正常的检测库内人员

通过

3

人员信息管理

队库内人员进行修改

通过

4

工作时限

是否长时间工作正常

通过

三、用户界面

1

界面打开

在基于QT的界面上进行打开串口,并读取串口数据

通过

2

界面关闭

在基于QT的界面上关闭串口,并退出QT界面程序

通过

3

界面文字

界面文字应无乱字符

通过

四、中文符合性

1

界面中文符合性

软件界面宜使用同一的规范简体中文

通过

2

软件提示符合性

软件提示符合基本使用同一规范的简体中文

通过

3

字库中文符合性

软件自带的中文库符合GB2312的要求,且能正确安装

通过

五、用户文档

1

安装使用条件

文档包含该软件必须的信息和所有限制,如软件的硬件要求

通过

2

功能描述的完整性

文档总包含软件的所有功能以及最终用户可以调用的所有功能,说明可靠性及操作。

通过

3

正确性

文档应该根据实际需求来进行编写

通过

4

一致性

文档中各种操作具有独立性,不能进行各种相反的操作

通过

5

操作

文档提供了简单地操作方法,使使用者能在短时间内操作

通过

6

可操作性

根据使用文档来操作该软件

通过

六、软件产品类别

1

软件类别

通过GPIO来进行程序的调试

嵌入式产品

七、人员数量测试

编号

人员数量

十次测试中误报人数

所占百分比

1

5

6

%60

2

6

5

%50

3

7

5

%50

4

8

3

%30

5

9

2

%20

6

10

2

%20

7

12

2

%20

8

15

1

%10





7 结束语

7.1 应用程序的特点

1、人脸检测与检测应用程序采用Linux作为开发工具,利用QT作为图形界面开发,并采用面向对象的方法,用C++C语言编写程序。

2、应用程序采用封装的思想,把各个模块独立的封装出来,提高了代码的耦合性,该系统程序的设计具有代码简洁。程序运行效率高等特点。

3、使用面向对象的思想来编写图像处理模块并把该模块的各个功能进行独立出来,建立各个独立的类,从而减少了程序之间的耦合性,增加了代码的可重用性和可移植性,提高了系统处理速度。从而增加了本系统的运行效率。

4、对于本系统的扩展,在该系统中建立了多层次类结构是可以修改和维护的。所有的类都是相互独立的,可以向其中添加新方法以满足新功能,而不会破坏系统的原有功能。

5、使用QT来编写操作界面,提示信息清晰明了,用户操作简便。采用菜单、对话框等方式来选择不同的设计方法

7.2 心得体会

在这半年的程序编写及设计中遇到了很多的问题和考验。我在老师的指导及教诲下,用于尝试新的方法,使用新的思想来解决了很多的难题和困惑。虽然本次毕业设计还存在一些小问题,但是,我相信在我以后的不断学习及努力下,会把这个系统做的更好,在这次设计中我有了不小的收获。在这次的毕业论文中,我主要从算法以及功能上进行论述,是读者能更清晰的明白和了解这个系统的使用方法和研发方向。

经过半年月的毕业设计,对我的学习及思维有很大的影响,对此我体会颇多:

1在程序的编写中,需要编写需求分析,考虑各种在系统的设计中遇到的问题在设计时,应该把各个模块需要做成什么接口,使用什么方式来进行封装进行仔细的考虑与分析。这就需要我们对该系统的整体功能性能做充分的考虑。千万不要认为分析工作可有可无,分析做得好,实现起来时就相当轻松。就像设计数据库系统,建表工作是最重要的一样。一旦我们将前面的工作做好后,我们就按照之前的计划有条不紊的做下去最后我们还需要和指导老师及时沟通在最短的时间内解决发现的问题。

2、熟练掌握软件开发工具,如Linux下的QTOPENCV库、交叉编译工具等。这个需要在实际的运用过程中掌握,要养成动手操作的能力不能只是看书本知识而不知道怎样去运用它。经过这次设计,让我清楚的感觉到各种工具的学习是要边看书边动手才能学得快、记得牢。

3、要养成经常与其他人交流的习惯,在交流过程中能获得许多有用的信息。在自己动手操作的过程中要学会拿来和其他人讨论分享,因为这样别人别人可以与你共同的学习与探讨。

通过这次设计,一方面让我更进一步的熟悉和掌握了C++/C语言的基本语法以及更深入的了解了各种算法算法和QT开发工具的使用。通过对该项目的设计及编写,我按计划完成了我的论文并学会了很多知识。



参考文献

[1]山世光.面部特征检测与检测的研究与实现M.哈尔滨:哈尔滨工业大学,高等教育出版社,1999年7月

[2]蒋遂平.人脸检测技术及应用简介 [M].北京:清华大学,中国计算机世界出版社,2003年12月

[3]徐慧.visual c++ 数字图像实用工程案例精选 [J].北京:北京大学 人民邮电出版社,2004年3月

[4]徐慧.visual c++ 数字图像模式检测技术及工程实践 [M].北京 华北科技大学:人民邮电出版社 2006年8月

[5]胡迎春等.人脸图像特征点眼睛的定位与提取 [M].柳州:广西工学院学报,人民邮电出版社,2003年3月

[6]周长发.精通visual c++图像处理编程 [M].北京:电子工业出版社,2004年10月

[7]张宏林. visual c++ 数字图像模式检测技术及工程实践 [J].北京:人民邮电出版社,2006.8

[8]何斌等. visual c++ 数字图像处理 [M].北京:北京科技大学 ,人民邮电出版社,2001年4月

[9]黄维通,姚瑞霞.Vc++6.0程序设计教程. 北京:机械工业出版社,2003年4月

[10]马安鹏.Vc++ 6.0程序设计导学 [M].北京:清华大学出版社,2003年6月

[11]张威等.Vc++程序设计技巧与实例 [J].北京:中国铁道出版社,2003年3月

[12]王丽娟基于OpenCV与混合高斯建模的运动目标检测 J].电子测试,2009,(第9期):86~90

[13]于成忠,朱 骏,袁晓辉基于背景差法的运动目标检测 J].东南大学学报(自然科学版)2005,第35 增刊(II)159~161

[14]蔡瑞奎C#实现运动物体的检测方法J].自动化与信息工程,2008,第1期:8~11

[15]皮文凯,刘 宏,查红彬基于自适应背景模型的全方位视觉人体运动检测J].北京大学学报(自然科学版),第40卷(第3期):458~464

[16]布拉德斯基,克勒著,于仕琪,刘瑞祯译.学习OpenCV[M].清华大学出版社 20022

[17]Grant Palmer等著,薛莹等译Beginning C# 2008 Objects 中文版[M].北京 20086

[18]马国峰,杨俊红,周兵基于YUV颜色空间的视频运动检测J].计算机工程与设计,2008,第29卷(第14期):3700~3708

[19]张凯视频运动检测算法的研究和分析J].辽宁工学院学报:清华大学出版社,20072

[20]张怡图像跟踪器综合调试系统研究 [D]南京:南京理工大学,哈尔滨出版社,2008.6

[21]李健运动目标图像的获取、传输与跟踪 [D]南京:南京理工大学,20085

[22]田峥,徐成,杨志邦,冯堃智能监控系统中的运动目标检测算法 J].计算机工程,2011,第37卷(第4期):1~4

[23]高守传 姚领田 等编著 Visual C++ 数字图片处理与工程应用篇 中国铁道出版社

M].计算机工程,2011,第37

[24]孙天泽、袁文菊、张海峰.嵌入式设计及Linux驱动开发指南——基于ARM 9处理器 J电子工业出版社.2005.2

[25]田泽主.嵌入式系统开发与应用[M].北京,北京航空航天大学出版社 2005.1

经过将近一年的学习及设计,我按质按量的完成了我的毕业课题设计,在这次设计中我得到了我的指导老师-陈老师的大力支持和帮助,陈老师提供了许多对我的毕业设计有价值的建议及资料,对我在毕业设计过程中遇到的问题提供了大力的支持和解答,及时、认真、负责的指导我完成毕业设计,对我的毕业设计提出了许多宝贵的建议及意见,指导了我的设计思路,提供了许多有用的资料,另外,与同学的学习交流,也使我受益匪浅,他们给予了我很大的帮助,在这里我表示衷心的感谢!

感谢答辩组对本次毕业设计的检查与考核,希望他们在这次的毕业答辩中给予我建议,他们给我的鼓励是我前进的动力,你们的意见及建议我将牢记在心,在今后的工作及学习中,我将要扬长避短,更加细心努力的学习专业知识,在工作中严格要求自己。

感谢我的朋友及家人对我的大力支持,在设计设计工程中对我的督促、鼓励和指导。

在本次毕业设计中,我巩固了以前的知识,深入的学习了C/C++语言,学会了系统开发的流程,懂得了软件设计的理念及测试,运用了新的知识和方法来完成我的设计,在老师朋友们的帮助下,圆满的完成了毕业设计,在此,我一一表示感谢。



毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得 及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作 者 签 名:       日  期:       

指导教师签名:        日  期:       

使用授权说明

本人完全了解 大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:        日  期:       



学位论文原创性声明

本人郑重声明:所呈交的论文是本人在导师的指导下独立进行研究所取得的研究成果。除了文中特别加以标注引用的内容外,本论文不包含任何其他个人或集体已经发表或撰写的成果作品。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本人完全意识到本声明的法律后果由本人承担。

作者签名: 日期: 年 月 日

学位论文版权使用授权书

本学位论文作者完全了解学校有关保留、使用学位论文的规定,同意学校保留并向国家有关部门或机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权      大学可以将本学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本学位论文。

涉密论文按学校规定处理。

作者签名: 日期: 年 月 日

导师签名: 日期: 年 月 日



指导教师评阅书

指导教师评价:

一、撰写(设计)过程

1、学生在论文(设计)过程中的治学态度、工作精神

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、学生掌握专业知识、技能的扎实程度

□ 优 □ 良 □ 中 □ 及格 □ 不及格

3、学生综合运用所学知识和专业技能分析和解决问题的能力

□ 优 □ 良 □ 中 □ 及格 □ 不及格

4、研究方法的科学性;技术线路的可行性;设计方案的合理性

□ 优 □ 良 □ 中 □ 及格 □ 不及格

5、完成毕业论文(设计)期间的出勤情况

□ 优 □ 良 □ 中 □ 及格 □ 不及格

二、论文(设计)质量

1、论文(设计)的整体结构是否符合撰写规范?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、是否完成指定的论文(设计)任务(包括装订及附件)?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

三、论文(设计)水平

1、论文(设计)的理论意义或对解决实际问题的指导意义

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、论文的观念是否有新意?设计是否有创意?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

3、论文(设计说明书)所体现的整体水平

□ 优 □ 良 □ 中 □ 及格 □ 不及格

建议成绩:及格 不及格

(在所选等级前的□内画“√”)

指导教师: (签名) 单位: (盖章)

年 月 日



评阅教师评阅书

评阅教师评价:

一、论文(设计)质量

1、论文(设计)的整体结构是否符合撰写规范?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、是否完成指定的论文(设计)任务(包括装订及附件)?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

二、论文(设计)水平

1、论文(设计)的理论意义或对解决实际问题的指导意义

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、论文的观念是否有新意?设计是否有创意?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

3、论文(设计说明书)所体现的整体水平

□ 优 □ 良 □ 中 □ 及格 □ 不及格

建议成绩:及格 不及格

(在所选等级前的□内画“√”)

评阅教师: (签名) 单位: (盖章)

年 月 日



教研室(或答辩小组)及教学系意见

教研室(或答辩小组)评价:

一、答辩过程

1、毕业论文(设计)的基本要点和见解的叙述情况

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、对答辩问题的反应、理解、表达情况

□ 优 □ 良 □ 中 □ 及格 □ 不及格

3、学生答辩过程中的精神状态

□ 优 □ 良 □ 中 □ 及格 □ 不及格

二、论文(设计)质量

1、论文(设计)的整体结构是否符合撰写规范?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、是否完成指定的论文(设计)任务(包括装订及附件)?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

三、论文(设计)水平

1、论文(设计)的理论意义或对解决实际问题的指导意义

□ 优 □ 良 □ 中 □ 及格 □ 不及格

2、论文的观念是否有新意?设计是否有创意?

□ 优 □ 良 □ 中 □ 及格 □ 不及格

3、论文(设计说明书)所体现的整体水平

□ 优 □ 良 □ 中 □ 及格 □ 不及格

评定成绩:及格 不及格

(在所选等级前的□内画“√”)

教研室主任(或答辩小组组长): (签名)

年 月 日

教学系意见:

系主任: (签名)

年 月 日



学位论文原创性声明

本人郑重声明:所呈交的学位论文,是本人在导师的指导下进行的研究工作所取得的成果。尽我所知,除文中已经特别注明引用的内容和致谢的地方外,本论文不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究做出重要贡献的个人和集体,均已在文中以明确方式注明并表示感谢。本人完全意识到本声明的法律结果由本人承担。

学位论文作者(本人签名): 年 月 日

学位论文出版授权书

人及导师完全同意《中国博士学位论文全文数据库出版章程》、《中国优秀硕士学位论文全文数据库出版章程》(以下简称“章程”),愿意将本人的学位论文提交“中国学术期刊(光盘版)电子杂志社”在《中国博士学位论文全文数据库》、《中国优秀硕士学位论文全文数据库》中全文发表和以电子、网络形式公开出版,并同意编入CNKI《中国知识资源总库》,在《中国博硕士学位论文评价数据库》中使用和在互联网上传播,同意按“章程”规定享受相关权益。

论文密级:

公开保密_____月至____月)(保密的学位论文在解密后应遵守此协议)

作者签名:_______ 导师签名:_______

_________________ _________________



本人郑重声明:所呈交的毕业设计(论文),是本人在指导老师的指导下,独立进行研究工作所取得的成果,成果不存在知识产权争议。尽我所知,除文中已经注明引用的内容外,本设计(论文)不含任何其他个人或集体已经发表或撰写过的作品成果。对本文的研究做出重要贡献的个人和集体均已在文中以明确方式标明。

本声明的法律后果由本人承担。

 

作者签名:

二〇〇年二十

 

毕业设计(论文)使用授权声明

本人完全了解滨州学院关于收集、保存、使用毕业设计(论文)的规定。

本人愿意按照学校要求提交学位论文的印刷本和电子版,同意学校保存学位论文的印刷本和电子版,或采用影印、数字化或其它复制手段保存设计(论文);同意学校在不以营利为目的的前提下,建立目录检索与阅览服务系统,公布设计(论文)的部分或全部内容,允许他人依法合理使用。

(保密论文在解密后遵守此规定)

 

作者签名:

二〇〇年二十



时间飞逝,大学的学习生活很快就要过去,在这四年的学习生活中,收获了很多,而这些成绩的取得是和一直关心帮助我的人分不开的。

首先非常感谢学校开设这个课题,为本人日后从事计算机方面的工作提供了经验,奠定了基础。本次毕业设计大概持续了半年,现在终于到结尾了。本次毕业设计是对我大学四年学习下来最好的检验。经过这次毕业设计,我的能力有了很大的提高,比如操作能力、分析问题的能力、合作精神、严谨的工作作风等方方面面都有很大的进步。这期间凝聚了很多人的心血,在此我表示由衷的感谢。没有他们的帮助,我将无法顺利完成这次设计。

首先,我要特别感谢我的知道郭谦功老师对我的悉心指导,在我的论文书写及设计过程中给了我大量的帮助和指导,为我理清了设计思路和操作方法,并对我所做的课题提出了有效的改进方案。郭谦功老师渊博的知识、严谨的作风和诲人不倦的态度给我留下了深刻的印象。从他身上,我学到了许多能受益终生的东西。再次对周巍老师表示衷心的感谢。

其次,我要感谢大学四年中所有的任课老师和辅导员在学习期间对我的严格要求,感谢他们对我学习上和生活上的帮助,使我了解了许多专业知识和为人的道理,能够在今后的生活道路上有继续奋斗的力量。

另外,我还要感谢大学四年和我一起走过的同学朋友对我的关心与支持,与他们一起学习、生活,让我在大学期间生活的很充实,给我留下了很多难忘的回忆。

最后,我要感谢我的父母对我的关系和理解,如果没有他们在我的学习生涯中的无私奉献和默默支持,我将无法顺利完成今天的学业。

四年的大学生活就快走入尾声,我们的校园生活就要划上句号,心中是无尽的难舍与眷恋。从这里走出,对我的人生来说,将是踏上一个新的征程,要把所学的知识应用到实际工作中去。

回首四年,取得了些许成绩,生活中有快乐也有艰辛。感谢老师四年来对我孜孜不倦的教诲,对我成长的关心和爱护。

学友情深,情同兄妹。四年的风风雨雨,我们一同走过,充满着关爱,给我留下了值得珍藏的最美好的记忆。

在我的十几年求学历程里,离不开父母的鼓励和支持,是他们辛勤的劳作,无私的付出,为我创造良好的学习条件,我才能顺利完成完成学业,感激他们一直以来对我的抚养与培育。

最后,我要特别感谢我的导师***老师、和研究生助教***老师。是他们在我毕业的最后关头给了我们巨大的帮助与鼓励,给了我很多解决问题的思路,在此表示衷心的感激。老师们认真负责的工作态度,严谨的治学精神和深厚的理论水平都使我收益匪浅。他无论在理论上还是在实践中,都给与我很大的帮助,使我得到不少的提高这对于我以后的工作和学习都有一种巨大的帮助,感谢他耐心的辅导。在论文的撰写过程中老师们给予我很大的帮助,帮助解决了不少的难点,使得论文能够及时完成,这里一并表示真诚的感谢。



致 谢

这次论文的完成,不止是我自己的努力,同时也有老师的指导,同学的帮助,以及那些无私奉献的前辈,正所谓你知道的越多的时候你才发现你知道的越少,通过这次论文,我想我成长了很多,不只是磨练了我的知识厚度,也使我更加确定了我今后的目标:为今后的计算机事业奋斗。在此我要感谢我的指导老师——***老师,感谢您的指导,才让我有了今天这篇论文,您不仅是我的论文导师,也是我人生的导师,谢谢您!我还要感谢我的同学,四年的相处,虽然我未必记得住每分每秒,但是我记得每一个有你们的精彩瞬间,我相信通过大学的历练,我们都已经长大,变成一个有担当,有能力的新时代青年,感谢你们的陪伴,感谢有你们,这篇论文也有你们的功劳,我想毕业不是我们的相处的结束,它是我们更好相处的开头,祝福你们!我也要感谢父母,这是他们给我的,所有的一切;感谢母校,尽管您不以我为荣,但我一直会以我是一名农大人为荣。

通过这次毕业设计,我学习了很多新知识,也对很多以前的东西有了更深的记忆与理解。漫漫求学路,过程很快乐。我要感谢信息与管理科学学院的老师,我从他们那里学到了许多珍贵的知识和做人处事的道理,以及科学严谨的学术态度,令我受益良多。同时还要感谢学院给了我一个可以认真学习,天天向上的学习环境和机会。

即将结束*大学习生活,我感谢****大学提供了一次在农大接受教育的机会,感谢院校老师的无私教导。感谢各位老师审阅我的论文。

基于opencv的人脸识别系统毕业设计论文

相关推荐