熊玉虎,李燈熬,趙菊敏
(太原理工大學(xué)信息工程學(xué)院,山西 太原 030024)
隨著計算機、數(shù)字圖像處理等技術(shù)的發(fā)展以及人類社會的不斷進步,計算機視覺已經(jīng)進入了社會生活的各個方面。人臉檢測和跟蹤是人臉識別、圖形控制、虛擬游戲和視頻檢索中的關(guān)鍵技術(shù),其在安全驗證系統(tǒng)、智能監(jiān)控、視頻會議、人機交互系統(tǒng)、電腦游戲制作、醫(yī)學(xué)、檔案管理等方面有著巨大的應(yīng)用前景和市場潛力,并且人臉檢測和跟蹤的不斷改進和創(chuàng)新正逐漸成為模式識別和人工智能的研究熱點[1-2]。
人臉跟蹤的好壞影響著人臉識別、口型分析、表情分析等后續(xù)處理的研究,本文針對傳統(tǒng)CAMSHIFT人臉跟蹤算法中存在的缺陷,引入亮度和飽和度信息以及運動預(yù)測估計信息,對傳統(tǒng)算法進行改進,提高人臉跟蹤的實時性和穩(wěn)健性。同時,鑒于移動通信的快速發(fā)展,本文在Android系統(tǒng)平臺下,利用JNI(Java Native Interface)和Android NDK(Native Development Kit),編譯實現(xiàn)人臉跟蹤應(yīng)用程序。
CAMSHIFT(Continuously Adaptive Mean Shift)算法是英特爾公司Microcomputer Research Lab的Bradski在1998年提出的,是由Mean Shift算法發(fā)展而來的。CAMSHIFT算法是一種基于顏色概率分布的非參數(shù)迭代技術(shù)連續(xù)自適應(yīng)算法,它利用目標(biāo)的顏色直方圖模型對目標(biāo)進行跟蹤,具有較好的實時性和穩(wěn)健性,其基本思想是:以視頻序列圖像的顏色概率直方圖為基礎(chǔ),對各幀圖像做Mean Shift運算以查找出運動目標(biāo),然后將上一幀得到的結(jié)果作為下一幀的模板,自適應(yīng)調(diào)整搜索窗口的位置和大小,并對當(dāng)前幀進行Mean Shift運算,定位出當(dāng)前圖像中目標(biāo)的中心位置,以此迭代下去,就可以實現(xiàn)對運動目標(biāo)的跟蹤[3]。
圖1所示為CAMSHIFT算法跟蹤流程,該算法需要先將RGB顏色空間轉(zhuǎn)化為HSV顏色空間(H表示色度,S表示飽和度,V表示亮度),再在HSV空間中提取H分量,并利用H分量的直方圖建立顏色概率模型,然后以此概率模型為特征模板進行Mean Shift運算,實現(xiàn)對運動目標(biāo)的跟蹤。
利用CAMSHIFT算法進行人臉跟蹤的具體步驟為:
1)初始化搜索窗口的大小和位置。
2)把輸入的幀圖像轉(zhuǎn)換為HSV色彩模型,通過式(1)提取H分量,利用式(2)計算人臉區(qū)域的H分量顏色直方圖,并將此顏色直方圖作為待跟蹤人臉的特征模板,此特征模板將用于后續(xù)每幀圖像中的人臉跟蹤。
圖1 CAMSHIFT算法跟蹤流程
3)利用人臉的特征模板對當(dāng)前幀圖像進行反向投影,通過式(3)計算獲得當(dāng)前幀圖像的反向投影圖I(x,y),即像素點(x,y)的像素值在H分量直方圖中的概率值,如圖2所示。
圖2 反向投影
4)通過Mean Shift算法計算跟蹤人臉新的質(zhì)心位置
人臉是一個橢圓模型,比較適合的跟蹤搜索窗口應(yīng)該是橢圓形,因此人臉跟蹤系統(tǒng)中通過式(5)求得人臉橢圓區(qū)域的長軸l、短軸w以及長軸的方向角θ
5)利用計算出來的人臉區(qū)域的位置和大小信息,初始化下一搜索窗,對下一幀圖像進行Mean Shift人臉跟蹤,返回步驟3)。
傳統(tǒng)CAMSHIFT算法在實際應(yīng)用中存在以下問題[5]:
1)在跟蹤開始時需要手動初始化搜索窗,這樣不僅降低了算法的效率,而且也引入了主觀誤差。
2)在簡單背景環(huán)境中,CAMSHIFT算法可以取得較好的跟蹤效果;但是在復(fù)雜背景環(huán)境中,尤其是存在大面積相似背景顏色干擾時,跟蹤效果會受到較大影響。
3)缺乏對跟蹤目標(biāo)的運動預(yù)測估計,當(dāng)在跟蹤過程中目標(biāo)被遮擋時,會造成跟蹤失敗。
4)CAMSHIFT計算直方圖的方法沒有濾除干擾的能力,HSV色彩空間中僅僅依靠H分量不能完全區(qū)分與人臉色度相近的信息,當(dāng)飽和度S過低,亮度V過低或過高時,H分量容易受到噪聲的干擾,影響跟蹤的效果。
由于CAMSHIFT算法需要手動選取初始化搜索窗,且沒有對物體進行學(xué)習(xí)的能力。因此,本文采用較成熟的基于Adaboost算法的人臉檢測器快速獲取人臉的位置和大小信息,并將其傳遞給CAMSHIFT算法,從而實現(xiàn)人臉跟蹤初始搜索窗的自動選取。
在人臉跟蹤過程中,由于光照和陰影等的影響,飽和度S和亮度V有所不同,會對色度H產(chǎn)生干擾,使H分量包含的信息無法完全區(qū)分和人臉相近的區(qū)域。因此,文中通過式(6)加入S分量信息和V分量信息,由H分量作為主要顏色特征,S分量和V分量作為次要顏色特征建立顏色模型,以濾除H分量中的噪聲信息。
圖3所示為融合H,S,V分量后的人臉跟蹤過程,具體步驟如下:
圖3 融合H、S、V分量的人臉跟蹤過程
1)分別計算H,S,V分量的顏色直方圖。
2)通過直方圖反向投影來獲取當(dāng)前幀的概率分布圖Ih,Is,Iv。
3)利用式(7)計算總的概率分布圖Ic
式中:α表示H分量對顏色信息的貢獻,β和γ表示S和V分量對顏色信息的貢獻,且α+β+γ=1,α∈[0.5,1],β,γ∈[0,0.5]。
在人臉跟蹤過程中,為了防止目標(biāo)丟失,本文中對CAMSHIFT算法輸出的質(zhì)心坐標(biāo)進行估計預(yù)測,用得到的預(yù)測信息更新下一幀的搜索窗口,以提高跟蹤的可靠性與有效性。
考慮運算效率,本文采用簡單運動預(yù)測估計。假設(shè)運動目標(biāo)在短時間內(nèi)勻速運動,從第i幀的目標(biāo)中心點( xi,yi)到第i+1幀的目標(biāo)中心點 ( xi+1,yi+1)在水平和垂直方向上的位移分別為Δxi和Δyi,則有
此外,人臉橢圓區(qū)域的長軸為l、短軸為w,設(shè)置閾值Δl、Δw,使跟蹤窗口的大小保持在(l-Δl<L<l+Δl,w-Δw<W <w+Δw)范圍之內(nèi)。當(dāng)跟蹤窗口大小超過這個范圍時,就表示其受到背景噪聲的干擾,然后強制把搜索窗口的大小約束到這個范圍之內(nèi)。
在Windows 7系統(tǒng)下,利用 VC++2010和OpenCV2.4.2搭建軟件平臺對改進CAMSHIFT人臉跟蹤算法進行實驗驗證。圖4所示為改進算法在角度變化、紙張和類膚色干擾等不同條件下的跟蹤效果,與圖5傳統(tǒng)CAMSHIFT跟蹤對比可以看出,改進算法提高了人臉跟蹤的有效性和可靠性。此外,引入飽和度和亮度信息后,能有效地將與人臉色度信息相近的噪聲干擾濾除掉,增強跟蹤的穩(wěn)健性,如圖6所示。
Android應(yīng)用程序開發(fā)環(huán)境的搭建參見文獻[7],但本文采用官方提供的版本android-ndk-r8-windows。從r7開始,在Windows環(huán)境下不需要下載Cygwin來模擬Linux環(huán)境,Windows版本的NDK提供了一個ndk-build.cmd腳本,只要為Eclipse Android工程添加一個Builder,就可以直接利用這個腳本實現(xiàn)Eclipse自動編譯NDK。此外,本文采用官方提供的 OpenCV-2.4.2-android-sdk,OpenCV函數(shù)庫已被打包成備用的Android Library Project,將其導(dǎo)入到Eclipse工作空間就可在項目中引用OpenCV庫函數(shù)[8-9]。
Android應(yīng)用程序的開發(fā)以Java為編程語言,Android NDK允許開發(fā)者使用C/C++作為編程語言來為Android開發(fā)應(yīng)用程序;JNI是一套雙向的接口,允許Java與本地代碼間的互操作。因此,本文利用JNI編寫本地C/C++代碼,并采用Android NDK進行編譯,這樣可以讓Java程序與本地代碼分別運行在不同的進程中,一個進程的崩潰不會立即影響另一個進程[9-10]。
新建Android工程項目Facetracting,再在項目中添加OpenCV函數(shù)庫OpenCV-2.4.2,然后可以開始編寫應(yīng)用程序。如圖7所示,利用JNI和Android NKD開發(fā)應(yīng)用程序的過程如下。
圖7 利用NDK和JNI開發(fā)應(yīng)用程序的實現(xiàn)過程
1)利用Android應(yīng)用程序框架編寫Java端代碼。
首先在AndroidManifest.xml文件中對使用的Activity和Camera App進行聲明;再在項目包com.myDemo.facetracting中新建Java源文件FaceViewBase.java和Face-View.java,在FaceViewBase類中設(shè)置camera的使用和對幀圖像數(shù)據(jù)的處理,F(xiàn)aceView繼承于FaceViewBase,在FaceView類中聲明人臉跟蹤操作的native方法,要使用native方法就要通過System.loadLibrary()方法對動態(tài)庫進行加載;最后在項目包中新建2個Activity:MainActivity和FaceActivity,通過Intent由MainActivity啟動FaceActivity,在 FaceActivity中通過 setContentView將 FaceActivity顯示的View設(shè)置為FaceView的內(nèi)容。
2)通過JNI編寫本地C/C++代碼,利用Android NDK對其進行編譯,生成Java端可調(diào)用的共享庫。
首先在工程目錄中新建文件夾jni,將由“javah”命令生成的包含native方法的頭文件拷貝在該文件夾中;然后編寫jni_part.cpp文件,在該文件中必須要使用jni.h頭文件,再實現(xiàn)Java端聲明的native方法中的函數(shù);最后編寫腳本文件Android.mk和Application.mk,通過腳本文件才能在NDK編譯后生成供Java端調(diào)用的共享庫。
3)通過Android SDK生成可發(fā)布的Android應(yīng)用程序APK包。
在eclipse中用Android SDK編譯后,就會在bin目錄中生成Facetracting.apk文件,該文件就是可發(fā)布的APK包,將其安裝在使用Android系統(tǒng)的手機上,其運行效果如圖8所示。
圖8 人臉跟蹤在Android手機上的實現(xiàn)過程
本文的算法在傳統(tǒng)CAMSHIFT人臉跟蹤算法中加入亮度、飽和度信息以及運動預(yù)測估計信息,可濾除與人臉色度相近的干擾信息,對跟蹤目標(biāo)搜索窗位置的預(yù)測和調(diào)整,提高了算法對跟蹤的穩(wěn)健性。同時,在Android平臺下,通過OpenCV函數(shù)庫的輔助,利用JNI和NDK進行人臉跟蹤的開發(fā),使視頻的采集和對圖像的處理運行在不同進程中,實現(xiàn)了在Android手機上的人臉跟蹤應(yīng)用。在更加復(fù)雜環(huán)境背景中的人臉跟蹤是今后深入研究的重點,此外,隨著Android系統(tǒng)和移動設(shè)備硬件的發(fā)展,開發(fā)人員可進一步提高人臉跟蹤在Android系統(tǒng)中應(yīng)用的實時效果。
[1]何煒.自適應(yīng)運動目標(biāo)檢測和跟蹤技術(shù)研究[D].昆明:云南大學(xué),2011.
[2]王亮亮,孫即祥.基于人臉檢測和CAMSHIFT算法的人臉跟蹤系統(tǒng)[J]. 微計算機應(yīng)用,2008,29(2):14-17.
[3]吳海江,李一民,潘曉露,等.改進的Camshift跟蹤算法研究[J].微處理機,2011,32(2):35-37.
[4]GARY R.Computer vision face tracking for use in a perceptual user interface[EB/OL].[2012-09-20].http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.14.7673.
[5]鄔大鵬,程衛(wèi)平,于盛林.基于幀間差分和運動估計的Camshift目標(biāo)跟蹤算法[J]. 光電工程,2010,37(1):55-60.
[6]丁志輝,李毅.基于Camshift算法的運動目標(biāo)檢測[J].電腦知識與技術(shù),2009,12(5):10532-10533.
[7]王宏彬,李燈熬,趙菊敏,等.利用OpenCV實現(xiàn)在Android系統(tǒng)下的人臉檢測[J]. 軟件,2011(12):4-7.
[8]OpenCV WiKi[EB/OL].[2012-09-20].http://opencv.willowgarage.com/wiki/Welcome.
[9]Android Guide[EB/OL].[2012-09-20].http://developer.android.com/guide/index.html.
[10]Java Native Interface[EB/OL].[2012-09-20].http://en.wikipedia.org/wiki/Java_Native_Interface.