天天看點

OpenCV 正面人臉檢測

繼續整理之前做的OpenCV人臉檢測,這次先貼出利用OpenCV自帶的人臉haar特征分類器進行人臉檢測的例子; OpenCV中人臉檢測用的是harr或LBP特征,分類算法用的是adaboost算法,分類器比較耗時,已經做好xml形式,直接調用。一般在haarcascades和lbpcascades檔案夾下。 人臉檢測主要用到的是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/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;

int main()
{
    string xmlPath="/usr/local/Cellar/opencv/3.3.0_3/share/OpenCV/haarcascades/haarcascade_frontalface_default.xml";
    CascadeClassifier ccf;   //建立分類器對象
    Mat img=imread("/Users/shandiangou/Downloads/faces.jpeg");
    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,10); //畫出臉部矩形
    }
    imshow("faces",img);
    waitKey(0);
    return 1;
}
           

(網上随便down的一張人臉圖,侵權删

OpenCV 正面人臉檢測

繼續閱讀