1. 程式人生 > >基於opencv和QT的人臉(人眼)檢測程式

基於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 – 最大可能的物件的大小,大於的物件將被忽略。

該函式必須對灰度影象進行處理,關於灰度轉換函式和直方圖灰度化函式,可以在網上找到大量資料,這裡就不詳細介紹了。

最終的實際檢測結果如圖二。

圖二