OpenCV利用摄像头人脸识别

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

∙Introduction

网上存在很多人脸识别的文章,这篇文章是我的一个作业,重在通过摄像头实时采集人脸信息,进行人脸检测和人脸识别,并将识别结果显示在左上角。

利用OpenCV 实现一个实时的人脸识别系统,人脸库采用ORL FaceDatabase (网上下载) ,另外在数据库中增加了作业中自带的20张照片和自己利用摄像头采集到的10张照片,系统利用摄像头实时的采集到场景图像,从中检测出人脸用方框标出,并利用提供的数据库进行人脸识别,并在图像左上角显示相匹配的数据库图片。

∙Method

算法流程分两步,分别是人脸检测和人脸识别。人脸检测使用的是ViolaJones 人脸检测方法,利用样本的Haar-like 特征进行分类器训练,得到级联boosted 分类器,加载训练好的人脸分类器,利用分类器在视频帧中查找人脸区域;人脸识别利用了局部二进制模式直方图。

∙Haar-like 特征

Haar-like 特征如下图所示

图1 Haar-like 特征

∙LBPH

人脸识别常用的方法有三种,Eigenfaces、Fisherfaces 和LBPH;对于高维的图像空间,我们首先应该进行降维操作。LBP 不把图像看做高维的矢量,而是通过物体的局部特征来描述。

将每个像素和其相邻像素对比形成局部的结构,把该像素看做中心,并以该值对邻接像素做阈值处理,如果临界像素的亮度大于该像素则为 1 否则为0,这样每个像素点都可以用一个二进制数来表示,比如一个使用3*3 临界点的LBP 操作如下图所示:

图2 LBP

∙Implementation

∙识别训练

利用准备好的数据库进行识别训练:首先我们利用Opencv安装文件中的python脚本

create_csv.py建立CSV文件,文件中每条记录如:orl/s13/2.pgm;12,分号之前是图片所存路径,而分号之后是图片的标签号,每一组图片对应着唯一的标签号;之后利用代码中的train_data和read_csv函数对数据集进行训练。使用到的OpenCV 类和函数有:

FaceRecognizer,createLBPHFaceRecognizer

∙人脸检测

运用Opencv安装文件中的haarcascade_frontalface_alt.xml文件,使用分类器在视频帧中查找人脸区域,并用绿色方框标出。用到的OpenCV 类和函数有:

CascadeClassifier,detectMultiScale。

∙人脸识别

读取训练好的yaml文件,对每个监测到的区域的图像分类,并在视频帧人脸区域上方显示分类结果(分类结果显示为标签和可信度),在左上角显示缩略图。用到的OpenCV 函数主要有:predict.

∙Code

1/*头文件:*/

2 #include "opencv2/core/core.hpp"

3 #include "opencv2/contrib/contrib.hpp"

4 #include "opencv2/highgui/highgui.hpp"

5 #include "opencv2/imgproc/imgproc.hpp"

6 #include "opencv2/objdetect/objdetect.hpp"

7

8 #include

9 #include

10 #include

11 #include

12

13char *FACES_TXT_PATH = "face.txt";

14char *HARR_XML_PATH = "haarcascade_frontalface_alt.xml";

15char *FACES_MODEL = "face.yaml";

16char *POTRAITS ="potraits.jpg";

17int DEVICE_ID = 0;

18

19/*主文件*/

20 #include "config.h"

21

22using namespace cv;

23using namespace std;

24int FACE_WIDHT=92;

25int FACE_HEIGHT=112;

26int POTRITE_WIDTH = 100;

27int POTRITE_HEIGHT = 100;

28

29static void read_csv(const string& filename, vector& images, vector& labels, char separator = ';') {

30 std::ifstream file(filename.c_str(), ifstream::in);

31if (!file) {

32string error_message = "找不到文件,请核对路径";

33 CV_Error(CV_StsBadArg, error_message);

34 }

35string line, path, classlabel;

36while (getline(file, line)) {

37 stringstream liness(line);

38 getline(liness, path, separator);

39 getline(liness, classlabel);

40if(!path.empty() && !classlabel.empty()) {

41 images.push_back(imread(path, 0));

42 labels.push_back(atoi(classlabel.c_str()));

43 }

44 }

45

46}

47

48/*利用csv文件读取数据集并训练对应模型*/

49void train_data(String fn_csv)

50{

51 vector images;

52 vector labels;

53//获取数据集,如果出错抛出异常

54try {

55 read_csv(fn_csv, images, labels);

56 }

57catch (cv::Exception& e) {

相关文档
最新文档