讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 3.3 Viola&Jones人臉檢測算法 >

3.3 Viola&Jones人臉檢測算法

OpenCV是一種採用C/C++編寫的開源計算機視覺庫,它可以很方便地用於圖像處理和分析。OpenCV視覺庫中包含開源的人臉檢測程序,本部分主要使用的是OpenCV中的Viola&Jones人臉檢測算法,該算法可以高效地進行人臉檢測。

3.3.1 Viola&Jones人臉檢測算法的使用

新建Viola&Jones人臉檢測程序,對應的項目名稱為facedet_opencv。該程序需要在Visual Studio平台上安裝OpenCV才能運行,我們測試使用的是Visual Studio 2010和OpenCV2.4.9。讀者首先要確保安裝了這兩個軟件,打開facedet_opencv.sln後,還要進行一些配置修改,具體如下。

· 在項目上單擊鼠標右鍵,選擇「屬性」→「配置屬性」→「VC++目錄」→「包含目錄和庫目錄」進行修改,修改為自己計算機的OpenCV對應的路徑。

· 如果你使用的不是OpenCV2.4.9,則還需要在項目上單擊鼠標右鍵,選擇「屬性」→「配置屬性」→「連接器」→「輸入」→「附加依賴項」進行修改。

此時程序就可以正常運行。

測試圖片在facedet_opencv\facedet_opencv\image文件夾下。

檢測結果在facedet_opencv\facedet_opencv\opencv_result文件夾下。

讀者可根據實際情況,在facedection.cpp中修改測試圖片和檢測結果的存放路徑。

最後運行facedection.cpp,即可使用該算法進行人臉檢測。

3.3.2 Viola&Jones人臉檢測算法的原理

Viola&Jones人臉檢測算法主要基於Viola&Jones檢測器,該檢測器是由Paul Viola和Michael Jones在2001年發表的[9],它可以快速、高效地檢測人臉。

Viola&Jones檢測器主要分為三部分:

(1)使用積分通道快速計算圖像的特徵值。

(2)利用AdaBoost分類器篩選特徵。

(3)將AdaBoost分類器改為級聯的分類器,從而快速丟棄非人臉的特徵。

OpenCV視覺庫中包含了訓練好的臉部級聯分類器,我們使用的是:

haarcascade_frontalface_alt.xml

下面我們結合一些主要代碼對該算法進行分析。

Code6中的主函數facedection.cpp的功能就是加載級聯分類器、讀入圖片,然後調用detectAndDraw函數進行人臉檢測和在圖片上標記對應的人臉檢測框。

Code7的detectAndDraw函數是實現Viola&Jones人臉檢測的主要過程,首先對圖片進行預處理;然後調用CascadeClassifier的detectMultiScale方法[10],即可得到最終的人臉檢測框;最後在圖片上標記人臉檢測框。Code6和Code7均來自OpenCV官方網站。

Code6:facedection.cpp

Code7:detectAndDraw函數

Viola&Jones圖像預處理的步驟如下。

預處理1:將圖片按一定比例縮小。

預處理2:detectMultiScale方法需要CV_8U矩陣數據作為輸入,首先要將圖片轉換為灰度圖像。

預處理3:使用直方圖均衡化進行處理,使級聯分類器分析起來更方便。

方法detectMultiScale的一些主要參數的分析如下。

· Mat矩陣image——傳入的圖片,格式是CV_8U。

· 向量objects——檢測到的所有檢測框的位置。

· scaleFactor——每張圖片縮放的比例。

· minNeighbors——每個候選檢測框應該至少有的鄰近元素個數。

· SizeminSize、SizemaxSize限定目標檢測框的範圍,即Size(30,30)。

3.3.3 Viola&Jones人臉檢測算法的檢測結果

經過大量的測試發現,Viola&Jones人臉檢測算法能夠很好地檢測正臉,即使檢測大尺寸圖片,它也可以在短時間內得到很好的檢測效果,但是它不能很好地檢測非正臉的圖片,如圖3-4的(a)、(b)、(e),這類圖片Viola&Jones都檢測不到。在圖3-7中,我們呈現了一些有代表性的圖片的檢測結果。

圖3-7 Viola&Jones人臉檢測算法的檢測結果