项目二:人脸识别

1. 简介:

/************************************************************************** 人脸识别,近年来是研究的热点,若是深究的话,其中涵盖的知识是不少.并且以人脸识别为题目 的本科毕业设计,愈来愈受到本科老师的青睐,本实验是利用opencv基于Eigenfaces特征脸和 Fisherfaces算法,咱们想要识别人脸,天然就要制做一个真的人脸,经过这个实验咱们能够实现 一个简易的人脸识别算法,也算是研究人脸识别入门的必经之路吧.我接下来,若是有时间的话, 我将利用QT作我的脸识别应用程序(先立个flag,怕本身偷懒,怕困难不作),给它加一个华丽丽的 界面. ************************************************************************/

2. 收集数据集与制做

/********************************************************************* 人脸的数据集,能够本身制做,也能够去网上自行下载,这里推荐一个download,同时若是是 想要识别本身的脸,天然数据集里要包含有本身的脸,咱们还要制做本身的人脸集合. *********************************************************************/

2.1 收集到的背景数据集合

/********************************************************************** 下面是咱们下载下来的背景数据集合,一共有40个,每一个有10我的,分别以s1-s40文件夹存放 于orl_faces中.须要注意的是数据集合中的图片都是pgm格式的,在Ubuntu系统下能够直接 打开,在windows下能够利用opencv的imread函数打开.另外咱们还要看一下背景数据集 的人脸照片是多大的,检查看是92x112,记住这个尺寸,由于咱们制做的本身的人脸一样是需 要这个大小的尺寸. *********************************************************************/

 

 

                                                                       [部分背景数据集展现]html

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("\n") label = label + 1 fh.close()  

 [生成的at.txt文件部分展现]python

相关文章
相关标签/搜索