zoukankan      html  css  js  c++  java
  • 项目二:人脸识别

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

  • 相关阅读:
    如何使用NuGet package .nupkg文件?
    利用Z.Expressions.Eval表达式求值
    表达式实现填写“阶段标记”属性
    NX导入DWG失败
    简单工厂模式(Simple Factory Pattern)
    电脑装系统蓝屏未解决
    idea intellij 配置总结
    poiexcel 笔记
    Springboot
    Springboot--maven命令子模块单独打包
  • 原文地址:https://www.cnblogs.com/ilym/p/8596082.html
Copyright © 2011-2022 走看看