本文實現基於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)) {