1. 简介:
/**************************************************************************
人脸识别,近年来是研究的热点,如果深究的话,其中涵盖的知识是很多.而且以人脸识别为题目
的本科毕业设计,越来越受到本科老师的青睐,本实验是利用opencv基于Eigenfaces特征脸和
Fisherfaces算法,我们想要识别人脸,自然就要制作一个真的人脸,通过这个实验我们可以实现
一个简易的人脸识别算法,也算是研究人脸识别入门的必经之路吧.我接下来,如果有时间的话,
我将利用QT做个人脸识别应用程序(先立个flag,怕自己偷懒,怕困难不做),给它加一个华丽丽的
界面.
************************************************************************/
2. 收集数据集与制作
/*********************************************************************
人脸的数据集,可以自己制作,也可以去网上自行下载,这里推荐一个download,同时如果是
想要识别自己的脸,自然数据集里要包含有自己的脸,我们还要制作自己的人脸集合.
*********************************************************************/
2.1 收集到的背景数据集合
/**********************************************************************
下面是我们下载下来的背景数据集合,一共有40个,每个有10个人,分别以s1-s40文件夹存放
于orl_faces中.需要注意的是数据集合中的图片都是pgm格式的,在Ubuntu系统下可以直接
打开,在windows下可以利用opencv的imread函数打开.另外我们还要看一下背景数据集
的人脸照片是多大的,检查看是92x112,记住这个尺寸,因为我们制作的自己的人脸同样是需
要这个大小的尺寸.
*********************************************************************/
[部分背景数据集展示]
2.2 制作自己的人脸数据集合
/***********************************************************************
我们利用加载人脸检测器的方法,打开电脑摄像头,并且利用opencv中resize()函数将识别到
的人脸图像自动改变尺寸为92x112,并通过imwrite函数将resize()过后的图片保存到背景数据
集所在的位置,存放于s41文件夹中.具体代码实现如下:
***********************************************************************/
#include "opencv2/objdetect.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
CascadeClassifier facecascade;
facecascade.load("models/lbpcascade_frontalface.xml"); //人脸检测器(快速的LBP)
VideoCapture capture;
capture.open(0);
Mat frame; //定义一个Mat变量,用于存储每一帧的图像
int pic_count = 1;
while(1)
{
capture >> frame; //读取当前帧
std::vector<Rect> faces;
Mat frameGray;
cvtColor(frame,frameGray,COLOR_BGR2GRAY);
facecascade.detectMultiScale(frameGray,faces, 1.1, 4, 0, Size(100, 100), Size(500,500));
for(size_t i = 0; i < faces.size(); i++)
{
rectangle(frame, faces[i], Scalar(0, 255, 0), 2, 8, 0);
}
if(faces.size() == 1)
{
Mat faceROI = frameGray(faces[0]);
Mat myFace;
resize(faceROI, myFace,Size(92,112));
putText(frame, to_string(pic_count), faces[0].tl(), FONT_HERSHEY_DUPLEX, 1.2, Scalar(71, 99, 255), 2, LINE_8);
string filename = format("orl_faces/s41/%d.jpg", pic_count);
imwrite(filename, myFace);
imshow(filename,myFace);
waitKey(500);
destroyWindow(filename);
pic_count++;
if(pic_count == 21)
{
return 0;
}
}
imshow("frame",frame);
waitKey(100);
}
return 0;
}
3. 利用pyhton脚本生成csv文件
/********************************************************************
因为在写人脸模型训练程序时,需要读取人脸和人脸对应的标签,若直接在数据库读取效率是很
的,因此我们可以利用csv文件读取,在训练之前需要生成csv文件,其内容包含以下两个部分:
1.每一张图片对应的位置
1.同一个人脸对应的标签
我们可以利用利用opencv官方提供的python脚本自动生成,具体程序如下:
*******************************************************************/
#!/usr/bin/env python import sys import os.path if __name__ == "__main__": #if len(sys.argv) != 2: # print "usage: create_csv <base_path>" # sys.exit(1) #BASE_PATH=sys.argv[1] BASE_PATH="orl_faces" SEPARATOR=";" fh = open("at.txt",'w') for dirname, dirnames, filenames in os.walk(BASE_PATH): for subdirname in dirnames: subject_path = os.path.join(dirname, subdirname) for filename in os.listdir(subject_path): subdirname2 = subdirname[::-1] subdirname3 = subdirname2[:-1] subdirname4 = subdirname3[::-1] #print subdirname2[:-1] label = int(subdirname4) abs_path = "%s/%s" % (subject_path, filename) print "%s%s%d" % (abs_path, SEPARATOR, label) fh.write(abs_path) fh.write(SEPARATOR) fh.write(str(label)) fh.write(" ") label = label + 1 fh.close()
[生成的at.txt文件部分展示]