1. 程式人生 > >基於qt和opencv3人臉檢測

基於qt和opencv3人臉檢測

第一步:opencv裡面人臉檢測的方法

在opencv中,人臉檢測用的是harr或LBP特徵,分類演算法用的是adaboost演算法。這種演算法需要提前訓練大量的圖片,非常耗時,因此opencv已經訓練好了,把訓練結果存放在一些xml檔案裡面。

上圖中資料夾的名字“haarcascades”、“hogcascades”和“lbpcascades”分別表示通過“haar”、“hog”和“lbp”三種不同的特徵而訓練出的分類器:即各資料夾裡的檔案。"haar"特徵主要用於人臉檢測,“hog”特徵主要用於行人檢測,“lbp”特徵主要用於人臉識別。開啟“haarcascades”資料夾,如下圖所示

圖中的XML檔案即是我們人臉檢測所需要的分類器檔案。在實際使用中,推薦使用上圖中被標記的“haarcascade_frontalface_alt2.xml”分類器檔案,準確率和速度都比較好。

第二步:用的類與函式

人臉檢測主要用到的是CascadeClassifier這個類,以及該類下的detectMultiScale函式。

函式原型是:

void CascadeClassifier::detectMultiScale(InputArray image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3
, int flags=0, Size minSize=Size(), Size maxSize=Size())

總共有7個引數,分別是

第一個引數image:  要檢測的圖片,一般為灰度圖

第二個引數objects:  Rect型的容器,存放所有檢測出的人臉,每個人臉是一個矩形

第三個引數scaleFactor:  縮放因子,對圖片進行縮放,預設為1.1

第四個引數minNeighbors: 最小鄰居數,預設為3

第五個引數flags:  相容老版本的一個引數,在3.0版本中沒用處。預設為0

第六個引數minSize: 最小尺寸,檢測出的人臉最小尺寸

第七個引數maxSize: 最大尺寸,檢測出的人臉最大尺寸

第三步:程式
#include<opencv2/objdetect/objdetect.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    string xmlPath="/home/xyl/opencv/data/haarcascades/haarcascade_frontalface_alt2.xml";
    CascadeClassifier ccf;   //建立分類器物件
    Mat img=imread("1.jpg");
    if(!ccf.load(xmlPath))   //載入訓練檔案
    {
        cout<<"不能載入指定的xml檔案"<<endl;
        return 0;
    }
    vector<Rect> faces;  //建立一個容器儲存檢測出來的臉
    Mat gray;
    cvtColor(img,gray,CV_BGR2GRAY); //轉換成灰度圖,因為harr特徵從灰度圖中提取
    equalizeHist(gray,gray);  //直方圖均衡行
    ccf.detectMultiScale(gray,faces,1.1,3,0,Size(10,10),Size(100,100)); //檢測人臉
    for(vector<Rect>::const_iterator iter=faces.begin();iter!=faces.end();iter++)
    {
        rectangle(img,*iter,Scalar(0,0,255),2,8); //畫出臉部矩形
    }
    imshow("faces",img);
    waitKey(0);
    return 1;
}
第四步:執行程式,出現的效果