本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行如下步骤:数据库
环境:vs2010+opencv 2.4.6.0app
特征:LBP函数
Input:一我的脸数据库,15我的,每人20个样本(左右)。学习
Output:人脸检测,并识别出每张检测到的人脸。测试
===============================ui
本文完成第一步,数据预处理:自动检测全部文件夹中每一个sample中的人脸,做为训练数据。spa
Input:一个color文件夹,每一个文件夹中有1~N这N个子文件夹,每一个子文件夹内有n张包括第n类人的照片,如图。3d
最终结果:regexp
核心:face detection(detectAndDraw)orm
辅助:截图并保存部分图片(CutImg),文件夹内图片遍历(read_img),图片转换成相同大小(normalizeone)
括号内分别是函数名,下面分别给出代码及说明。
1. 遍历文件夹:CBrowseDir类和CStatDir类(具体见这篇),三个文件以下:
1.1 BrowseDir.h
#pragma once
#include "direct.h" #include "string.h" #include "io.h" #include "stdio.h" #include #include using namespace std; class CBrowseDir { protected: char m_szInitDir[_MAX_PATH]; public: CBrowseDir(); bool SetInitDir(const char *dir); bool BeginBrowse(const char *filespec); vector<char*> BeginBrowseFilenames(const char *filespec); protected: bool BrowseDir(const char *dir,const char *filespec); vector<char*> GetDirFilenames(const char *dir,const char *filespec); virtual bool ProcessFile(const char *filename); virtual void ProcessDir(const char *currentdir,const char *parentdir); };
1.2 BrowseDir.cpp
#include "BrowseDir.h"
#include "direct.h" #include "string.h" #include "io.h" #include "stdio.h" #include #include using namespace std; CBrowseDir::CBrowseDir() { getcwd(m_szInitDir,_MAX_PATH); int len=strlen(m_szInitDir); if (m_szInitDir[len-1] != '\\') strcat(m_szInitDir,"\\"); } bool CBrowseDir::SetInitDir(const char *dir) { if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL) return false; if (_chdir(m_szInitDir) != 0) return false; int len=strlen(m_szInitDir); if (m_szInitDir[len-1] != '\\') strcat(m_szInitDir,"\\"); return true; } vector<char*>CBrowseDir:: BeginBrowseFilenames(const char *filespec) { ProcessDir(m_szInitDir,NULL); return GetDirFilenames(m_szInitDir,filespec); } bool CBrowseDir::BeginBrowse(const char *filespec) { ProcessDir(m_szInitDir,NULL); return BrowseDir(m_szInitDir,filespec); } bool CBrowseDir::BrowseDir(const char *dir,const char *filespec) { _chdir(dir); long hFile; _finddata_t fileinfo; if ((hFile=_findfirst(filespec,&fileinfo)) != -1) { do { if (!(fileinfo.attrib & _A_SUBDIR)) { char filename[_MAX_PATH]; strcpy(filename,dir); strcat(filename,fileinfo.name); cout << filename << endl; if (!ProcessFile(filename)) return false; } } while (_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } _chdir(dir); if ((hFile=_findfirst("*.*",&fileinfo)) != -1) { do { if ((fileinfo.attrib & _A_SUBDIR)) { if (strcmp(fileinfo.name,".") != 0 && strcmp (fileinfo.name,"..") != 0) { char subdir[_MAX_PATH]; strcpy(subdir,dir); strcat(subdir,fileinfo.name); strcat(subdir,"\\"); ProcessDir(subdir,dir); if (!BrowseDir(subdir,filespec)) return false; } } } while (_findnext(hFile,&fileinfo) == 0); _findclose(hFile); } return true; } vector<char*> CBrowseDir::GetDirFilenames(const char *dir,const char *filespec) { _chdir(dir); vector<char*>filename_vec; filename_vec.clear(); long hFile; _finddata_t fileinfo; if ((hFile=_findfirst(filespec,&fileinfo)) != -1) { do { if (!(fileinfo.attrib & _A_SUBDIR)) {