在opencv中,人臉檢測用的是harr或LBP特征,分類算法用的是adaboost算法。這種算法需要提前訓練大量的圖片,非常耗時,因此opencv已經訓練好了,把訓練結果存放在一些xml文件里面。在opencv3.0版本中,訓練好的文件放在 \build\etc\文件夾下,有兩個文件夾haarcascades和lbpcascades,前者存放的是harr特征訓練出來的文件,后者存放的是lbp特征訓練出來的文件。
人臉檢測主要用到的是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 "stdafx.h" #include "opencv2\opencv.hpp" #include <iostream> using namespace std; using namespace cv; int main() { string xmlPath="F:\\opencv3\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml"; CascadeClassifier ccf; //創建分類器對象 Mat img=imread("d:/friends.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; }
總結:
使用起來非常簡單,只是精度不怎么樣。畢竟這些算法早已經過時,現在是深度學習的天下了。