基於opencv和QT的人臉(人眼)檢測程式
在上一篇部落格裡,我們已經實現了對攝像頭或者本地圖片的讀取和輸出功能,並且在程式中預留了進行影象處理的函式位置,本文將建立一個影象處理類,對每一幀影象進行人臉或者人眼識別,並在輸出影象中框選出人臉或者人眼的位置。由於作者的程式開發不僅僅限於人臉識別的功能,所以作者使用了一個類進行影象處理,讀者可以根據需要將這個類改寫成函式,人臉識別的部分還是比較簡單的。下面直接給出人臉(人眼)檢測的函式:
#include "detectanddisplay.h" void detectAndDisplay( Mat &frame) { string face_cascade_name = "haarcascade_mcs_eyepair_big.xml";//匯入已經訓練完成的樣本 CascadeClassifier face_cascade;//建立分類器 string window_name = "camera"; if( !face_cascade.load( face_cascade_name ) ){ printf("[error] no cascade\n"); } std::vector<Rect> faces;//用於儲存檢測結果的向量 Mat frame_gray; cvtColor( frame, frame_gray, CV_BGR2GRAY );//轉換成灰度圖 equalizeHist( frame_gray, frame_gray );//直方圖均值化 face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );//用於檢測人眼的函式 //畫方框 for( int i = 0; i < faces.size(); i++ ){ Point centera( faces[i].x, faces[i].y); Point centerb( faces[i].x + faces[i].width, faces[i].y + faces[i].height ); rectangle(frame,centera,centerb,Scalar(255,0,0)); } //imshow( window_name, frame ); }
函式首先使用CascadeClassifier類建立一個分類器,然後匯入opencv已經訓練好的資料樣本進行分類,並將結果存入vector<Rect>faces向量中。需要注意的是,"haarcascade_mcs_eyepair_big.xml"檔案在opencv中的路徑為\opencv\sources\data\haarcascades,執行時需要將該檔案放到該專案的Debug資料夾中。Opencv自帶了多種已經訓練好的人臉特徵資料,可以選擇自己需要的檔案進行替換,如圖一。本文選擇的分類器是人眼雙目檢測分類器。
圖一
關於face_cascade.detectMultiScale
CascadeClassifier::detectMultiScale
對不同大小的輸入影象進行物體識別,並返回一個識別到的物體的矩陣列表。
C++:void CascadeClassifier::detectMultiScale(constMat& image, vector<Rect>& objects,doublescaleFactor=1.1,int minNeighbors=3, int flags=0,Size minSize=Size(), Size maxSize=Size())
引數 |
· image – 需要檢測的 CV_8U 輸入矩陣。 · objects – 輸出vector載體容器用於儲存被識別的物體矩陣。 · scaleFactor – 指定每張圖片的縮小比例的引數。 · minNeighbors – 指定每個候選矩陣至少包含的鄰近元素個數。 · flags – 與舊版級聯分類器模型函式cvHaarDetectObjects的flags相同. 此引數不被用於新版模型。 · minSize – 最小可能的物件的大小,小於的物件將被忽略。 · maxSize – 最大可能的物件的大小,大於的物件將被忽略。 |
該函式必須對灰度影象進行處理,關於灰度轉換函式和直方圖灰度化函式,可以在網上找到大量資料,這裡就不詳細介紹了。
最終的實際檢測結果如圖二。
圖二