OpenCV用于人脸检测
from: http://www.rs-online.com/designspark/electronics/knowledge-item/content-862
一個人的臉部特征可以傳達很多信息,如性別,大致年齡,性別以及情感等,因此,在過去三十多年的時間里有大量學者熱衷于對人臉檢測與人臉識別的研究。
人臉檢測(Face Detection)是指在輸入圖像中確定所有人臉(如果存在) 的位置、大小和位姿的過程。人臉檢測作為人臉信息處理中的一項關鍵技術,近年來已成為模式識別與計算機視覺領域內一項受到普遍重視,研究十分活躍的課題。人臉識別或辨認、人臉定位以及人臉追蹤等都與人臉檢測密切相關。
人臉定位的目的是確定圖像中人臉的位置。假設一幅圖像中只存在一張臉,則面部特征檢測的目的是檢測特征的存在和位置,如眼睛、鼻子(鼻孔) (眉毛) (嘴) (嘴唇)耳朵等。人臉識別或辨認是將輸入圖像與數(shù)據(jù)庫中的圖像比對,如果存在,報告匹配結果。人臉識別的目的是檢驗輸入圖像中的個體的身份,而人臉追蹤方法是實時地、連續(xù)地估計在圖像序列中的人臉的位置和可能的方向。面部表情識別涉及識別人類的情感狀態(tài)(高興、悲傷、厭惡等) 。很明顯,在任何解決上述問題的自動識別系統(tǒng)中,人臉檢測是第一步。
人臉檢測應用
人臉檢測可用于生物特征識別,通常做為人臉識別系統(tǒng)的一部分。人臉檢測也可以用于視頻監(jiān)聽、人機交互和圖像數(shù)據(jù)庫管理。一些最新的數(shù)碼相機使用人臉檢測來自動對焦。人臉檢測也獲得了市場的興趣。電視機上可以集成攝像頭來檢測任何走過的人臉,然后計算該用戶的種族、性別和年齡范圍。一旦獲得這些信息,可以針對性的播放廣告。
人臉檢測也可以用于節(jié)約能源。人們看電視或電腦的時候往往會做其他工作,這時候普通的顯示器不能自動降低亮度來節(jié)省能源。智能系統(tǒng)可以識別用戶的面部朝向,當用戶不看屏幕時,可以自動降低亮度;在用戶重新看屏幕時,再增加亮度。
隨著近些年來國際形勢的變化,特別是 9.11 事件之后,各國對自身重要設施的安保性能越發(fā)重視,也積極研發(fā)了一些自動人臉識別系統(tǒng)并投入實用。比如,美國 Identix 公司的 FaceIt系統(tǒng),該系統(tǒng)基于局部特征分析(LFA),能在不同的光照,膚色,姿態(tài),表情情況下得到良好的檢測性能。我國的生物特征認證與安全技術研究中心(CBSR)則在 2004 年成功研制出了基于人臉、指紋、虹膜三種識別方法的快速通關系統(tǒng)(MRTD),取得了國際先進的整體性能。
人臉檢測主要難點
人臉的自動檢測是一類具有很大挑戰(zhàn)性的問題,其主要難點在于:
(1)人臉是一類高度非剛性的目標,存在相貌,表情,膚色等差異;
(2)人臉上可能會存在一些附屬物,諸如,眼鏡,胡須等;
(3)人臉的姿態(tài)變化萬千,并且可能存在遮擋物;
(4)待檢測圖像性質的差異。比如:待檢圖像的分辨率;攝錄器材的質量等;
(5)光源的種類和角度。不同種類和角度的光源會對待檢測的人臉產(chǎn)生不同性質的反射和不同區(qū)域的陰影。
人臉檢測算法實現(xiàn)
到2000年為止,已經(jīng)出現(xiàn)非常多的技術應用于檢測人臉,但是都存在處理速度太慢或可靠性低的問題。直到2001年Viola和Jones提出了基于Haar特征的級聯(lián)分類器用于對象檢測,并于2002年由Lienhart和Maydt經(jīng)過改進,狀況才得到改變。這種對象檢測器即快速又可靠,并且可以直接在OpenCV中使用這種分類器。還有一種是基于LBP特征的級聯(lián)分類器,速度比Haar分類器快好幾倍。Haar分類器的訓練是獨立于人臉檢測過程的。分類器的訓練分為兩個階段:?
A.?創(chuàng)建樣本,用OpenCV自帶的creatsamples.exe完成。?
B.?訓練分類器,生成xml文件,由OpenCV自帶的haartraining.exe完成。
OpenCV中的這兩種分類器都已經(jīng)是訓練好的,可以直接使用。檢測流程如下:
?
Viola-Jones人臉檢測算法的主要貢獻:
1. 提出積分圖像(integral image),從而可以快速計算Haar-like特征。
Haar-like型特征是Viola等人提出的一種簡單矩形特征,因為類似Haar小波而得名。Haar型特征的定義是黑色矩形和白色矩形在圖像子窗口中對應的區(qū)域的權重灰度級總和之差。算子數(shù)量龐大時上述計算量顯得太大,Viola等人發(fā)明了積分圖方法,使得計算速度大大加快。
2. 利用Adaboost學習算法進行特征選擇和分類器訓練,把弱分類器組合成強分類器。
在離散Adaboost算法中,Haar-like特征算子計算結果減去某閾值,便可視為一個人臉檢測器。因為其準確率不高,稱為弱分類器。Adaboost算法的循環(huán)中,首先利用各種弱分類器對訓練圖片庫進行分類,準確度最高的弱分類器保留下來,同時提高判斷錯誤的圖片的權重,進入下一循環(huán)。最終將每次循環(huán)所保留的弱分類器組合起來,成為一個準確的人臉檢測器,稱為強分類器。
3. 采用分類器級聯(lián)提高效率。
瀑布型級聯(lián)檢測器是針對人臉檢測速度問題提出的一種檢測結構。瀑布的每一層是一個由adaboost算法訓練得到的強分類器。設置每層的閾值,是的大多數(shù)人臉能夠通過,在此基礎上盡量拋棄反例。位置越靠后的層越復雜,具有越強的分類能力。?這樣的檢測器結構就想一系列篩孔大小遞減的篩子,每一步都能篩除一些前面篩子樓下的反例,最終通過所有篩子的樣本被接受為人臉。
OpenCV人臉檢測原理
人臉檢測屬于目標檢測(object detection) 的一部分,主要涉及兩個方面:
OpenCV中Haar分類器的路徑:
haarcascades目錄下還有人的全身,眼睛,嘴唇,側臉,鼻子,上半身等的Haar分類器。
那么我們該如何利用呢?可以參見這篇博文——【OpenCV入門指南】第十三篇 人臉檢測:http://blog.csdn.net/morewindows/article/details/8426318。
這篇博文寫的非常詳細。以下摘錄一些主要內容。
使用人臉的Haar特征分類器非常之簡單,直接使用cvHaarDetectObjects。下面來看看這個函數(shù)的介紹。
函數(shù)功能:檢測圖像中的目錄
函數(shù)原型:
CVAPI(CvSeq*) cvHaarDetectObjects(
? const CvArr* image,
? CvHaarClassifierCascade* cascade,
? CvMemStorage* storage,
? double scale_factor CV_DEFAULT(1.1),
? int min_neighbors CV_DEFAULT(3),
? int flags CV_DEFAULT(0),
? CvSize min_size CV_DEFAULT(cvSize(0,0)),
? CvSize max_size CV_DEFAULT(cvSize(0,0))
);
函數(shù)說明:
第一個參數(shù)表示輸入圖像,盡量使用灰度圖以加快檢測速度。
第二個參數(shù)表示Haar特征分類器,可以用cvLoad()函數(shù)來從磁盤中加載xml文件作為Haar特征分類器。
第三個參數(shù)為CvMemStorage類型,大家應該很熟悉這個CvMemStorage類型了,《OpenCV入門指南》中很多文章都介紹過了。
第四個參數(shù)表示在前后兩次相繼的掃描中,搜索窗口的比例系數(shù)。默認為1.1即每次搜索窗口依次擴大10%
第五個參數(shù)表示構成檢測目標的相鄰矩形的最小個數(shù)(默認為3個)。如果組成檢測目標的小矩形的個數(shù)和小于 min_neighbors - 1 都會被排除。如果min_neighbors 為 0, 則函數(shù)不做任何操作就返回所有的被檢候選矩形框,這種設定值一般用在用戶自定義對檢測結果的組合程序上。
第六個參數(shù)要么使用默認值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果設置為CV_HAAR_DO_CANNY_PRUNING,那么函數(shù)將會使用Canny邊緣檢測來排除邊緣過多或過少的區(qū)域,因此這些區(qū)域通常不會是人臉所在區(qū)域。
第七個,第八個參數(shù)表示檢測窗口的最小值和最大值,一般設置為默認即可。
函數(shù)返回值:
函數(shù)將返回CvSeq對象,該對象包含一系列CvRect表示檢測到的人臉矩形。
這是該博文的其中一個運行結果:
如果你對OpenCV有所了解,可以到上面提出的博文頁面參考具體的原代碼。
總結
以上是生活随笔為你收集整理的OpenCV用于人脸检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用OpenCV进行人脸关键点检测
- 下一篇: 视频处理的知识_开源项目_项目列表