OpenCV的人臉追蹤算法Camshift(連續自適應的Meanshift算法)由以下四個步驟組成:
1、創建一個顏色直方圖表示人臉特徵;
2、對視頻圖像中每一幀的每一個像素進行計算“人臉存在的可能性”;
3、在每個視頻幀中移動人臉矩形框的位置;
4、計算人臉的大小和角度。
下面是每一步驟的詳細工作:
一、創建一個表示人臉的Camshift直方圖,它是以顏色值的直方圖(或柱狀圖)來進行跟蹤。圖1是由裝有OpenCV的Camshift的demo程序運行得到的兩個直方圖實例。每一個顏色條的高度表明瞭在一幅圖像中有多少個像素點屬於色度值。色度在HSV(色度、飽和度、值)顏色模型中用於描述一個像素的顏色。
圖1 Camshift算法用於描述人臉的顏色直方圖
頂部的直方圖代表了一幅圖像區域,藍色的色調是最常見的,稍微薰衣草色調是下一個最常見的。底部直方圖中最右邊的值表示最常見的色度範圍,這個色度經常但不總是紅色。
二、計算人臉概率
在初始跟蹤時計算人臉概率的直方圖只創建一次,在視頻接下來的每一幀的處理中,該直方圖被用於將人臉概率值分配給幀的每一個像素點。
“人臉概率”聽起來非常複雜,計算也複雜,而實際上並非如此。現在我們給出它是如何工作的。圖2表明直方圖顏色條的疊加。很明顯在該圖像區域中疊加後最右邊的顏色條大約佔45%的像素。這意味着一個像素的隨機選擇落在最右邊容器裏的概率是45%,那是這一像素的“人臉概率”。同樣的邏輯表明,下一個直方圖容器所代表的人臉概率在20%左右,因爲它大約佔了總高度的20%。
當新的視頻幀到達時,每一個像素點的色度值被檢測,通過人臉直方圖給該像素點賦人臉概率值。這個過程在OpenCV中被稱爲“直方圖背景投影”。目前在OpenCV中有一個內置方法實現了它,那就是cvCalcBackProject()函數。
圖3表示在通過Camshift算法跟蹤我的臉時計算一個視頻幀圖像中可能存在人臉的圖像。黑色像素概率值最低,白色像素概率最高,灰色的像素介於兩者之間。
三、在每個視頻幀中移動人臉矩形框的位置
Camshift“改變”它的人臉位置判斷,在可能存在人臉的圖像中始終保持集中在高亮像素區域。它通過原先位置並計算一個矩形框中的人臉概率值來得出新位置,OpenCV中cvCamShift函數的功能是增強這些步驟來轉變到一個新的位置。
這種和地球引力中心相一致的轉換矩形的過程是基於Mean shift算法實現的,Mean shift算法由Comaniciu Dorin提出。事實上,Camshift算法就是“連續自適應的Mean shift算法”。
四、計算人臉大小和角度
Camshift算法被稱爲“持續自適應”,而不僅僅是“Mean shift(均值漂移)”,是因爲它在每次計算人臉存在的矩形框的下一個位置時能夠自動調整大小和角度。它選擇的縮放值和初始方向是最符合face-probability的在新的矩形框位置的像素點。