時夢麗,張備偉,劉光徽
(南京財(cái)經(jīng)大學(xué) 信息工程學(xué)院,江蘇 南京 210023)
手勢識別系統(tǒng)被用作人和計(jì)算機(jī)系統(tǒng)之間交互的良好界面[1],可讓人們以一種更為直接、快捷的方式實(shí)現(xiàn)人機(jī)交互。因此,手勢識別逐漸成為人機(jī)交互領(lǐng)域的一個研究熱點(diǎn)。
傳統(tǒng)傳感器(數(shù)據(jù)手套[2]、鼠標(biāo)[3]、攝像機(jī)[4]等)可捕捉手勢信息并進(jìn)行識別。數(shù)據(jù)手套可直接獲得手勢的三維信息,但數(shù)據(jù)手套的穿戴及位置跟蹤器的配置較為復(fù)雜,給使用者帶來諸多不便。利用跟蹤技術(shù)跟隨硬件設(shè)備獲取手勢路徑也可實(shí)現(xiàn)手勢識別,但此類方法僅適用于手勢較為簡單的情況,當(dāng)手勢過于復(fù)雜時則會導(dǎo)致識別精確度降低。普通攝像機(jī)也可采集圖像信息進(jìn)行識別,但此類方法對光照條件、人體膚色較為敏感,易受到環(huán)境變化的影響,系統(tǒng)魯棒性不高。
3D傳感器的出現(xiàn),使得基于手勢的人機(jī)交互系統(tǒng)取得了進(jìn)一步的成功,微軟的Kinect設(shè)備就是其中的代表之一[5]。目前,已有很多學(xué)者探討實(shí)現(xiàn)了基于Kinect設(shè)備的手勢識別[6-8,11]。田元等[6]利用Kinect設(shè)備獲取深度數(shù)據(jù)和骨骼位置信息,將指尖點(diǎn)個數(shù)、距離等特征量化為六級分類標(biāo)準(zhǔn)實(shí)現(xiàn)了數(shù)字手勢1-10的識別。袁方劍等[7]利用深度圖像,結(jié)合指尖數(shù)目和面積比例實(shí)現(xiàn)了“抓取”動作的識別。Wang等[8]將手勢的紋理和深度信息以超像素的方式表達(dá),結(jié)合EMD距離實(shí)現(xiàn)了數(shù)字手勢的判定。趙飛飛等[9]提取三維骨骼節(jié)點(diǎn)坐標(biāo),并結(jié)合DTW算法實(shí)現(xiàn)了簡單的“鼠標(biāo)手勢”識別。
本文提出了一種基于Kinect的實(shí)時手勢識別算法。該算法利用Ostu閾值分割法分割手勢,提取一系列手勢特征,根據(jù)特征可準(zhǔn)確實(shí)時的識別數(shù)字手勢0~9,開發(fā)了一個識別率高、實(shí)時性好、魯棒性強(qiáng)的實(shí)時識別系統(tǒng)。算法流程如圖1所示。

圖1 算法流程
Kinect設(shè)備由RGB攝像頭、深度傳感器、紅外線發(fā)射器組成,可實(shí)時捕獲場景中的彩色、深度信息。深度傳感器每秒可獲得30幀圖像,深度圖像是場景深度信息的圖形化表示,每個像素點(diǎn)的灰度值代表物體距離攝像頭的遠(yuǎn)近,數(shù)值越小表示場景距離攝像頭的距離越近,反之亦然。圖2所示為利用Kinect設(shè)備獲取的手勢信息,也是實(shí)驗(yàn)中要識別的數(shù)字手勢,依次為數(shù)字手勢0~9。

圖2 數(shù)字手勢
為了實(shí)現(xiàn)數(shù)字手勢識別功能,需選取一個合適的閾值將手勢與背景分割。本文實(shí)驗(yàn)采取了一種自適應(yīng)計(jì)算單閾值的簡單高效方法——Ostu閾值分割法[10]。
Otsu閾值分割法原理:
假設(shè)圖像由前景區(qū)域和背景區(qū)域兩部分組成,計(jì)算不同閾值下前景區(qū)域和背景區(qū)域的灰度直方圖,當(dāng)類間的方差達(dá)到最大時,對應(yīng)的閾值就是要求的最佳閾值。對于一幅圖像,假設(shè)具有N個像素點(diǎn),圖像的灰度總級為L,pi表示灰度級為i的像素點(diǎn)出現(xiàn)的概率。對任意灰度值t(1≤t≤L), 可按照t將圖像的灰度級分為兩類,C0={1,2,3,…,t},C1={t+1,t+2,…,L},C0所占比例為w0,灰度均值為u0,Ci所占比例為w1,灰度均值為u1,則整幅圖像的灰度均值為u=w0*u0+w1*u1, 建立目標(biāo)函數(shù)g(t)=w0*(u0-u)2+w1*(u1-u)2, 該函數(shù)是閾值為t時的類間方差表達(dá)式,當(dāng)g(t)取值為最大值時,對應(yīng)的t為最佳閾值。
實(shí)驗(yàn)中,深度圖像包括手掌、軀干以及背景部分。為提高分割的精確度要對圖像進(jìn)行多次迭代閾值分割,但多次迭代分割勢必會占有大量計(jì)算資源,導(dǎo)致識別效率降低。觀察圖3所示的圖像灰度直方圖可發(fā)現(xiàn),無論距離Kinect是遠(yuǎn)是近、無論何種手勢,人體軀干部分始終處于灰度直方圖的最高峰。找到灰度直方圖最高峰點(diǎn)處的灰度值,在最小灰度值Tmin和峰值對應(yīng)的灰度值區(qū)間內(nèi)進(jìn)行閾值分割,得到的閾值T即為手掌和軀干的分界點(diǎn),在提高分割精確度的同時又降低了時間復(fù)雜度。

圖3 灰度直方圖
手勢分割完成后,手部區(qū)域從復(fù)雜背景中分割出來。為了方便提取特征進(jìn)行手勢識別,需要提取手部區(qū)域的輪廓點(diǎn)、掌心點(diǎn)以及指尖點(diǎn)等信息。
在做手勢動作時,手部必然是懸空的,不和軀干或者其它物體貼合。結(jié)合輪廓點(diǎn)獨(dú)有的性質(zhì),在輪廓點(diǎn)的3*3鄰域內(nèi),必然有一個方向點(diǎn)的灰度值不在手部區(qū)域內(nèi),而非輪廓點(diǎn)卻不具有這樣的性質(zhì)。利用該性質(zhì)得到獲取手部輪廓點(diǎn)的具體步驟:
步驟1 設(shè)手部輪廓點(diǎn)集合mContour,內(nèi)部點(diǎn)集合mHandArea。依次遍歷所有點(diǎn),對于當(dāng)前點(diǎn)P,若它不在圖像邊緣位置,且其灰度值在區(qū)間 [Tmin,T] 內(nèi),則轉(zhuǎn)向步驟2。整個循環(huán)結(jié)束后,轉(zhuǎn)向步驟5;
步驟2 判斷點(diǎn)P的3*3鄰域內(nèi)像素點(diǎn)的灰度值,是否存在一點(diǎn)的灰度值不在 [Tmin,T] 范圍內(nèi)。若存在這樣的點(diǎn),則轉(zhuǎn)向步驟3,否則,轉(zhuǎn)向步驟4;
步驟3 將點(diǎn)P存入mContour中,返回步驟2;
步驟4 將點(diǎn)P存入mHandArea,返回步驟2;
步驟5 遍歷完成后,對圖像進(jìn)行二值化處理。效果如圖4所示。
考慮到掌心的特殊性,無論何種動作掌心的面積始終大于手指部分面積,因此可以考慮將最大內(nèi)切圓的圓心作為手掌中心。相對手掌來說,手指本身纖細(xì),手指內(nèi)部點(diǎn)的內(nèi)切圓半徑要遠(yuǎn)遠(yuǎn)小于手掌內(nèi)部點(diǎn)的內(nèi)切圓半徑,所以此方法可行。
假設(shè)掌心點(diǎn)坐標(biāo)為 (x0,y0), 遍歷集合mHandArea中的每個點(diǎn),計(jì)算該點(diǎn)和輪廓點(diǎn)mContour中每個點(diǎn)的距離,記錄最小距離值,在所有內(nèi)部點(diǎn)和輪廓點(diǎn)的距離最小值中找到最大值,此時對應(yīng)的手掌內(nèi)部點(diǎn)坐標(biāo)即為要找的掌心。
指尖點(diǎn)是輪廓點(diǎn)里的特殊點(diǎn)。考慮指尖點(diǎn)獨(dú)有的性質(zhì),在其對應(yīng)的手指輪廓點(diǎn)中,指尖點(diǎn)距離掌心點(diǎn)一定是最遠(yuǎn)的。為了將手指區(qū)域劃分,必須先根據(jù)掌心點(diǎn)舍去部分輪廓點(diǎn)以及手掌末端的點(diǎn),保留手指尖端輪廓點(diǎn)。計(jì)算所有輪廓點(diǎn)到掌心點(diǎn)距離的均值,一般而言,距離小于該均值的輪廓點(diǎn)要么是手掌部分輪廓點(diǎn),要么是手掌末端的點(diǎn),因此將距離小于均值的輪廓點(diǎn)舍棄后即可得到分離的手指點(diǎn)。利用下面的步驟在分離的手指點(diǎn)中找到指尖點(diǎn)。
指尖點(diǎn)判斷步驟如下:
步驟1 遍歷輪廓點(diǎn)集合mContour,求得掌心點(diǎn)到所有輪廓點(diǎn)的平均距離Daver;
步驟2 遍歷輪廓點(diǎn)集合mContour,計(jì)算當(dāng)前點(diǎn)和掌心點(diǎn)的距離,若大于Daver,則將其加入tmpfinger(手指區(qū)域輪廓點(diǎn)),若小于則舍棄。循環(huán)結(jié)束后,轉(zhuǎn)向步驟3;
步驟3 遍歷tmpfinger,找到距離掌心點(diǎn)最遠(yuǎn)的點(diǎn),將其加入指尖點(diǎn)鏈表mfinger,然后刪除與指尖點(diǎn)距離最近的點(diǎn),再將被刪除的點(diǎn)進(jìn)行遞歸迭代刪除,直到無法刪除為止。若tmpfinger鏈表中仍有剩余點(diǎn),則繼續(xù)執(zhí)行步驟3,否則轉(zhuǎn)向步驟4;
步驟4 遍歷指尖鏈表mfinger,將指尖點(diǎn)以及附近的點(diǎn)全部歸一化為白色,使得指尖點(diǎn)與輪廓點(diǎn)在視覺上有所區(qū)分。如圖4所示。

圖4 手部分割效果
圖4所示為手形提取完成后的手部深度圖像。可以看到,手部區(qū)域、輪廓、指尖點(diǎn)、掌心點(diǎn)都較為清晰、明確。
上文中得到的輪廓點(diǎn)是無序的,但是特征提取時需要用到有序的輪廓點(diǎn),因此要對輪廓點(diǎn)進(jìn)行排序操作。距離最近的兩個像素點(diǎn)必是相鄰點(diǎn),因此只要從任意一輪廓點(diǎn)依次尋找距離最近的點(diǎn),便可以將輪廓點(diǎn)有序排列。
(1)手勢0特判
相較于其它手勢而言,數(shù)字手勢0不具備本文手勢判別的任何一個特征,因此需要對手勢0進(jìn)行單獨(dú)判定。利用回歸分析法得到式(1),當(dāng)滿足式(1)時,可以認(rèn)為該手勢是拳頭。Dk是人與Kinect之間的最短距離,Dmax是輪廓點(diǎn)距離掌心的最大距離,Dmin是最小距離
Dmin2-Dmax2≤C-Dk2
(1)
其中,C為常數(shù),實(shí)驗(yàn)時設(shè)定值為1130。
(2)手指點(diǎn)個數(shù)N
數(shù)字手勢1~5皆是依據(jù)手指點(diǎn)的個數(shù)來判斷。
(3)凸包檢測
找到手勢輪廓中最上方包圍特征點(diǎn)H和最左側(cè)包圍特征點(diǎn)L,掃描包圍特征點(diǎn)所包圍的輪廓點(diǎn),若存在輪廓點(diǎn)在包圍特征點(diǎn)連線的外側(cè),則判定存在凸包點(diǎn),否則判定無凸包點(diǎn)。如圖5手勢存在凸包點(diǎn),判定為手勢7。

圖5 凸包檢測
(4)相對距離
手勢判定時,手勢9和手勢1皆被系統(tǒng)判定為只存在一個手指點(diǎn),唯一區(qū)別在于手指是否彎曲。仔細(xì)觀察發(fā)現(xiàn),若手指無彎曲,手指輪廓中的點(diǎn)和指尖點(diǎn)的相對距離不會大于手指的寬度,若手指彎曲則相反。因此可計(jì)算相對距離來判定手指是否彎曲。
距離計(jì)算方法如下:
如圖6中所示,首先找到指尖點(diǎn)Pf,在對應(yīng)手指輪廓點(diǎn)中找到距離指尖點(diǎn)一定距離的點(diǎn)記為Ps,計(jì)算兩個點(diǎn)間的相對距離Dis=|Pf·x-Ps·x|, 設(shè)置一個閾值thr,若Dis≥thr,判定手指為彎曲狀態(tài),否則判定手指為豎直狀態(tài)。經(jīng)過反復(fù)實(shí)驗(yàn)可得,Ps取距離指尖點(diǎn)30像素處的點(diǎn),閾值thr設(shè)定為10較為合適。

圖6 距離
(5)角度特征
通過實(shí)際觀察測量,常人的五指分開后手指之間的角度在0°~180°之間。角度指的是連接指尖點(diǎn)和掌心形成的向量之間的角度。其中大拇指和食指之間的角度在40°~90°,食指與中指間的角度為10°~35°,大拇指和小拇指之間的角度為100°~150°。
總結(jié)以上可得手勢識別具體步驟如下:
步驟1 若手指點(diǎn)的個數(shù)為0,且符合式(1)則判定為手勢0,否則進(jìn)行凸包點(diǎn)檢測,若存在凸包點(diǎn)則判定為手勢7;
步驟2 若手指點(diǎn)的個數(shù)為1,則計(jì)算手勢點(diǎn)與特定點(diǎn)之間的相對距離,若距離大于thr,則判定為手勢9,否則為手勢1;
步驟3 若手指點(diǎn)的個數(shù)為2,計(jì)算兩個指尖點(diǎn)的角度。若角度在10°~35°之間,判定為手勢2,若角度在100°~150°之間,判定為手勢6,若角度在40°~90°之間,判定為手勢8;
步驟4 若手指點(diǎn)個數(shù)為3,判定為手勢3;
步驟5 若手指點(diǎn)個數(shù)為4,判定為手勢4;
步驟6 若手指點(diǎn)個數(shù)為5,判定為手勢5。
實(shí)驗(yàn)時隨機(jī)邀請了10名志愿者,測試時需面對Kinect設(shè)備,使手掌位于身體的最前端,按照圖2所示手勢做出動作,每個動作重復(fù)10次,每個手勢共計(jì)100次。
由于Kinect本身的物理限制,其測距范圍是60 cm~200 cm,因此首先在不同距離下進(jìn)行了測試。表1展示了3種不同距離下的測試結(jié)果。

表1 不同距離下手勢識別結(jié)果
從表1中可以看出,手勢一、二、三、四、五、九的識別率較好,識別率都在97%以上。其它的手勢的識別略低,但也均在95%以上,總體符合預(yù)期識別效果。可以看出,隨著人與Kinect距離的增大,識別率略微下降,這是由于近大遠(yuǎn)小的規(guī)律,距離較遠(yuǎn)時獲得的深度圖像尺寸較小,為識別增大了難度。雖然識別率有所降低,但平均識別率依然保持在95%以上。
對比各個手勢的識別率,發(fā)現(xiàn)數(shù)字手勢0的識別效率稍低,這是由于數(shù)字手勢0的特判式(1)中參數(shù)C為多次實(shí)驗(yàn)后得到的數(shù)值。數(shù)字手勢7識別率低的原因在于識別時將聚集的手指尖端部分誤判為手指點(diǎn),導(dǎo)致識別錯誤。雖然兩種手勢的識別率相對于其它手勢較低,但也達(dá)到了97%。
將本文方法與文獻(xiàn)[6]和文獻(xiàn)[11]所提出的方法進(jìn)行對比,結(jié)果見表2,表中所示為共有手勢的識別率。由表2可以得出,文獻(xiàn)[6]的平均識別率為98.8%,文獻(xiàn)[6]使用的方法是通過建立六級分類標(biāo)準(zhǔn)識別手勢,使用的特征較為復(fù)雜,在獲取手部輪廓和特征提取過程耗時較多,實(shí)時性較差。文獻(xiàn)[11]的平均識別率為96.7%,它使用了基于YCbCr顏色空間提取手部的方法,對膚色和光照條件較為敏感,且定義的手勢皆為伸直狀態(tài),不符合日常生活中人們對手勢的定義,降低了實(shí)用性。本文方法的平均識別率達(dá)到了98.8%,并且克服了以上方法中的缺點(diǎn),在各種情況下都可以得到正確的識別結(jié)果。
為了驗(yàn)證本文方法具有旋轉(zhuǎn)、平移、縮放不變性,分別讓測試者在手部旋轉(zhuǎn)、平移及距離設(shè)備不同遠(yuǎn)近下進(jìn)行測試。結(jié)果如圖7中所示,圖7所示為實(shí)驗(yàn)所開發(fā)的識別系統(tǒng)界面,界面中展示了人與Kinect之間的最近距離、識別結(jié)果,原始深度圖像和處理后的手部圖像。可以看到在各種情況下,本文實(shí)驗(yàn)開發(fā)的手勢識別系統(tǒng)都可正確識別手勢,說明本文使用的方法滿足旋轉(zhuǎn)、平移、縮放不變性。

表2 不同方法識別結(jié)果對比

圖7 旋轉(zhuǎn)、平移、縮放測試
為了驗(yàn)證在光照和膚色變換條件下的魯棒性,測試者分別在戴手套和不同光照條件下進(jìn)行測試。但是由于實(shí)驗(yàn)本身是基于深度圖像的識別,不會受到光照的影響,因此圖8只展示了測試者戴手套的測試結(jié)果。可以看出在這種情況下也可正確識別手勢。

圖8 戴手套測試
實(shí)時性方面,將本文所用方法與文獻(xiàn)[6]所用方法各步驟處理時間做了簡單對比。從表3中可以看出,本文所用方法各步驟耗時較少,識別速度快,實(shí)時性較高。

表3 各個步驟處理時間
本文提出一種基于Kinect的實(shí)時手勢識別算法,該算法可準(zhǔn)確識別數(shù)字手勢0~9。首先利用閾值分割法將手部圖像分割出來,然后提取一系列手形特征,掌心、輪廓點(diǎn)、指尖點(diǎn)等,根據(jù)得到的手形特征提取手勢特征,指間的角度、是否存在凸包點(diǎn)、手指是否彎曲等,最終根據(jù)手勢特征實(shí)現(xiàn)數(shù)字手勢的判定。本文提出的方法可滿足手勢的旋轉(zhuǎn)、平移、縮放不變性,具有較高的計(jì)算效率,且具有良好的實(shí)時性與穩(wěn)定性。接下來的工作就是進(jìn)一步完善系統(tǒng),并將之推廣應(yīng)用到其它領(lǐng)域,如智能家庭、虛擬游戲當(dāng)中。