本文实现基于eigenface的人脸检测与识别。给定一个图像数据库,进行以下步骤:
- 进行人脸检测,将检测出的人脸存入数据库2
- 对数据库2进行人脸建模
- 在测试集上进行recognition
- 进行人脸检测,将检测出的人脸存入数据库2
环境:vs2010+opencv 2.4.6.0
特征:eigenface
Input:一个人脸数据库,15个人,每人20个样本(左右)。
Output:人脸检测,并识别出每张检测到的人脸。
===============================
本文完成第一步,数据预处理:自动检测所有文件夹中每个sample中的人脸,作为训练数据。
Input:一个color文件夹,每个文件夹中有1~N这N个子文件夹,每个子文件夹内有n张包括第n类人的照片,如图。
最终结果:
核心:face detection(detectAndDraw)
辅助:截图并保存部分图片(CutImg),文件夹内图片遍历(read_img),图片转换成相同大小(normalizeone)
括号内分别是函数名,下面分别给出代码及说明。
1. 遍历文件夹:CBrowseDir类和CStatDir类(具体见这篇),三个文件如下:
1.1 BrowseDir.h
- #pragmaonce
- #include"direct.h"
- #include"string.h"
- #include"io.h"
- #include"stdio.h"
- #include<vector>
- #include<iostream>
- usingnamespacestd;
- classCBrowseDir
- {
- protected:
- charm_szInitDir[_MAX_PATH];
- public:
- CBrowseDir();
- boolSetInitDir(constchar*dir);
- boolBeginBrowse(constchar*filespec);
- vector<char*>BeginBrowseFilenames(constchar*filespec);
- protected:
- boolBrowseDir(constchar*dir,constchar*filespec);
- vector<char*>GetDirFilenames(constchar*dir,constchar*filespec);
- virtualboolProcessFile(constchar*filename);
- virtualvoidProcessDir(constchar*currentdir,constchar*parentdir);
- };
1.2 BrowseDir.cpp
- #include"BrowseDir.h"
- #include"direct.h"
- #include"string.h"
- #include"io.h"
- #include"stdio.h"
- #include<vector>
- #include<iostream>
- usingnamespacestd;
- CBrowseDir::CBrowseDir()
- {
- getcwd(m_szInitDir,_MAX_PATH);
- intlen=strlen(m_szInitDir);
- if(m_szInitDir[len-1]!='\')
- strcat(m_szInitDir,"\");
- }
- boolCBrowseDir::SetInitDir(constchar*dir)
- {
- if(_fullpath(m_szInitDir,dir,_MAX_PATH)==NULL)
- returnfalse;
- if(_chdir(m_szInitDir)!=0)
- returnfalse;
- intlen=strlen(m_szInitDir);
- if(m_szInitDir[len-1]!='\')
- strcat(m_szInitDir,"\");
- returntrue;
- }
- vector<char*>CBrowseDir::BeginBrowseFilenames(constchar*filespec)
- {
- ProcessDir(m_szInitDir,NULL);
- returnGetDirFilenames(m_szInitDir,filespec);
- }
- boolCBrowseDir::BeginBrowse(constchar*filespec)
- {
- ProcessDir(m_szInitDir,NULL);
- returnBrowseDir(m_szInitDir,filespec);
- }
- boolCBrowseDir::BrowseDir(constchar*dir,constchar*filespec)
- {
- _chdir(dir);
- longhFile;
- _finddata_tfileinfo;
- if((hFile=_findfirst(filespec,&fileinfo))!=-1)
- {
- do
- {
- if(!(fileinfo.attrib&_A_SUBDIR))
- {
- charfilename[_MAX_PATH];
- strcpy(filename,dir);
- strcat(filename,fileinfo.name);
- cout<<filename<<endl;
- if(!ProcessFile(filename))
- returnfalse;
- }
- }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)
- {
- charsubdir[_MAX_PATH];
- strcpy(subdir,dir);
- strcat(subdir,fileinfo.name);
- strcat(subdir,"\");
- ProcessDir(subdir,dir);
- if(!BrowseDir(subdir,filespec))
- returnfalse;
- }
- }
- }while(_findnext(hFile,&fileinfo)==0);
- _findclose(hFile);
- }
- returntrue;
- }
- vector<char*>CBrowseDir::GetDirFilenames(constchar*dir,constchar*filespec)
- {
- _chdir(dir);
- vector<char*>filename_vec;
- filename_vec.clear();
- longhFile;
- _finddata_tfileinfo;
- if((hFile=_findfirst(filespec,&fileinfo))!=-1)
- {
- do
- {
- if(!(fileinfo.attrib&_A_SUBDIR))
- {
- char*filename=newchar[_MAX_PATH];
- strcpy(filename,dir);
- //intst=0;while(dir[st++]!='