OpenCV學習筆記(10):人臉檢測
1. 前言
OpenCV實現人臉檢測主要是採用了adaboost分類演算法,這種演算法是屬於機器學習範疇,需要使用海量圖片進行訓練,得到一個分類檔案,然後根據該檔案中的引數進行人臉檢測。由於訓練過程比較複雜,我們在此不再累述,直接使用官方釋出的XML檔案即可。
OpenCV的Windows版Release包中提供了兩類分類檔案,位於路徑 opencv/build/etc/下,其中haarcascades資料夾對應基於haar特徵的分類器,lbpcascades資料夾對應基於lbp特徵的分類器。
2. CascadeClassifier類
CascadeClassifier類是一個用於做目標檢測的類,其實不止是人臉檢測,OpenCV還提供了眼睛、微笑、銀器、光碟等物體的識別,區別僅在於載入了不同的XML檔案,理論上,只要分類檔案足夠給力,待測目標都能夠按分類被檢測,而人臉只是其中常見應用之一。
CascadeClassifier類的構成十分簡單,只有十幾個成員函式,而真正用於檢測的,只有detectMultiScale函式,該函式有3個過載,我們通常使用最簡單的一個
void cv::CascadeClassifier::detectMultiScale (
InputArray image,
std::vector<Rect>& objects,
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0 ,
Size minSize = Size(),
Size maxSize = Size()
)
其中——
InputArray image
輸入待檢測的影象,可以是色圖,也可以是灰度圖,其實內部會進行灰度化處理
std::vector<Rect>& objects
輸出檢測結果,有可能有多個,所以輸出是一個vector泛型
double scaleFactor = 1.1
影象縮放係數,這個採用預設值即可
int minNeighbors = 3
最小鄰近矩陣大小,這樣也採用預設值即可
int flags = 0
相容早期檢測演算法的標記,預設值0表示不使用早期版本,如果使用的是OpenCV3.0之前的版本,建議使用1
Size minSize = Size()
Size maxSize = Size()
所檢測目標的最小和最大尺寸,這個需要根據自己的實際情況進行調整
3. 一個簡單的人臉檢測程式
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(){
Mat src = imread("test.png", IMREAD_COLOR);
CascadeClassifier ccf;
vector<Rect> faceBox;
if (!ccf.load("haarcascade_frontalface_default.xml")){
cerr << "ERROR:Load XML file failed!" << endl;
}
ccf.detectMultiScale(src, faceBox, 1.1, 3, 0, Size(30, 30), Size(200, 200));
for (vector<Rect>::const_iterator iter = faceBox.begin(); iter != faceBox.end(); iter++){
rectangle(src, *iter, Scalar(0, 255, 255), 3, 0);
}
imshow("face", src);
waitKey(0);
return 0;
}
結果
4. 總結
OpenCV採用的人臉檢測演算法比較早期,無論檢測精度還是運算速度,都已經過時。人臉檢測演算法目前做的已經相當成熟,很多開源API都能達到較好的效能,如Face++。而商業級人臉檢測演算法結合專用的硬體產品更是能達到驚人的效果,比如最新的iPhone X的FaceID,相當強悍。