徐鵬飛 張紅英
(西南科技大學(xué)信息工程學(xué)院 四川綿陽(yáng) 621000)
進(jìn)入計(jì)算機(jī)時(shí)代以來(lái),人機(jī)交互技術(shù)一直相對(duì)單一,傳統(tǒng)的鼠標(biāo)鍵盤(pán)交互方式給人們的生活學(xué)習(xí)帶來(lái)很大局限性,特別是近年來(lái)生活水平不斷提高,傳統(tǒng)交互方式已經(jīng)不能滿(mǎn)足人們各個(gè)方面的需求。隨著計(jì)算機(jī)視覺(jué)技術(shù)的不斷發(fā)展,越來(lái)越多的研究者們通過(guò)手勢(shì)運(yùn)動(dòng)跟蹤以及手指狀態(tài)來(lái)實(shí)現(xiàn)非接觸式的人機(jī)交互[1-2]。
準(zhǔn)確的手勢(shì)分割和指尖檢測(cè)是進(jìn)行手勢(shì)識(shí)別的前提,在動(dòng)態(tài)手勢(shì)識(shí)別中加入多個(gè)指尖的運(yùn)動(dòng)軌跡特征就能夠大量增加手勢(shì)種類(lèi)。如果能夠通過(guò)手指移動(dòng)完成隔空操作,那肯定會(huì)比揮動(dòng)手臂操作有更好的用戶(hù)體驗(yàn)。當(dāng)前手勢(shì)交互的研究主要集中在基于二維彩色圖像的研究上,如:根據(jù)各種顏色空間、人手的紋理結(jié)構(gòu)分析、灰度特征或者運(yùn)動(dòng)特征等來(lái)對(duì)目標(biāo)進(jìn)行檢測(cè)與跟蹤。Rafael Bastos[3]等人利用HSV空間進(jìn)行膚色分割,曹建秋[4]等人利用YCbCr空間進(jìn)行膚色分割。利用不同的顏色空間進(jìn)行膚色分割有不同的效果,一般而言,在光照變化較大的情況下,利用YCbCr空間進(jìn)行膚色分割的效果較好,而在正常的光照條件下,利用RGB空間進(jìn)行膚色分割的效果較好。由于人種膚色差異較大,這一點(diǎn)也限制了利用膚色進(jìn)行圖像分割的應(yīng)用范圍。于洋[5]等人通過(guò)結(jié)合灰度級(jí)直方圖和設(shè)置動(dòng)態(tài)閾值的方法進(jìn)行手勢(shì)識(shí)別和分割,達(dá)到了較好的效果。Schwarz L A[6]等人采用健壯性檢測(cè)解剖標(biāo)志以及約束化逆運(yùn)動(dòng)學(xué),結(jié)合光流法來(lái)檢測(cè)運(yùn)動(dòng)姿勢(shì)。但由于二維圖像無(wú)法獲取物體在三維空間中的距離信息,相關(guān)的算法容易受到周?chē)h(huán)境、光照變化、背景等因素的影響,在目標(biāo)檢測(cè)與跟蹤上魯棒性較差,難以實(shí)現(xiàn)復(fù)雜場(chǎng)景下的任意目標(biāo)檢測(cè)和實(shí)時(shí)跟蹤,應(yīng)用受到很大的限制。
本文通過(guò)引入Kinect攝像機(jī)來(lái)得到場(chǎng)景中的深度信息,有效分離目標(biāo)與背景;使用最大類(lèi)間方差法與固定閾值相結(jié)合的方法,分割出手勢(shì)區(qū)域;利用手部輪廓幾何特征、曲率特征標(biāo)記指尖位置,實(shí)現(xiàn)實(shí)時(shí)的手勢(shì)分割與指尖檢測(cè)。
基于深度圖像的手勢(shì)分割和指尖檢測(cè)系統(tǒng)包含四大部分:深度圖像采集、手勢(shì)分割、指尖檢測(cè)以及檢測(cè)結(jié)果輸出。整個(gè)系統(tǒng)的流程圖如圖1所示。
Kinect是由微軟開(kāi)發(fā)的體感攝像機(jī),最主要功能之一就是能夠產(chǎn)生三維深度數(shù)據(jù)。深度數(shù)據(jù)流所提供的圖像幀的每一個(gè)像素點(diǎn)代表的是在深度感應(yīng)器的視野中,在(x,y)坐標(biāo)處離攝像頭平面最近的物體到該平面的距離(以毫米為單位)。其傳感器傳回的數(shù)據(jù)每像素占2字節(jié)(16位),其中低3位存儲(chǔ)用戶(hù)編號(hào),用于用戶(hù)的識(shí)別。高13位存儲(chǔ)深度值。獲取的圖像中深度值最大為4 096 mm,0值通常表示深度值不能確定,一般應(yīng)該將0值過(guò)濾掉。微軟建議在開(kāi)發(fā)中使用1 220~3 810 mm范圍內(nèi)的值。在進(jìn)行其他深度圖像處理之前,應(yīng)該使用閾值方法過(guò)濾深度數(shù)據(jù)至1 220~3 810 mm這一范圍內(nèi)。
在實(shí)際場(chǎng)景中,各個(gè)物體的深度分布是離散的,故本文采用先從當(dāng)前場(chǎng)景中分割出人體,再?gòu)娜梭w圖像中分割出人手圖像的方法。
圖1 系統(tǒng)總流程圖Fig.1 The total system flowchart
由于Kinect獲取的深度圖像是不穩(wěn)定的,其中存在一些空洞和噪聲,以及物體邊緣的深度值不穩(wěn)定,直接處理會(huì)對(duì)算法的效果造成影響,所以需要進(jìn)行一些濾波和形態(tài)學(xué)操作等,以提高分割和檢測(cè)的準(zhǔn)確性。
1.2.1 圖像濾波
傳統(tǒng)濾波算法有均值濾波、中值濾波、低通濾波等。均值濾波算法比較簡(jiǎn)單、易于實(shí)現(xiàn),但是會(huì)使目標(biāo)邊緣模糊,且對(duì)零值噪聲敏感,影響后續(xù)處理。由于深度圖像中噪聲多為0值點(diǎn),即攝像機(jī)無(wú)法獲取深度值的點(diǎn),中值濾波可以有效去除噪聲點(diǎn),也降低了目標(biāo)邊緣的模糊程度。所以本文采用中值濾波算法進(jìn)行去噪。中值濾波法是一種非線(xiàn)性平滑技術(shù),它的基本原理是通過(guò)使用滑動(dòng)窗口掃描整幅圖像,將窗口內(nèi)所有點(diǎn)的像素值按大小順序排列,找到其中的中位數(shù),將中位數(shù)賦給窗口中心點(diǎn)。本文采用3×3的模板數(shù)組作為中值濾波的窗口,則對(duì)于圖像中任一點(diǎn)(x,y)都有8個(gè)相鄰的點(diǎn),加上點(diǎn)(x,y)共有9個(gè)點(diǎn),當(dāng)這9個(gè)點(diǎn)有奇數(shù)個(gè)灰度值時(shí)選取中間值來(lái)代替點(diǎn)(x,y)的灰度值,而當(dāng)這9個(gè)點(diǎn)有偶數(shù)個(gè)灰度值時(shí)選取兩個(gè)中間值的均值來(lái)代替點(diǎn)(x,y)的灰度值。對(duì)于圖像中4個(gè)邊框的像素點(diǎn)不進(jìn)行處理,保持原來(lái)的灰度值。中值定義如式(1)。
1.2.2 形態(tài)學(xué)處理
形態(tài)學(xué)處理主要包括腐蝕、膨脹、開(kāi)運(yùn)算、閉運(yùn)算等。膨脹是指將圖像與核進(jìn)行卷積,并求其局部最大值的操作。核可以是任何的形狀或大小,它擁有一個(gè)單獨(dú)定義出來(lái)的參考點(diǎn)。核與圖像卷積,即計(jì)算核覆蓋的區(qū)域的像素點(diǎn)最大值,并把這個(gè)最大值賦值給參考點(diǎn)指定的像素,這樣會(huì)使圖像中的高亮區(qū)域逐漸增長(zhǎng)。腐蝕是膨脹的反操作。腐蝕操作是對(duì)圖像的細(xì)化,常應(yīng)用于骨架的提取、噪聲點(diǎn)的去除等;膨脹操作是對(duì)圖像目標(biāo)的擴(kuò)大,應(yīng)用于圖像空洞的填充。開(kāi)運(yùn)算和閉運(yùn)算是腐蝕膨脹的組合操作。在開(kāi)運(yùn)算情況下,我們先對(duì)圖像進(jìn)行腐蝕后進(jìn)行膨脹。開(kāi)運(yùn)算通常可以用來(lái)統(tǒng)計(jì)二值圖像中的區(qū)域數(shù)。在閉運(yùn)算的情況下,我們先對(duì)圖像進(jìn)行膨脹然后進(jìn)行腐蝕。在多數(shù)連通區(qū)域分析算法中,都會(huì)用到閉運(yùn)算來(lái)去除噪聲引起的區(qū)域。
通過(guò)對(duì)Kinect返回的深度數(shù)據(jù)進(jìn)行分析,像素值的高13位保存該點(diǎn)像素的深度值,低3位保存操作者序號(hào)。當(dāng)操作者序號(hào)為000時(shí),表示該像素不屬于操作者。遍歷每一幀圖像的每一個(gè)像素,將像素信息后三位與111相與即可獲取該像素的操作者序號(hào),進(jìn)而過(guò)濾出操作者和背景,只取操作者的像素信息,其余像素信息全部置零。
如圖2所示,經(jīng)過(guò)逐像素判定后可以得到人體的深度圖像。
圖2 獲取操作者深度圖像Fig.2 The depth image of the user
從深度圖像的特性來(lái)看,每個(gè)像素的灰度值能夠反映該點(diǎn)距離攝像頭的遠(yuǎn)近。在得到人體深度圖像后,統(tǒng)計(jì)其灰度分布直方圖。如圖3(a)所示,當(dāng)操作者伸出手操作時(shí),灰度直方圖中較小的峰是手部區(qū)域的灰度分布,較大的峰是人體軀干區(qū)域的灰度分布??梢?jiàn)手掌平面與攝像機(jī)平面平行時(shí),手掌的深度分布較均勻;如圖3(b)所示,當(dāng)人手距離身體較近時(shí),手部區(qū)域灰度值與人體灰度值相差不大;如圖3(c)所示,當(dāng)指尖向前傾斜,人手所在平面與攝像機(jī)平面不平行時(shí),人手區(qū)域的灰度分布范圍較大,所以單純使用最近點(diǎn)灰度值與固定閾值相加的方法來(lái)分割手勢(shì)會(huì)有很大的局限性。
圖3 人體深度分布直方圖Fig.3 The body depth distribution histogram
設(shè)圖像中一共包含L個(gè)灰度級(jí)(0,1,2,……,L-1),灰度值為i的的像素點(diǎn)數(shù)為Ni,由于灰度值為0的點(diǎn)是背景點(diǎn),直接將其排除計(jì)算,圖像中人體部分總的像素點(diǎn)數(shù)為N=N1+N2+…+NL-1。灰度值為i的點(diǎn)的概率為:pi=Ni/N。設(shè)閾值t,將圖像分為軀干A=(1,2,3,…,t)和人手B=(t+1,t+2,t+3,…,L-1)兩個(gè)部分。則兩類(lèi)出現(xiàn)的概率為:
軀干和人手的灰度均值為
灰度圖像的總均值為
由此,可以得到人手區(qū)域和軀干區(qū)域的類(lèi)間方差
類(lèi)間方差越大,兩類(lèi)灰度差別就越大。則使得類(lèi)間方差σ2最大的t即為所求的最佳閾值[7]。
由于后續(xù)工作只需對(duì)人手圖像進(jìn)行操作,而此時(shí)得到的圖像有可能含有部分手臂圖像,因此,再設(shè)置閾值τ,結(jié)合自適應(yīng)閾值得到的t,可以較好的得到手部圖像。
依據(jù)該閾值分割出手部圖像
如圖4所示,該方法能夠得到比較好的分割效果。
圖4 手勢(shì)分割效果Fig.4 The effect of hand gesture segmentation
指尖檢測(cè)算法中,建立三維手指模型的計(jì)算量較大,因此在實(shí)時(shí)系統(tǒng)中應(yīng)用很少?;诙S手指模型的檢測(cè)分為指尖的空間位置檢測(cè)和二維平面位置檢測(cè)。指尖的空間位置檢測(cè)一般需要復(fù)雜的計(jì)算。因此在許多實(shí)時(shí)系統(tǒng)中,主要是檢測(cè)指尖在二維平面上的位置。檢測(cè)指尖二維平面位置的方法可以分為3類(lèi):輪廓分析[8]、模板匹配[9]和直觀(guān)啟發(fā)式方法[10]。
鑒于深度圖像的特征:人離攝像頭較遠(yuǎn),分辨率較低,手部圖像模糊,不適用傳統(tǒng)的模板匹配等方法。本文采取的方案是:首先,計(jì)算獲得圖形質(zhì)心;其次,提取手部輪廓信息;最后,計(jì)算輪廓上各個(gè)點(diǎn)到質(zhì)心的距離,判定指尖。由于指尖為突出部分,所以輪廓各點(diǎn)到掌心距離會(huì)有一個(gè)急劇的先變大再變小過(guò)程,而手腕、手掌邊緣不具有這些特征,通過(guò)合適的閾值設(shè)置即可快速的檢測(cè)出指尖。
指尖檢測(cè)步驟如下:
(1)首先計(jì)算圖像的矩并得到質(zhì)心
Mpq為(p+q)階矩,I(x,y)是被描述的區(qū)域。其0階矩為:
1階矩為:
因此,圖像形狀的質(zhì)心為:
(2)設(shè)P(xi,yi)為輪廓上的點(diǎn),根據(jù)得到的人手圖像進(jìn)行輪廓提取并計(jì)算輪廓上點(diǎn)P(xi,yi)距離質(zhì)心的距離D:
順時(shí)針或者逆時(shí)針遍歷輪廓上所有的點(diǎn),就會(huì)出現(xiàn)5個(gè)較大峰值,分別對(duì)應(yīng)5個(gè)手指。手腕處的距離變化速度明顯小于指尖處。如果只伸出一兩個(gè)手指,那么就只有一兩個(gè)峰值了。
(3)判定指尖:將t個(gè)手部輪廓連續(xù)像素分為一組P={P0,P1,…Pt-1},在各組中尋找距離極大值的點(diǎn)Pmax。然后以此點(diǎn)開(kāi)始按順時(shí)針、逆時(shí)針?lè)较蚋鞒闃右粋€(gè)點(diǎn)(Pmax-5,Pmax+5),如果滿(mǎn)足|Pmax-Pmax-5|>τ且|Pmax-Pmax+5|>τ則認(rèn)定Pmax為指尖,如果不滿(mǎn)足則說(shuō)明此段序列中無(wú)指尖。在認(rèn)定為指尖的Pmax中,計(jì)算任意兩點(diǎn)的距離,距離太近的刪除其中一個(gè),以排除分段點(diǎn)正好位于指尖位置時(shí)出現(xiàn)兩個(gè)都可認(rèn)定為指尖的點(diǎn)。
為驗(yàn)證算法有效性和手指尖提取的準(zhǔn)確性,本文在配置為奔騰雙核主頻為2.80 GHz處理器、內(nèi)存2 GB、win7 32位操作系統(tǒng)的計(jì)算機(jī)上,采用VS2010編譯環(huán)境,利用opencv2.3.1和C++來(lái)進(jìn)行算法設(shè)計(jì)。傳感器為Kinect for XBOX360,深度圖像分辨率為320×240。
如圖5所示,紅點(diǎn)表示手部圖像質(zhì)心,綠點(diǎn)表示指尖。本文算法下可有效檢測(cè)0到5個(gè)指尖。
圖5 不同數(shù)目手指的指尖檢測(cè)情況Fig.5 Fingertip detection of different numbers of fingers
本文方法相對(duì)于其他手勢(shì)分割及指尖檢測(cè)方法最大的提升在于魯棒性。
相對(duì)于使用彩色相機(jī)的方法,由于深度圖像的生成與環(huán)境光照、顏色無(wú)關(guān),而且在手勢(shì)分割中已經(jīng)通過(guò)距離信息將所有背景信息去除,然后只對(duì)分割出的手部圖像進(jìn)行指尖檢測(cè),所以能很好克服環(huán)境光照變化、環(huán)境中有類(lèi)膚色區(qū)域、背景干擾等限制因素。而利用手部輪廓特征,計(jì)算輪廓點(diǎn)與掌心距離判斷指尖的方法也具有尺度變化、旋轉(zhuǎn)不變性,可以對(duì)指尖指向不加限制。
將深度圖像檢測(cè)到的指尖坐標(biāo)映射到彩色圖像上,如圖6所示,圖6(a)為光線(xiàn)較暗的情況,圖6(b)為正常光照的情況,圖6(c)為光照較強(qiáng)的情況,圖6(d)為背景中有類(lèi)膚色區(qū)域和其他人物,圖6(e)為指尖不同指向時(shí)的情況??梢杂^(guān)察到本文算法在各種光照變化、背景干擾、指尖指向不一的情況下仍能夠準(zhǔn)確檢測(cè)到伸出的指尖。
相對(duì)于同樣使用深度圖像信息的方法,如曹雛清[11]等人的分割方法需假設(shè)人手為距離攝像頭最近的物體,而本文算法通過(guò)引入用戶(hù)ID分類(lèi),可以很好克服前景干擾。另外,曹的方法使用固定閾值,在手掌伸出角度較大時(shí),也會(huì)造成手勢(shì)分割不完全或者范圍過(guò)大,本文算法采用自適應(yīng)閾值分割的方法可以解決此問(wèn)題。如圖7所示,當(dāng)操作者之前有其他物體或者手部?jī)A斜較大時(shí),使用曹雛清等人的方法進(jìn)行手勢(shì)分割不能正確得到人手圖像而造成漏檢、誤檢,但是本文方法不受干擾。
圖6 不同實(shí)驗(yàn)條件下的檢測(cè)效果Fig.6 Detection performances of different experimental conditions
圖7 前景干擾及手部?jī)A斜時(shí)的檢測(cè)效果Fig.7 Detection performances of occlusion and hand leaning
從以上實(shí)驗(yàn)中隨機(jī)選取1 800幀圖像(0~5個(gè)手指各300幀),其中包含了不同光照、背景及指尖指向的各種情況,統(tǒng)計(jì)檢測(cè)結(jié)果,得到表1數(shù)據(jù)。檢測(cè)正確定義為:伸出幾個(gè)手指就檢測(cè)到幾個(gè)指尖,多檢、漏檢均為錯(cuò)誤。指尖數(shù)目平均檢測(cè)正確率為97.9%。從結(jié)果可以看出不同手指數(shù)目的總體檢測(cè)正確率較高,在環(huán)境變化的情況下仍能保持較好的魯棒性。
表1 檢測(cè)正確率Table 1 Detection accuracy rate
表2對(duì)比了本文方法與曲率法檢測(cè)指尖的精度(指尖實(shí)際位置為指尖正中間)及消耗時(shí)間。可以看出指尖檢測(cè)精度差別不大,但是本文算法耗時(shí)較短。指尖位置產(chǎn)生誤差的原因?yàn)?某些手勢(shì)下,指尖點(diǎn)并非是距離掌心的最遠(yuǎn)點(diǎn),可能是其旁邊的像素,因而造成數(shù)個(gè)像素的誤差。
表2 實(shí)驗(yàn)誤差與耗時(shí)比較Tab.2 Experimental error and time consumption
通過(guò)以上實(shí)驗(yàn)可見(jiàn),基于深度信息的手勢(shì)分割能夠在各種情形下有效分割出手部圖像,穩(wěn)定快速地進(jìn)行指尖檢測(cè)。但是深度圖像也有其局限性。如圖8所示,左圖為人手在距離攝像頭1.7 m時(shí),右圖為人手在距離攝像頭1.2 m時(shí),結(jié)果表明由于設(shè)備精度問(wèn)題,在1.7 m時(shí)能檢測(cè)出伸出手指的個(gè)數(shù),但是對(duì)于指尖的真實(shí)位置的準(zhǔn)確定位有誤差。
圖8 人手距離攝像頭1.7 m與1.2 m時(shí)的效果Fig.8 Detection performances in the distance of1.7 m and 1.2 m
本文提出了一種基于深度圖像的手勢(shì)分割和指尖檢測(cè)方法,在不使用MSKinect SDK的骨骼數(shù)據(jù)情況下,能夠快速魯棒地達(dá)到預(yù)期效果。相對(duì)于傳統(tǒng)彩色攝像機(jī),基于深度圖像的方法很好地克服了光照、背景、其他人物的干擾,并能在較遠(yuǎn)距離(1.2~1.7 m)內(nèi)保證檢測(cè)效果有效,使手勢(shì)識(shí)別應(yīng)用環(huán)境大大延伸。另外,本方法可以為基于Kinect的人體肢體動(dòng)作識(shí)別、手勢(shì)識(shí)別系統(tǒng)提供指尖的定位和運(yùn)動(dòng)軌跡數(shù)據(jù),以便進(jìn)行靜態(tài)手勢(shì)識(shí)別和手指動(dòng)作動(dòng)態(tài)識(shí)別。
[1]翁漢良,戰(zhàn)蔭偉.基于視覺(jué)的多特征手勢(shì)識(shí)別[J].計(jì)算機(jī)工程與科學(xué),2012,(2):123 -127.
[2]于美娟,馬希榮.基于HMM方法的動(dòng)態(tài)手勢(shì)識(shí)別技術(shù)的改進(jìn)[J].計(jì)算機(jī)科學(xué),2011,(1):251-252.
[3]RAFAEL B,MIGUEL SD.Skin Color Profile Capture for Scale and Rotation Invariant Hand Gesture Recognition[J].Lectures Notes in Computer Science,2009,5085:81 -92.
[4]曹建秋,王華清,藍(lán)章禮.基于改進(jìn)YCrCb顏色空間的膚色分割[J].重慶交通大學(xué)學(xué)報(bào):自然科學(xué)版,2010,(3):488-492.
[5]于洋.基于手形特征的靜態(tài)手勢(shì)識(shí)別[D].河北工業(yè)大學(xué),2007.
[6]SCHWARZ L A,MKHITARYAN A.Estimating Human 3D Pose from Time-of-Flight Images Based on Geodesic Distances and Optical Flow[C].Proceeding on Automatic Face& Gesture Recognition and Workshops(FG 2011),2011 IEEE International Conference,2011.700 -706.
[7]瞿中.基于改進(jìn)的最大類(lèi)間方差算法的圖像分割研究[J].計(jì)算機(jī)科學(xué),2009,(5):276 -278,290.
[8]張登康,郭太良,姚劍敏,等.改進(jìn)膚色識(shí)別參量和輪廓特征相結(jié)合的指尖檢測(cè)[J].光電子技術(shù),2012,(3):185-189.
[9]OKA K,SATO Y,KOIKE H.Real- time fingertip tracking and gesture recognition[J].Computer Graphics and Applications,2002,22(6):64 -71.
[10]TOMITA A JR,ISHIIR.Hand Shape Extraction from a Sequence of Digitized Gray-Scale Images[C].Proceedings of the 20th International Conference on Industrial E-lectronics,Control and Instrumentation.Bologna:IEEE Computer Society Press,1994.1925- 1930.
[11]曹雛清,李瑞峰,趙立軍.基于深度圖像技術(shù)的手勢(shì)識(shí)別方法[J].計(jì)算機(jī)工程,2012,(8):16 -18,21.