一.人臉檢測算法原理 Viola-Jones人臉檢測方法
參考文獻:Paul Viola, Michael J. Jones. Robust Real-Time Face Detection[J]. International Journal of Computer Vision,2004,57(2):137-154.
該算法的主要貢獻有三:
1.提出積分圖像(integral image),從而可以快速計算Haar-like特征。
2.利用Adaboost學習算法進行特征選擇和分類器訓練,把弱分類器組合成強分類器。
3.采用分類器級聯提高效率。
二.OpenCV檢測原理 OpenCV中有檢測人臉的函數(該函數還可以檢測一些其他物體), 甚至還包含一些預先訓練好的物體識別文件。
所以利用這些現成的東西就可以很快做出一個人臉檢測的程序。
主要步驟為:
1.加載分類器。
用cvLoad函數讀入xml格式的文件。文件在OpenCV安裝目錄下的“data/haarcascades/”路徑下。
http://blog.csdn.net/yang_xian521/article/details/6973667推薦使用haarcascade_frontalface_atl.xml和haarcascade_frontalface_atl2.xml
2.讀入待檢測圖像。讀入圖片或者視頻。
3.檢測人臉。
下面介紹利用opencv自帶的分類器進行人臉檢測的步驟:
一.人臉的Haar特征分類器是什麼
二.在哪找人臉的Haar特征分類器
三.怎麼用人臉的Haar特征分類器
四.人臉識別示例代碼
五.人臉識別程序運行結果
一.人臉的Haar特征分類器是什麼
人臉的Haar特征分類器就是一個XML文件,該文件中會描述人臉的Haar特征值。當然Haar特征的用途可不止可以用來描述人臉這一種,用來描述眼睛,嘴唇或是其它物體也是可以的。
二.在哪找人臉的Haar特征分類器
OpenCV有已經自帶了人臉的Haar特征分類器。OpenCV安裝目錄中的data haarcascades目錄下的haarcascade_frontalface_alt.xml與haarcascade_frontalface_alt2.xml都是用來檢測人臉的Haar分類器。這個haarcascades目錄下還有人的全身,眼睛,嘴唇的Haar分類器。讀者可以仿照本方的例子來試驗下效果看看。
三.怎麼用人臉的Haar特征分類器
使用人臉的Haar特征分類器非常之簡單,直接使用cvHaarDetectObjects。下面來看看這個函數的介紹:
函數功能:檢測圖像中的目錄
函數原型:
CVAPI(CvSeq*)cvHaarDetectObjects(
constCvArr*image,
CvHaarClassifierCascade*cascade,
CvMemStorage*storage,
doublescale_factorCV_DEFAULT(1.1),
intmin_neighborsCV_DEFAULT(3),
intflagsCV_DEFAULT(0),
CvSizemin_sizeCV_DEFAULT(cvSize(0,0)),
CvSizemax_sizeCV_DEFAULT(cvSize(0,0))
);
函數說明:
CvArr* image是一個灰度圖像,如果設置了ROI,將只處理這個區域。 CvHaarClassifierCascade* cascade是前面讀入的分類器特征級聯,可以用cvLoad()函數來從磁盤中加載xml文件作為Haar特征分類器。。 CvMemStorage* storage 是這個算法的工作緩存。 scale_factor :算法用不同尺寸的窗口進行掃描,scale_factor是每兩個不同大小的窗口之間的尺寸關系,默認為1.1即每次搜索窗口依次擴大10%。 min_neighbors 控制誤檢測,因為人臉會被不同位置大小的窗口重複檢測到,至少有這麼多次檢測,我們才認為真的檢測到了人臉。 flags有四個可用的數值,它們可以用位或操作結合使用。默認值是CV_HAAR_DO_CANNY_PRUNING,告訴分類器跳過平滑區域。 min_size 指示尋找人臉的最小區域。max_size 顯然應該是尋找人臉的最大區域了。
函數返回值:
函數將返回CvSeq對象,該對象包含一系列CvRect表示檢測到的人臉矩形。
#include <opencv2/opencv.hpp>
#include <cstdio>
#include <cstdlib>
#include <Windows.h>
using namespace std;
int main()
{
// 加載Haar特征檢測分類器
// haarcascade_frontalface_alt.xml系OpenCV自帶的分類器 下面是我機器上的文件路徑
const char *pstrCascadeFileName = "D:\opencv\data\haarcascades\haarcascade_frontalface_alt.xml";
CvHaarClassifierCascade *pHaarCascade = NULL;
pHaarCascade = (CvHaarClassifierCascade*)cvLoad(pstrCascadeFileName);
// 載入圖像
const char *pstrImageName = "E:\3.jpg";
IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
IplImage *pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);
// 人臉識別與標記
if (pHaarCascade != NULL)
{
CvScalar FaceCirclecolors[] =
{
{{0, 0, 255}},
{{0, 128, 255}},
{{0, 255, 255}},
{{0, 255, 0}},
{{255, 128, 0}},
{{255, 255, 0}},
{{255, 0, 0}},
{{255, 0, 255}}
};
CvMemStorage *pcvMStorage = cvCreateMemStorage(0);
cvClearMemStorage(pcvMStorage);
// 識別
DWORD dwTimeBegin, dwTimeEnd;
dwTimeBegin = GetTickCount();
CvSeq *pcvSeqFaces = cvHaarDetectObjects(pGrayImage, pHaarCascade, pcvMStorage);
dwTimeEnd = GetTickCount();
printf("人臉個數: %d 識別用時: %d ms
", pcvSeqFaces->total, dwTimeEnd - dwTimeBegin);
// 標記
for(int i = 0; i <pcvSeqFaces->total; i++)
{
CvRect* r = (CvRect*)cvGetSeqElem(pcvSeqFaces, i);
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width * 0.5));
center.y = cvRound((r->y + r->height * 0.5));
radius = cvRound((r->width + r->height) * 0.25);
cvCircle(pSrcImage, center, radius, FaceCirclecolors[i % 8], 2);
}
cvReleaseMemStorage(&pcvMStorage);
}
const char *pstrWindowsTitle = "人臉識別";
cvNamedWindow(pstrWindowsTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsTitle, pSrcImage);
cvWaitKey(0);
cvDestroyWindow(pstrWindowsTitle);
cvReleaseImage(&pSrcImage);
cvReleaseImage(&pGrayImage);
return 0;
}
接著將分類器換做haarcascade_eye_tree_eyeglasses.xml,檢測眼睛
如果需要檢測其他部位,可以到http://wiki.opencv.org.cn/index.php/%e7%89%b9%e5%be%81%e6%a3%80%e6%b5%8b%e4%b8%93%e9%a2%98下載相應的分類器
Adaboost的幾個人臉檢測網站
1基礎學習筆記之opencv(1):opencv中facedetect例子淺析 http://www.cnblogs.com/tornadomeet/archive/2012/03/22/2411318.html 2OpenCV學習筆記(二十七)——基於級聯分類器的目標檢測objdect http://blog.csdn.net/yang_xian521/article/details/6973667 3Haar+Adaboost實現人頭檢測 http://blackhuman.blogcn.com/archives/143 4AdaBoost中利用Haar特征進行人臉識別算法分析與總結1——Haar特征與積分圖 http://blog.csdn.net/weixingstudio/article/details/7631241 5AdaBoost中利用Haar特征進行人臉識別算法分析與總結2——級聯分類器與檢測過程 http://blog.csdn.net/weixingstudio/article/details/7631949 6Cv模式識別 http://www.opencv.org.cn/index.php/Cv%E6%A8%A1%E5%BC%8F%E8%AF%86%E5%88%AB 7OpenCV Haar分類器人臉檢測部分代碼注釋 http://www.haogongju.net/art/1441498
8淺析人臉檢測之Haar分類器方法 http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html
9OpenCV學習筆記(三)人臉檢測的代碼分析 http://blog.csdn.net/Jee44/article/details/3454528
10OpenCV之 HaarTraining算法剖析 http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=4650
11Haar Training之CreateSamples http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=7706
12OpenCV訓練分類器制作xml文檔 http://blog.sina.com.cn/s/blog_617d698f0100xnx9.html
13opencv haartraining 分析一:cvCreateTreeCascadeClassifier http://blog.sina.com.cn/s/blog_75e063c10100z8vt.html
14Opencv中的Adaboost訓練源碼解讀 http://www.opencvchina.com/thread-129-1-1.html
15請研究過cvhaartrainning源碼的大牛幫忙~icvLoadTreeCascadeClassifier是什麼功能http://www.opencv.org.cn/forum/viewtopic.php?f=10&t=15534
16計算haar特征的一個問題,不知大家有沒有注意到 http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=6380
17關於haartraining的一些解析,不全 http://www.opencv.org.cn/forum/viewtopic.php?f=10&t=11129
18opencv haartraining 分析二:每級stage正負樣本的獲取 http://blog.sina.com.cn/s/blog_75e063c10100za53.html
19AdaBoost算法程序介紹說明(一)http://blog.sina.com.cn/s/blog_5f853eb10100s9ez.html
20AdaBoost算法程序介紹說明(二) http://blog.sina.com.cn/s/blog_5f853eb10100sd65.html
21AdaBoost算法程序介紹說明(三) http://blog.sina.com.cn/s/blog_5f853eb10100sdgn.html
22 OpenCV 人臉檢測自學系列 http://blog.csdn.net/naruto0001/article/details/8029193 (相當不錯哦)
23基於opencv2.0的haar算法以人臉識別為例的訓練分類器xml的方法 http://hi.baidu.com/ccb163163/item/22ba182edcc6fac00e37f9dd
24AdaBoost人臉檢測訓練算法 (上)http://blog.csdn.net/hqw7286/article/details/5556767