项目二:人脸识别

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文件部分展示]

原文地址:https://www.cnblogs.com/ilym/p/8596082.html