搜档网
当前位置:搜档网 › 《基于 OpenCV的人脸识别系统》

《基于 OpenCV的人脸识别系统》

《基于 OpenCV的人脸识别系统》
《基于 OpenCV的人脸识别系统》

西安电子科技大学

人工智能学院暑期夏令营科研实践《基于OpenCV的人脸识别系统》

实践报告

姓名:XXX

学校:XXXX

院系班级:XXXXXXXXX

联系方式:XXXX

目录

1 项目背景 (1)

2 项目目标 (1)

3 项目方案 (2)

3.1 人脸采集 (2)

3.2 人脸训练 (3)

3.3 人脸识别 (4)

4 项目调试 (6)

4.1 采集调试 (6)

4.2 训练调试 (6)

4.3 识别调试 (7)

5实践总结 (8)

如何创造一个安全的、数字现代化的、智能化的宿舍门禁系统有着十分重要的意义。然而,在日常管理中我们经常会碰到这样的问题:外来人员混入宿舍带来的安全隐患、夏天未带校园卡而在公寓楼前苦等、宿舍出入口必须有人盯守、晚归被困公寓楼外等等。

在当今计算机普及与急剧增长的状况下,应该实施一些高效率的系统,不仅省钱,省事,而且便捷,针对以上情况,十分有必要建立一个全面、高效、人性化、智能的高校宿舍出入管理系统。

因此,做一个人脸识别系统就非常地有必要!

2 项目目标

本项目拟完成人脸采集、人脸训练和人脸检测与识别的功能。

人脸采集程序主要完成以下功能:

1. 建立新的文件夹:用户根据提示输入自己姓名的简称,程序会在工程目录下建立该用户的文件夹,用以存放拍摄的照片;

2. 打开摄像头和写入图像:调用笔记本摄像头,当P键按下时,显示当前帧的图像,经处理后,保存图像;当q键按下时,立即退出采集程序

3. 人脸检测与裁剪:在当前帧识别出人脸后将其裁剪至ORL人脸数据

库大小即92x112。

人脸训练程序主要完成以下功能:

1. CSV文件读取:CSV文件对应的图像数据和对应的标签;

2. 样本训练:包括ORL人脸数据库的样本和自己的样本。

人脸训练样本取自ORL人脸数据库,共40个人,每人10张照片。照片在不同时间、不同表情(睁眼闭眼、笑或者不笑)、不同人脸细节(戴眼镜或者不戴眼镜)下采集,所有的图像都在一个黑暗均匀的背景下采集的,正面竖直人脸(有些有轻微旋转)。此外,增加自己的样本,并以相同尺寸拍摄20张左右图像。

人脸识别与检测程序主要完成以下功能:

1. 人脸检测:识别出当前帧是否有人脸;

2. 人脸预测:根据训练结果判断当前帧中人脸是否属于样本集;

3. 姓名显示:若属于样本集则显示姓名缩写,否则,显示“0”。

本项目一共分为三个步骤,故程序共有三个,分别是:人脸采集程序、人脸训练程序和人脸检测与识别程序。

3.1 人脸采集

人脸采集程序包含三个模块:建立文件夹模块、打开摄像头和写入图像模块、人脸检测与裁剪模块。图1是人脸采集程序的流程图。

图1 人脸采集程序流程图

建立文件夹模块:采用mkdir()函数为每位用户提供单独文件夹保存拍摄的

照片,不允许有重复文件夹,若名字相同,只能删除原文件夹或者更改名字简称。

打开摄像头和写入图像模块:拍摄照片时调用笔记本电脑摄像头,使用OpenCV的VideoCapture类,即可打开摄像头,使用imwrite()函数即可写图像。

人脸检测与裁剪模块:检测并分割出人脸,并改变图像法的大小与下载的数据图片大小一致。人脸采集使用OpenCV内部描述脸部Haar特征的分类器:haarcascade_frontalface_default。而人脸检测使用detectMultiScale函数,该函数原型为:

void detectMultiScale

(

const Mat& image,

CV_OUT vector& objects,

double scaleFactor = 1.1,

int minNeighbors = 3,

int flags = 0,

Size minSize = Size(),

Size maxSize = Size()

);

参数1:image--待检测图片,一般为灰度图像加快检测速度;

参数2:objects--被检测物体的矩形框向量组;

参数3:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;

参数4:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个);

如果组成检测目标的小矩形的个数和小于min_neighbors - 1 都会被排

除;如果min_neighbors 为0, 则函数不做任何操作就返回所有的被检

候选矩形框;这种设定值一般用在用户自定义对检测结果的组合程序上;参数5:flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用

Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会

是人脸所在区域;

参数6、7:minSize和maxSize用来限制得到的目标区域的范围。

3.2 人脸训练

人脸训练程序包含三个模块:创建CSV文件模块、读取CSV文件和人脸训练模块。

创建CSV文件模块:CSV文件采用Python3 编写,使用opencv教程里提供的自动生成csv文件的脚本。包含图片的路径和标签。

读取CSV文件模块:stringstream最大的特点就是可以实现各种数据类型的转换,不需要像C语言那样麻烦,而且非常安全;getline()把从输入流读入的字

符串存放入新字符串中。其函数原型是:

istream& getline ( istream &is , string &str , char delim );

其中:istream &is表示一个输入流,譬如cin;

string&str表示把从输入流读入的字符串存放在这个字符串中;

char delim表示遇到这个字符停止读入,在不设置的情况下系统默认该字符为'\n',(遇到回车停止读入)。

脸训练模块:采用face.hpp头文件里的LBPHFaceRecognizer类,继承自FaceRecognizer。创建分类器、样本训练和保存训练结果的程序如下:Ptr model = createLBPHFaceRecognizer();

model->train(images, labels);

model->save("MyFaceLBPHModel.xml");

图2是人脸训练程序流程图。此外,程序会对样本数量过少和样本尺寸不一致报错。

图2 人脸训练程序流程图

3.3 人脸识别

人脸识别程序包含两个模块:人脸检测模块和人脸预测模块,其中人脸检测

模块与人脸采集中的人脸检测模块相差无几,故不再赘述。

使用OpenCV调用笔记本摄像头测试。先检测画面中是否有人脸,如果有,将人脸框出来;其次再识别人脸是否属于样本,若属于,则显示名字缩写,否则,则显示“0”。

人脸预测模块是先建立一个分类器,然后加载训练结果,利用训练结果预测当前帧的人像是否与样本一致。关键语句如下:

Ptr model = createLBPHFaceRecognizer();

model->load("MyFaceLBPHModel.xml");

predict = model->predict(face_test);

图3 人脸识别程序流程图

4 项目调试

4.1 采集调试

如图4,右边的“frame”窗口是摄像头,中间的“photo”窗口是当前帧图像,左边的小窗口是经尺寸修改后的图像,最下方的控制台显示调试输出。

图4 采集调试

4.2 训练调试

图5 训练调试

如图5所示,人脸训练程序先读取所有样本,输出每张样本的路径,随后开始训练,当训练完成时会提示用户训练完成。

4.3 识别调试

如图6所示,人脸识别程序会输出每次识别到的人脸编号(本人是第41号样本),编号与姓名简称一一对应,会在识别框左上角显示名字。图7是双人识别调试图。

图6 识别调试

图7 双人识别调试

图8 程序入口演示

根据以上调试结果,程序可实现所有预定功能。

5实践总结

本项目完成所有目标,达到预期效果。由于使用的是基本的方法,仅使用了人脸和人眼的特征,故容易误检。

本项目分为三个子程序,界面不美观,不利于用户操作和体验。后期我计划结合Qt整合三个子程序,并设计GUI。

相关主题