摘要:基于OpenCV對實時動態(tài)手勢檢測進行了研究,將背景差分與運動膚色相結合,選擇對HSV顏色空間的運動膚色信息進行標記,修改了運動膚色的亮度值,從而排除了靜止人臉的干擾,并通過形態(tài)學處理,獲得了預期的動態(tài)手勢檢測效果。
關鍵詞:OpenCV;攝像頭;實時;膚色;背景差分;直方圖;動態(tài)手勢檢測
中圖分類號:TP391.41
文獻標識碼:A
DOI:10.3969/j.issn.1003-6970.2015.06.021
本文著錄格式:江超,基于OpenCV的實時動態(tài)手勢檢測研究[J].軟件,2015,36(6):114-119
ResearchontheReal-timeDynamicGestureDetectionBasedonOpenCV
JIANGChao
[Abstract]:Thispaperanalyzesthereal-timedynamicgesturedetectionbasedontheOpenCV.Withthecombinationofbackgroundsubtractionandthedynamicskincolor,theinformationofthedynamicskincoloroftheHSVcolorspaceismarkedanditsbrightnessismodified.Asaresult,thedisturbingofthestaticfaceiseliminated.Moreover,withthemorphologicalprocessing,theexpecteddynamicgesturedetectionisrealized.
[Keywords]:OpenCV;Camera;Real-time;Skincolor;Backgroundsubtraction;Histogram;Dynamicgesturedetection
0引言
現(xiàn)今人T智能機器人技術快速發(fā)展[1],人們迫切的希望人機交互方式能像人與人那樣通過聲音或手勢傳遞信息和指令,以使得機器人更加智能化,因而動態(tài)手勢識別成為了當下研究的一個熱點方向。
動態(tài)手勢識別是一個動靜結合的過程,包含了動態(tài)圖像軌跡移動的識別和動態(tài)圖像輪廓的識別,而這些都是以動態(tài)手勢檢測的結果作為識別基礎的,動態(tài)手勢檢測的好壞直接影響著動態(tài)手勢識別的好壞。本文的工作是進行動態(tài)手勢檢測的研究,為動態(tài)手勢識別提供更好的檢測數(shù)據(jù)。
動態(tài)手勢檢測是能夠在動態(tài)的圖像中檢測到目標物體的移動[2],并能捕捉到運動物體在動態(tài)圖像中的位置。目前動態(tài)手勢檢測最容易想到的算法是背景差分,但是由于光照等外部條件造成的背景圖像的不確定的變化使得運動檢測會隨時間增長產(chǎn)生的誤差越來越大,但是運動手勢的另一明顯特征是膚色,本文將目標的運動信息和顏色信息結合進行動態(tài)手勢檢測,并對顏色直方圖進行標記,進一步排除了人臉的干擾,獲得了較好的檢測效果。
10penCV簡介
OpenCV是Intel開源的計算機視覺庫(opensourcecomputervisionlibrary)的簡稱,它是由一些C函數(shù)和少量的C++函數(shù)構成,實現(xiàn)了在圖像處理以及計算機視覺方面的許多通用算法,主要對圖像進行如運動檢測,跟蹤,分割,識別以及3D重建等高級處理。它有300多個C函數(shù)的跨平臺的中、高層API,它不依賴外部庫,但可以使用外部庫。由于它是開放源碼且代碼簡潔高效,其中大多數(shù)函數(shù)都經(jīng)過匯編最優(yōu)化,所以能充分利用英特爾系列的芯片的設計體系,因而對于英特爾系列芯片,OpenCV的代碼執(zhí)行效率是非常高的。OpenCV具有強大的圖像和矩陣運算能力和這方面的用戶接口,同時支持windows和Linux系統(tǒng)。本文研究內(nèi)容所涉及的相關程序是在OpenCV+VS2008搭建的環(huán)境下編譯運行的。
2實時視頻圖像的采集
實時圖像采集系統(tǒng)的任務就是采集實時視頻圖像[3],硬件部分可以用圖像采集卡或者USB攝像頭,軟件部分的視頻圖像捕捉技術主要有VFM和DirectShow兩種。相比DirectShow方式,VFM方式使用簡單方便,但是可控性差,并且VFM技術是基于消息機制的,相對于DirectShow方式速度較慢,而DirectShow技術是一套底層應用程序的編程接口,可以說是直接與硬件打交道,通過圖像采集測試,發(fā)現(xiàn)VFM采集方式的fps只有9-12左右,而使用DirectShow方式采集能使fps提升到60幀/s。雖然OpenCV中能很好的支持VFM方式,提供了從攝像頭獲取圖像信息的函數(shù)cvCaptureFromCAM,但為了能夠在實時的視頻中流暢地檢測目標,本文采取DiretShow方式。通過安裝DiretShow的開發(fā)包,調(diào)用CcameraDS對象的OpenCamera、CloseCamera、QueryFrame方法可通過攝像頭進行打開、關閉、實時獲取一幀圖像的操作。
此外,由于像信息會隨時受到變化的光照強度、周圍環(huán)境和外部設備的影響,同時在采集和處理過程中常伴有各種噪聲與畸交,使采集到的圖像偏離了本身原有的色彩或產(chǎn)生噪點,從而影響圖片的質(zhì)量,導致運動手勢檢測的效果不佳,因此,有必要對剛采集的每一幀實時圖像進行光照補償[4]以及去噪濾波[5-6]。
3實時動態(tài)手勢檢測的算法原理
3.1基于背景差分的運動檢測
本文研究的內(nèi)容實現(xiàn)環(huán)境為從固定的攝像頭采集實時視頻圖像,因而本文實驗所處的環(huán)境中的背景基本是不動的,由于背景差分的運動特征提取計算量不大,能很好的滿足實時性要求,因而本文在運動目標檢測的算法基于背景差分。背景差分是將當前幀與背景差分,從而分割運動的物體。假設d(x,y)表示背景差分后的圖像,f(x,y)表示當前幀的圖像,b(x,y)表示背景圖像,那么背景差分的基本原理可用式(1)表示。在OpenCV中可以用cvAbsDiff函數(shù)來進行背景差分。
difference(x,y)=frame(x,y)-background(x,y)
(1)
在背景差分中,位于運動手勢區(qū)域的像素點的差分值比較大,而由于光照等外部條件影響的背景區(qū)域的部分像素點差分值也會有比較大數(shù)值,從而在差分圖像中形成一些噪聲點或者干擾區(qū)域,但是大部分的沒有受到干擾背景區(qū)域的像素點會得到比較小的差分值。對于三通道RGB圖像,通過背景差分將運動目標從背景圖像中分割出來,可將差分后的目標轉換成單通道的灰度圖,然后通過閾值法分割目標,將8位RGB圖像轉換成8位灰度模式圖像如公式(2)。
Gray=(R*30+G*59+B*11)\100
(2)
閾值法分割運動目標是通過比較像素與一個合適的閾值的大小關系,來確定圖像的每個像素是目標像素還是背景像素,最后得到一個二值化的圖像,完成目標分割。圖像的二值化如公式(3)。OpenCV中可用cvThreshold函數(shù)進行二值化。
合理地選擇最佳閾值[7]是必要的,考慮到差分值比較大的像素點大部分應屬于手勢運動區(qū)域,那么最佳閾值應該處于偏小的差分值的區(qū)間,本文通過統(tǒng)計不同閾值下像素的明顯變化來找到最佳閾值。先設定一個最小閾值為1,然后每次增加2的間隔增加到51,并統(tǒng)計每個閾值下的像素個數(shù),發(fā)現(xiàn)閾值在17以后像素統(tǒng)計量下降很快,且在17左有時像素統(tǒng)計值變化不是很大,于是義從最小閾值開始每隔l的間隔增加到20,發(fā)現(xiàn)閾值為10左右時像素統(tǒng)計量基本不變,在10之前像素統(tǒng)計量是隨閾值增加緩慢減小的,而超過10后一點,像素統(tǒng)計統(tǒng)計量義開始快速減小,于是確定最佳閾值為10。
3.2基于目標信息標記的顏色直方圖運動檢測
3.2.1顏色空間
顏色空間有多鐘模型,常用的有RGB、YCbCr、HSV等。
RGB顏色空間是基于白然界中三種基色光的}昆合原理,將Red、Green、Blue三種基色按照從0(黑色)到255(白色)的亮度值在三個顏色通道中分配,從而確定其色彩,于是當不同的亮度值的基色}昆合,就會產(chǎn)生出256*256*256中顏色,大概為1670W種顏色,用幾何學來表示是基于笛卡爾坐標系統(tǒng)的立方體,三個軸分別為R、G、B,原點對應為黑色,離原點最遠的頂點為純白色,立方體內(nèi)各個不同的點都是256*256*256種顏色中的一種,可以用從原點到該點的矢量表示,每一副彩色圖像都可以分解到立方體中三個獨立的基色平面上。
YCbCr顏色空間廣泛應用在數(shù)字視頻中,Y分量表示亮度信息,Cb分量和Cr分量分別表示藍色色差和紅色色差,由于Y分量的亮度信息與Cb和Cr兩個色差分量的顏色信息分開,使得該顏色空間在Cb和Cr分量所組成的空間平面上具有更好的顏色聚類性,尤其是膚色聚類性。YcbCr與RGB顏色空間的轉換如公式4和5。
HSV顏色空間是基于畫家的配色方法。HSV顏色空間對應于圓柱坐標系中的一個圓錐形子集,網(wǎng)錐的軸對應了V,代表亮度,取值在0-100%之間,H對應了繞V軸旋轉的度數(shù),代表色調(diào),大小在0-360度之間,S對應了繞V軸旋轉的半徑,代表飽和度,表示色彩的明暗,取值也在0-100%之間。在圓錐的頂點(即原點)處,V=O,H和S都無定義,代表黑色。網(wǎng)錐頂面的中心處S=O,V=l,H無定義,代表白色,從該點到原點的連線即V軸代表亮度逐漸灰暗的等級,在該軸上的點S=O,H無定義,它對應于RGB顏色空間中的主對角線。在圓錐頂面的圓周的上顏色,V=l,S=l,表示為純色。從RGB顏色空間的轉換到HSV顏色空間如公式6。
3.2.2手勢顏色特征提取
顏色特征有多種如顏色直方圖、顏色集、顏色矩、顏色聚合向量以及顏色相關圖等。其中顏色直方圖能描述不同的顏色值在整個圖像中所占的比例,而并不關心每個顏色在圖像中所處的位置。任何一副圖像都能給出一副與它對應的直方圖,但是不同的兩幅圖像可能有一副完全相同的顏色直方圖分布,因而顏色直方圖邗圖像是一對多的關系。一般圖像中的前景色和背景色的分布明顯不同,在其顏色直方圖上就會出現(xiàn)雙峰的特性。一幅灰度圖像的顏色直方圖的數(shù)學表達如公式(7)。
H(K)=nA(K=0,1,…,L-1)
(7)
其中,K表示像素值個第K個bin格,L表示最大
像素值將像素的取值范圍平均分成L個等份,8位圖像的像素值最大值為255,nK表示整幅圖像所有像素中,像素值在第K個bin的像素值區(qū)間中的像素的個數(shù)。
在實際中一般都要將直方圖歸一化,因為由于圖像如果很大的話,那么該圖像中在其直方圖的某一個區(qū)間中的統(tǒng)計值很可能非常大,因此有必要將直方圖進行歸一化。歸一化就是將所有直方塊的值加起來,然后將每個直方塊都除以這個和,最后將每個直方塊的值都乘以一個歸一化因子,從而調(diào)整每個直方塊為歸一化后的值,這樣直方塊的值就會變成我們需要的值,而不會太大。OpenCV中可以用CvHistogram表示顏色直方圖變量,用cvCalcHist來計算圖像的直方圖,用cvNormalizeHist進行直方圖的歸一化。
本文在動態(tài)手勢檢測前,先提取手勢膚色的顏色直方圖信息,該直方圖的直方塊數(shù)據(jù)在人體膚色有關的區(qū)間有比較大的值,而在非人體膚色的區(qū)間有比較小的值,那么用該直方圖數(shù)據(jù)計算每幀反投影圖像,人體膚色的像素點則在反投影圖像中就會有比較大的數(shù)值。
由于HSV顏色空間對光線的敏感程度較小[8],因而本文采集顏色直方圖數(shù)據(jù)時選擇HSV顏色空間。為提高直方圖數(shù)據(jù)精度,將HSV空間直方圖劃分為40*40*50的等級。
3.2.3基于手勢顏色特征的反投影圖
圖像的反投影圖像[9]是是直方圖數(shù)據(jù)的反映,即用輸入圖像的每個二維位置上的像素值(灰度或者多維)對應到該像素在直方圖上對應的bin格上的值來替代該像素的值,因而圖像的反投影圖像都是單通道的。用統(tǒng)計學來表述就是輸出圖像像素點的值是對應觀測數(shù)組在某個分布(直方圖)下的概率,如公式(8)。
其中b(xi)是圖像在位置x.上的像素對應到直方圖的第b(xi)個bin格,m表示直方圖被平均分成m個bin格,qu表示直方圖的第u個bin格直方塊的值。在OpenCV中可以用cvCalcBackProject函數(shù)來獲得圖像的反投影圖像。
3.2.4排除人臉干擾
由于提取的顏色直方圖是膚色相關的,因此背景圖像的人臉會對運動手勢檢測形成干擾,然而人臉和手勢的最大區(qū)別是運動特征,因此,對符合條件的像素值進行標記,以使其不同于人臉的像素點。由于HSV空間中將光線敏感的亮度信息單獨用V表示,選擇修改V值可以很好的保留顏色信息,且對運動膚色特征進行標記。
本文中將HSV空間中符合條件的像素點的亮度V調(diào)整為比較小的值。調(diào)整為比較小的值是因為人臉膚色的亮度和運動的手勢亮度值正常情況下應該是亮度比較大的,將運動手勢區(qū)域的亮度值V修改為較小的數(shù)值可以很好的減小類膚色人臉的干擾。那么在采集顏色直方圖時,采集區(qū)域內(nèi)的所有像素點都應該符合條件,應該對所有像素點的V值進行修改,而在每幀圖像中只有的運動膚色的像素點才符合條件,應該只對這些像素點進行V值的修改,這樣直方圖數(shù)據(jù)在運動膚色方面就可以對應了。具體的修改做法如公式(9)。
滿足式(9)的像素點必須先是運動的像素點,因而需要滿足背景差分后的經(jīng)過二值化的閾值大于10的條件。式(9)中通過判斷r/g的比例來修改V值,這是因為大多數(shù)黃種人膚色偏黃色,而純黃色可以用純紅色與純綠色按1:1的比例搭配得到,因而對應的像素點在RGB圖像中其紅色分量一定大于綠色分量即r>g,本實驗采用的是30萬的攝像頭,采集的視頻圖像效果難免有失真,在室內(nèi)環(huán)境內(nèi)經(jīng)過多次調(diào)試,發(fā)現(xiàn)其采集的人體膚色像素中的紅色和綠色比例大概在1.0-2.0之間。因而式中將滿足運動且為膚色的條件的像素點的V值修改為lO*(r/g),而非膚色的值修改為最大值255。
在經(jīng)過V值修改后,將采集的HSV空間的手勢顏色直方圖對處理后的當前幀圖像做反投影,就可以得到一個具有動態(tài)膚色信息的灰度圖像。在采集直方圖時,經(jīng)過試驗確定歸一化因子為1000。HSV顏色直方圖中統(tǒng)計的是手勢膚色的顏色信息,其中也不排除采集時也有少量非手勢膚色信息被采集,但是不妨礙直方圖中只有滿足是膚色的柱狀塊有比較大的數(shù)值,少量非膚色和V=255的柱狀塊的值有比較小的數(shù)值,其余非膚色的柱狀塊的值基本上都為0,因而這里得到的灰度圖像的像素點中基本上只有是符合運動膚色的像素點才有數(shù)值,大部分非運動膚色的像素點的灰度值都應該為0,所以這里對運動膚色進行閾值法分割時,選擇的閾值很小,本文選擇閾值為從1每隔1增加到10統(tǒng)計的像素個數(shù)基本變化不大,于是就選擇閾值為5,進行二值化運動目標分割。
3.3進一步處理
由于背景差分的運動檢測只能檢測出運動的像素,而基于顏色直方圖的運動檢測可以檢測出運動膚色的像素,這其中也會有采集手勢膚色直方圖中有少量的非手勢膚色也被采集到手勢HSV直方圖中,且V值為255的像素點也會形成干擾,本文將背景差分的運動檢測與基于顏色直方圖的運動檢測結合起來,將兩種方式得到的運動檢測結果相與,取它們的共有的像素,這樣減少了干擾,這可能也會排除掉本來是運動膚色的像素,但是對于實時準確的檢測出運動手勢提供了穩(wěn)定性。OpenCV中可以用cvAnd實現(xiàn)上述操作。
上述動態(tài)手勢檢測的算法雖然可快速準確的檢測出移動的手勢,但不能形象的檢測出手型,如產(chǎn)生細絲狀或出現(xiàn)空洞等,因此有必要對檢測結果進行進一步的形態(tài)學處理。
3.3.1形態(tài)學處理
形態(tài)學源于對植物和動物的形態(tài)研究,而數(shù)學形態(tài)學[10](MathematicalMorphology)是將形態(tài)學應用于圖像處理中用于表達圖像中的有用的區(qū)域形狀。它的基本做法是用特定形態(tài)的結構元素度量并提取圖像的特定的形狀用以達到圖像分析與識別目的。在圖像形態(tài)學處理[11]時,通常是將4連通的3*3領域或8連通的3*3領域的結構元素在圖像中以單位結構元素移動,然后做類似卷積形態(tài)學基本運算。圖像的連通性是指像素的領域是由某種結構構成,那么該像素與其領域的像素就是連通的。在OpenCV的函數(shù)庫中可用cvMorphologyEx函數(shù)進行圖像形態(tài)學的操作。
最基本的四個形態(tài)學算法[12]是:膨脹、腐蝕、開運算以及比運算。膨脹的作用是使物體的邊界擴張,若在圖像中的兩個區(qū)域相距較近,那么經(jīng)過膨脹運算后,兩個區(qū)域就有成為連通域。腐蝕是膨脹的反過程,在數(shù)學形態(tài)學中腐蝕的作用是消除物體邊界,若兩個物體之間有細小的連通,那么選擇合適的結構元素,經(jīng)過腐蝕運算后,就會使兩個連通的物體變得不連通。腐蝕可以消除圖像中細小而孤立的噪聲點。開運算是對目標圖像先做腐蝕運算,再做膨脹運算。它可以消除圖像中孤立的小點、小刺,也可以平滑較大物體的邊界而基本不改變物體像素個數(shù)。它的作用與腐蝕的作用類似,但與腐蝕相比,它可以基本保持目標原有面積不變的優(yōu)點。閉運算時對目標圖像先做膨脹運算再做腐蝕運算。它可以平滑圖像輪廓、填平小孑L、修補細小裂縫,填補后使圖像的填補結果義一定的幾何特征,它還可以抹掉凸圖像內(nèi)部的尖角部分而總的位置與形狀都不變。閉運算的結果常常是目標比源圖像增加一些像素。
本文對上述動態(tài)手勢檢測的結果進行一次開運算以進一步消除噪聲,然后經(jīng)過5次閉運算擴大運動目標,以使最終檢測的動態(tài)手勢平滑且具有形態(tài)化。
3.3.2背景更新
由于真實場景的中的背景也在隨著時間也在不斷的變化,即使在攝像頭固定的情況下,背景也會有光線等外部條件產(chǎn)生微小變化,這樣若在每幀圖像與背景做差分時,選取的背景圖像還是初始背景時,會由于使用的背景圖像不能反映當前幀的背景的真實情況,從而產(chǎn)生誤差,這個誤差會隨著時間而不斷積累,最終不能有效地實時檢測出運動目標。因此有必要對背景圖像進行背景更新,從而能及時反映當前幀的背景。背景更新的如公式(10)
其中ut表示t時刻背景圖像對應像素點,ut+l表示t+l時刻經(jīng)過背景更新后背景圖像對應的像素點,It表示t時刻即當前幀圖像的像素點,If表示t時刻圖像對應像素點的掩碼值即是否做背景更新,a∈[0,1]表示背景更新的速度,一般取0.8到1.0之間的值,本文取值為0.8。在OpenCV中可以用cvAddWeighted函數(shù)做背景更新操作。
由于在攝像頭打開時是需要一定的時間的,在這段時間里攝像頭采集的實時視頻圖像數(shù)據(jù)也有可能受少許硬件初始化的影響,并且此時在攝像頭前的人基本是在等待攝像頭的開啟,是處于靜止狀態(tài)的,因而這期間采集的實時視頻圖像數(shù)據(jù)的綜合數(shù)據(jù)應該就是本實驗環(huán)境的背景圖像。所以本文將攝像頭采集的前20幀實時視頻圖像連續(xù)做背景更新,從而得到初始的背景圖像Bo。然后在每幀圖像中只對被檢測出來的運動手勢遮住的部分進行更新。
4實驗結果與分析
4.1基于背景差分的運動檢測實驗
從下圖1可以看出在連續(xù)的幾幀中,有大面積的運動的手勢被檢測出來,而人體微小的運動也被檢測出來。
4.2基于目標信息標記的顏色直方圖運動檢測實驗
從上圖2可以看出在連續(xù)的幾幀中,經(jīng)過人為標記的運動手勢能有效的被檢測出來,而沒有經(jīng)過標記的人臉部分,基本沒有被檢測出來。
4.3進一步處理
如上圖3,在經(jīng)過背景差分和人為標定直方圖相結合的運動檢測后,經(jīng)過圖像形態(tài)學處理能得到比較完整的運動手勢二值圖像。
5結束語
本文通過對動態(tài)手勢檢測的研究,提出了將背景差分和基于目標信息顏色直方圖的動態(tài)手勢檢測相結合的算法,獲得了預期的動態(tài)手勢檢測效果,對今后進行動態(tài)手勢識別的研究打下了堅實的基礎。
參考文獻
[1]楊帆,劉詠梅.基于視覺與語義信息的圖像聯(lián)合相似性度量方法研究[J].新型工業(yè)化,2012,2(1):52-58.
[2]張燦龍,敬忠良.基于辨識性穩(wěn)定區(qū)的視頻跟蹤[J].新型工業(yè)化,2012,2(5):55-64.
[3]吉亞泰.基于DSP的圖像采集與處理系統(tǒng)的研究與設計[J].軟件,2013,34(2):22-25.
[4]RafaelC,GonzalezRichadE.Woods.數(shù)字圖像處理(第二版)[M].阮秋琦,阮寧智譯.北京:電子工業(yè)出版社,2003.
[5]羅軍輝,馮平,哈力旦A等.Matlab7.0在圖像處理中的應用[M].北京:機械工業(yè)出版社,2005.
[6]陳蒙.醫(yī)學X光成像中圖像去噪算法研究[J].軟件,2013,34(11):62-63.
[7]陳松.人臉檢測和識別[D].西安:西安電子科技大學,2007,4:43-45.
[8]蔡林沁,鄭雪松,王牛.基于HSV顏色空間正交立體視覺目標檢測[J].新型工業(yè)化,2013,3(1):79-88.
[9]羅強.移動目標的跟蹤技術研究[D].武漢:武漢理T大學,2009.
[10]謝鳳英,趙丹培.VisualC++數(shù)字圖像處理[M].北京:電了工業(yè)出版社,2008,9.
[11]鐘彩.邊緣檢測算法在圖像預處理中的應用[J].軟件,2013,34(1):158-159.
[12]岡薩雷斯.數(shù)字圖像處理(第三版)[M].北京:電子工業(yè)出版社,2011.