1. 總體工作流程
1.1 主要成員及作用
FaceTrackertrain_face_tracker; // FaceTracker類,在訓練階段跟蹤人臉,採集樣本
FaceTrackerpredict_face_tracker; // FaceTracker類,在識別階段跟蹤人臉,採集樣本
FaceRecognizerface_recognizer; // FaceRecognizer類,負責樣本的訓練和識別
1.2 工作流程
2. 類功能說明
2.1人臉跟蹤相關類
ClassFaceTracker;
ClassFaceTrack;
2.1.1)FaceTrack類
屬於同一個人(subject)的多幀人臉構成一個FaceTrack,FaceTrack即爲將被訓練的樣本數據。
2.1.1.1)主要成員變量:
vector<Mat>m_vecFaces;// 屬於同一個人(subject)的多幀人臉圖像
Pointm_ptCenter; // 最後一幀人臉的中心位置
boolm_bAssigned; // 最後一幀人臉是否是當前幀
intm_iMissNum; // 丟失的人臉幀數
2.1.1.2)主要成員函數:
voidAssignFace(Mat& face, Point pt) //將當前幀人臉加入到FaceTrack中,並更新人臉中心位置
voidUnassignFace() //當前幀沒有跟蹤到人臉時,更新m_bAssigned和m_iMissNum值
2.1.2)FaceTracker類
對OpenCV檢測到的人臉進行跟蹤,並存儲到相應的FaceTrack中。跟蹤標準是位置和大小,位置和大小最接近的人臉認爲屬於同一個人(subject).
2.1.2.1)主要成員變量
list<FaceTrack>m_lstFaceTracks; // 跟蹤到的不同人(subject)的人臉構成的FaceTrack集合
2.1.2.2)主要成員函數
voidTrack(vector<Mat>& faces, vector<Point>& centers); // 對OpenCV檢測的人臉和中心位置與現有的FaceTrack的人臉和中心位置進行比較,大小和中心位置最接近的人臉認爲是屬於同一個人(subject)的,將剛檢測到的人臉存入響應的FaceTrack; 如果沒有接近的,建立新的FaceTrack,將檢測到的人臉存入其中。
2.2) 人臉訓練和識別相關類
Class FaceRecognizer;//人臉訓練和識別類
Class MyAbstractLBPH;Class MyLBPH; LBP_Core; // LBP feature相關類,來自OpenCV
Class LANDMARK_Model;//檢測人臉特徵點的類,來自http://cmp.felk.cvut.cz/~uricamic/flandmark/
2.2.1) LBPfeature相關類
這裏的人臉訓練和識別採用的是LBPfeature,相關類是Class MyAbstractLBPH; Class MyLBPH; LBP_Core,代碼來自OpenCV.
2.2.2) LANDMARK_Model類
LANDMARK_Model類是用來檢測人臉特徵點的,相關文件是flandmark_detector.h和flandmark_detector.cpp,來源是http://cmp.felk.cvut.cz/~uricamic/flandmark/
2.2.3) FaceRecognizer類
FaceRecognizer類用來訓練和識別人臉
2.2.3.1)主要成員變量
MyLBPH m_lbph;// LBP feature類,用來生成LBP feature
boolm_bTrained; // 標記是否有人臉已經被訓練過
FLANDMARK_Model*m_flandmarkModel; // 用來檢測人臉特徵點的類
double*m_pLandmarks; // 檢測到的人臉特徵點位置
boolm_bHighDimensionLbp; //標記是否要採用高維LBP,如果採用高維LBP,在每個人臉特徵點處的局部圖都要生成LBP feature,最終組成高維LBP feature;如果不採用高維LBP,只對全臉生成LBP feature
vector<vector<Mat>>m_trainImages; //訓練出的LBP feature
vector<int>m_trainLabels; //各個人(subject)的標記
2.2.3.2) 主要成員函數
boolTrain(list<FaceTrack>& face_tracks); // 檢查檢測到的人臉是否達到註冊人數,如果達到開始對採集到的人臉樣本進行訓練
boolPredict(list<FaceTrack>& face_tracks,
vector<int>&predict_labels, vector<double>& predict_dists);//對檢測到的人臉樣本進行預測
void_prepareTrainData(list<FaceTrack>& face_tracks); //準備訓練數據,包括resize人臉大小,根據標記檢測人臉特徵點
3. 文件結構說明
MyFaceRecognizer
Include// 頭文件
Src // 源文件
MyLBPH// 來自OpenCV的LBP feature文件
flandmark_src// 來http://cmp.felk.cvut.cz/~uricamic/flandmark/的人臉特徵點檢測文件
test// 測試用例文件
data// 數據文件,包含OpenCV人臉檢測要使用的庫文件、人臉特徵點檢測要使用的庫文件以及測試視頻
doc// 說明文檔
4. 使用說明
打開工程文件,及工程文件中的main.cpp文件,在main.cpp中可以指定讀取視頻或是攝像頭,並設定OpenCV人臉檢測要使用的庫文件、人臉特徵點檢測要使用的庫文件以及測試視頻的路徑,編譯工程,執行。默認會輸出debug信息,可以關閉。
注意:
1)保證OpenCV人臉檢測要使用的庫文件、人臉特徵點檢測要使用的庫文件存在並且路徑正確;
2)保證工程能鏈接到OpenCV庫,目前代碼中使用的是OpenCV2.x庫。