全文轉載自CSDN的博客(不知道怎麼將CSDN的博客轉到博客園,應該沒這功能吧,因此直接複製全文了),轉載地址以下ide
http://blog.csdn.net/lsq2902101015/article/details/47057081函數
本篇文章主要介紹瞭如何使用OpenCV實現人臉檢測。本文不具體講解人臉檢測的原理,直接使用OpenCV實現。優化
OpenCV版本:2.4.10;VS開發版本:VS2012。ui
1、OpenCV人臉檢測spa
要實現人臉識別功能,首先要進行人臉檢測,判斷出圖片中人臉的位置,才能進行下一步的操做。.net
一、OpenCV人臉檢測的方法code
在OpenCV中主要使用了兩種特徵(即兩種方法)進行人臉檢測,Haar特徵和LBP特徵。視頻
在OpenCV中,使用已經訓練好的XML格式的分類器進行人臉檢測。在OpenCV的安裝目錄下的sources文件夾裏的data文件夾裏能夠看到下圖所示的內容:xml
上圖中文件夾的名字「haarcascades」、「hogcascades」和「lbpcascades」分別表示經過「haar」、「hog」和「lbp」三種不一樣的特徵而訓練出的分類器:即各文件夾裏的文件。"haar"特徵主要用於人臉檢測,「hog」特徵主要用於行人檢測,「lbp」特徵主要用於人臉識別。打開「haarcascades」文件夾,以下圖所示對象
圖中的XML文件便是咱們人臉檢測所須要的分類器文件。在實際使用中,推薦使用上圖中被標記的「haarcascade_frontalface_alt2.xml」分類器文件,準確率和速度都比較好。
二、OpenCV中的人臉檢測的類
在OpenCV中,使用類「CascadeClassifier」進行人臉檢測
CascadeClassifier faceCascade; //實例化對象
所須要使用的函數:
faceCascade.load("../data/haarcascade_frontalface_alt2"); //加載分類器 faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); //多尺寸檢測人臉
實現人臉檢測主要依賴於detectMultiScale()函數,下面簡單說一下函數參數的含義,先看函數原型:
各參數含義:
2、代碼實現
一、檢測圖片中的人臉
//頭文件 #include<opencv2/objdetect/objdetect.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; //人臉檢測的類 CascadeClassifier faceCascade; int main() { faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加載分類器,注意文件路徑 Mat img = imread("../data/PrettyGirl.jpg"); Mat imgGray; vector<Rect> faces; if(img.empty()) { return 1; } if(img.channels() ==3) { cvtColor(img, imgGray, CV_RGB2GRAY); } else { imgGray = img; } faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); //檢測人臉 if(faces.size()>0) { for(int i =0; i<faces.size(); i++) { rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8); //框出人臉位置 } } imshow("FacesOfPrettyGirl", img); waitKey(0); return 0; }
結果以下圖:
二、檢測視頻中的人臉
//頭文件 #include<opencv2/objdetect/objdetect.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; //人臉檢測的類 CascadeClassifier faceCascade; int main() { faceCascade.load("../data/haarcascade_frontalface_alt2.xml"); //加載分類器,注意文件路徑 VideoCapture cap; cap.open(0); //打開攝像頭 //cap.open("../data/test.avi"); //打開視頻 Mat img, imgGray; vector<Rect> faces; int c = 0; if(!cap.isOpened()) { return 1; } while(c!=27) { cap>>img; if(img.channels() ==3) { cvtColor(img, imgGray, CV_RGB2GRAY); } else { imgGray = img; } faceCascade.detectMultiScale(imgGray, faces, 1.2, 6, 0, Size(0, 0)); //檢測人臉 if(faces.size()>0) { for(int i =0; i<faces.size(); i++) { rectangle(img, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), Scalar(0, 255, 0), 1, 8); //框出人臉位置 } } imshow("Camera", img); c = waitKey(1); } return 0; }
在視頻實時檢測時,可能會出現卡頓,是由於檢測人臉花費了過多的時間,這裏代碼只實現基本功能,並未優化。