Haar-like特徵最早是由Papageorgiou等應用於人臉表示,在2001年,Viola和Jones兩位大牛發表了經典的《Rapid Object Detection using a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》,在AdaBoost演算法的基礎上,使用Haar-like小波特徵和積分圖方法進行人臉檢測,他倆不是最早使用提出小波特徵的,但是他們設計了針對人臉檢測更有效的特徵,並對AdaBoost訓練出的強分類器進行級聯。這可以說是人臉檢測史上裡程碑式的一筆了,也因此當時提出的這個演算法被稱爲Viola-Jones檢測器。又過了一段時間,Rainer Lienhart和Jochen Maydt兩位大牛將這個檢測器進行了擴充套件,最終形成了OpenCV現在的Haar分類器。
理解Haar-like特徵
理解積分圖的計算演算法
理解使用積分圖來計算Haar特徵值演算法
理解Haar特徵歸一化演算法
學會使用OpenCV自帶的Haar分類器進行人臉檢測
Haar(哈爾)特徵分爲三類:邊緣特徵、線性特徵、中心特徵和對角線特徵,組合成特徵模板。特徵模板內有白色和黑色兩種矩形,並定義該模板的特徵值爲白色矩形畫素和減去黑色矩形畫素和。Haar特徵值反映了影象的灰度變化情況。例如:臉部的一些特徵能由矩形特徵簡單的描述,如:眼睛要比臉頰顏色要深,鼻樑兩側比鼻樑顏色要深,嘴巴比周圍顏色要深等。但矩形特徵只對一些簡單的圖形結構,如邊緣、線段較敏感,所以只能描述特定走向(水平、垂直、對角)的結構。
對於圖中的A, B和D這類特徵,特徵數值計算公式爲:v=Σ白-Σ黑,而對於C來說,計算公式如下:v=Σ白-2*Σ黑;之所以將黑色區域畫素和乘以2,是爲了使兩種矩形區域中畫素數目一致。我們希望當把矩形放到人臉區域計算出來的特徵值和放到非人臉區域計算出來的特徵值差別越大越好,這樣就可以用來區分人臉和非人臉。
通過改變特徵模板的大小和位置,可在影象子視窗中窮舉出大量的特徵。上圖的特徵模板稱爲「特徵原型」;特徵原型在影象子視窗中擴充套件(平移伸縮)得到的特徵稱爲「矩形特徵」;矩形特徵的值稱爲「特徵值」。
上圖中兩個矩形特徵,表示出人臉的某些特徵。比如中間一幅表示眼睛區域的顏色比臉頰區域的顏色深,右邊一幅表示鼻樑兩側比鼻樑的顏色要深。同樣,其他目標,如眼睛等,也可以用一些矩形特徵來表示。使用特徵比單純地使用畫素點具有很大的優越性,並且速度更快。
矩形特徵可位於影象任意位置,大小也可以任意改變,所以矩形特徵值是矩形模版類別、矩形位置和矩形大小這三個因素的函數。故類別、大小和位置的變化,使得很小的檢測視窗含有非常多的矩形特徵,如:在24*24畫素大小的檢測視窗內矩形特徵數量可以達到16萬個。這樣就有兩個問題需要解決了:
(1)如何快速計算那麼多的特徵?---積分圖大顯神通;
(2)哪些矩形特徵纔是對分類器分類最有效的?---如通過AdaBoost演算法來訓練。
積分圖就是隻遍歷一次影象就可以求出影象中所有區域畫素和的快速演算法,大大的提高了影象特徵值計算的效率。
積分圖主要的思想是將影象從起點開始到各個點所形成的矩形區域畫素之和作爲一個數組的元素儲存在記憶體中,當要計算某個區域的畫素和時可以直接索引陣列的元素,不用重新計算這個區域的畫素和,從而加快了計算(這有個相應的稱呼,叫做動態規劃演算法)。積分圖能夠在多種尺度下,使用相同的時間(常數時間)來計算不同的特徵,因此大大提高了檢測速度。
積分圖是一種能夠描述全域性資訊的矩陣表示方法。積分圖的構造方式是:位置(