時(shí)夢(mèng)麗,張備偉,劉光徽
(南京財(cái)經(jīng)大學(xué) 信息工程學(xué)院,江蘇 南京 210023)
手勢(shì)識(shí)別系統(tǒng)被用作人和計(jì)算機(jī)系統(tǒng)之間交互的良好界面[1],可讓人們以一種更為直接、快捷的方式實(shí)現(xiàn)人機(jī)交互。因此,手勢(shì)識(shí)別逐漸成為人機(jī)交互領(lǐng)域的一個(gè)研究熱點(diǎn)。
傳統(tǒng)傳感器(數(shù)據(jù)手套[2]、鼠標(biāo)[3]、攝像機(jī)[4]等)可捕捉手勢(shì)信息并進(jìn)行識(shí)別。數(shù)據(jù)手套可直接獲得手勢(shì)的三維信息,但數(shù)據(jù)手套的穿戴及位置跟蹤器的配置較為復(fù)雜,給使用者帶來(lái)諸多不便。利用跟蹤技術(shù)跟隨硬件設(shè)備獲取手勢(shì)路徑也可實(shí)現(xiàn)手勢(shì)識(shí)別,但此類(lèi)方法僅適用于手勢(shì)較為簡(jiǎn)單的情況,當(dāng)手勢(shì)過(guò)于復(fù)雜時(shí)則會(huì)導(dǎo)致識(shí)別精確度降低。普通攝像機(jī)也可采集圖像信息進(jìn)行識(shí)別,但此類(lèi)方法對(duì)光照條件、人體膚色較為敏感,易受到環(huán)境變化的影響,系統(tǒng)魯棒性不高。
3D傳感器的出現(xiàn),使得基于手勢(shì)的人機(jī)交互系統(tǒng)取得了進(jìn)一步的成功,微軟的Kinect設(shè)備就是其中的代表之一[5]。目前,已有很多學(xué)者探討實(shí)現(xiàn)了基于Kinect設(shè)備的手勢(shì)識(shí)別[6-8,11]。田元等[6]利用Kinect設(shè)備獲取深度數(shù)據(jù)和骨骼位置信息,將指尖點(diǎn)個(gè)數(shù)、距離等特征量化為六級(jí)分類(lèi)標(biāo)準(zhǔn)實(shí)現(xiàn)了數(shù)字手勢(shì)1-10的識(shí)別。袁方劍等[7]利用深度圖像,結(jié)合指尖數(shù)目和面積比例實(shí)現(xiàn)了“抓取”動(dòng)作的識(shí)別。Wang等[8]將手勢(shì)的紋理和深度信息以超像素的方式表達(dá),結(jié)合EMD距離實(shí)現(xiàn)了數(shù)字手勢(shì)的判定。趙飛飛等[9]提取三維骨骼節(jié)點(diǎn)坐標(biāo),并結(jié)合DTW算法實(shí)現(xiàn)了簡(jiǎn)單的“鼠標(biāo)手勢(shì)”識(shí)別。
本文提出了一種基于Kinect的實(shí)時(shí)手勢(shì)識(shí)別算法。該算法利用Ostu閾值分割法分割手勢(shì),提取一系列手勢(shì)特征,根據(jù)特征可準(zhǔn)確實(shí)時(shí)的識(shí)別數(shù)字手勢(shì)0~9,開(kāi)發(fā)了一個(gè)識(shí)別率高、實(shí)時(shí)性好、魯棒性強(qiáng)的實(shí)時(shí)識(shí)別系統(tǒng)。算法流程如圖1所示。
圖1 算法流程
Kinect設(shè)備由RGB攝像頭、深度傳感器、紅外線發(fā)射器組成,可實(shí)時(shí)捕獲場(chǎng)景中的彩色、深度信息。深度傳感器每秒可獲得30幀圖像,深度圖像是場(chǎng)景深度信息的圖形化表示,每個(gè)像素點(diǎn)的灰度值代表物體距離攝像頭的遠(yuǎn)近,數(shù)值越小表示場(chǎng)景距離攝像頭的距離越近,反之亦然。圖2所示為利用Kinect設(shè)備獲取的手勢(shì)信息,也是實(shí)驗(yàn)中要識(shí)別的數(shù)字手勢(shì),依次為數(shù)字手勢(shì)0~9。
圖2 數(shù)字手勢(shì)
為了實(shí)現(xiàn)數(shù)字手勢(shì)識(shí)別功能,需選取一個(gè)合適的閾值將手勢(shì)與背景分割。本文實(shí)驗(yàn)采取了一種自適應(yīng)計(jì)算單閾值的簡(jiǎn)單高效方法——Ostu閾值分割法[10]。
Otsu閾值分割法原理:
假設(shè)圖像由前景區(qū)域和背景區(qū)域兩部分組成,計(jì)算不同閾值下前景區(qū)域和背景區(qū)域的灰度直方圖,當(dāng)類(lèi)間的方差達(dá)到最大時(shí),對(duì)應(yīng)的閾值就是要求的最佳閾值。對(duì)于一幅圖像,假設(shè)具有N個(gè)像素點(diǎn),圖像的灰度總級(jí)為L(zhǎng),pi表示灰度級(jí)為i的像素點(diǎn)出現(xiàn)的概率。對(duì)任意灰度值t(1≤t≤L), 可按照t將圖像的灰度級(jí)分為兩類(lèi),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時(shí)的類(lèi)間方差表達(dá)式,當(dāng)g(t)取值為最大值時(shí),對(duì)應(yīng)的t為最佳閾值。
實(shí)驗(yàn)中,深度圖像包括手掌、軀干以及背景部分。為提高分割的精確度要對(duì)圖像進(jìn)行多次迭代閾值分割,但多次迭代分割勢(shì)必會(huì)占有大量計(jì)算資源,導(dǎo)致識(shí)別效率降低。觀察圖3所示的圖像灰度直方圖可發(fā)現(xiàn),無(wú)論距離Kinect是遠(yuǎn)是近、無(wú)論何種手勢(shì),人體軀干部分始終處于灰度直方圖的最高峰。找到灰度直方圖最高峰點(diǎn)處的灰度值,在最小灰度值Tmin和峰值對(duì)應(yīng)的灰度值區(qū)間內(nèi)進(jìn)行閾值分割,得到的閾值T即為手掌和軀干的分界點(diǎn),在提高分割精確度的同時(shí)又降低了時(shí)間復(fù)雜度。
圖3 灰度直方圖
手勢(shì)分割完成后,手部區(qū)域從復(fù)雜背景中分割出來(lái)。為了方便提取特征進(jìn)行手勢(shì)識(shí)別,需要提取手部區(qū)域的輪廓點(diǎn)、掌心點(diǎn)以及指尖點(diǎn)等信息。
在做手勢(shì)動(dòng)作時(shí),手部必然是懸空的,不和軀干或者其它物體貼合。結(jié)合輪廓點(diǎn)獨(dú)有的性質(zhì),在輪廓點(diǎn)的3*3鄰域內(nèi),必然有一個(gè)方向點(diǎn)的灰度值不在手部區(qū)域內(nèi),而非輪廓點(diǎn)卻不具有這樣的性質(zhì)。利用該性質(zhì)得到獲取手部輪廓點(diǎn)的具體步驟:
步驟1 設(shè)手部輪廓點(diǎn)集合mContour,內(nèi)部點(diǎn)集合mHandArea。依次遍歷所有點(diǎn),對(duì)于當(dāng)前點(diǎn)P,若它不在圖像邊緣位置,且其灰度值在區(qū)間 [Tmin,T] 內(nèi),則轉(zhuǎn)向步驟2。整個(gè)循環(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 遍歷完成后,對(duì)圖像進(jìn)行二值化處理。效果如圖4所示。
考慮到掌心的特殊性,無(wú)論何種動(dòng)作掌心的面積始終大于手指部分面積,因此可以考慮將最大內(nèi)切圓的圓心作為手掌中心。相對(duì)手掌來(lái)說(shuō),手指本身纖細(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中的每個(gè)點(diǎn),計(jì)算該點(diǎn)和輪廓點(diǎn)mContour中每個(gè)點(diǎn)的距離,記錄最小距離值,在所有內(nèi)部點(diǎn)和輪廓點(diǎn)的距離最小值中找到最大值,此時(shí)對(duì)應(yīng)的手掌內(nèi)部點(diǎn)坐標(biāo)即為要找的掌心。
指尖點(diǎn)是輪廓點(diǎn)里的特殊點(diǎn)??紤]指尖點(diǎn)獨(dú)有的性質(zhì),在其對(duì)應(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)行遞歸迭代刪除,直到無(wú)法刪除為止。若tmpfinger鏈表中仍有剩余點(diǎn),則繼續(xù)執(zhí)行步驟3,否則轉(zhuǎn)向步驟4;
步驟4 遍歷指尖鏈表mfinger,將指尖點(diǎn)以及附近的點(diǎn)全部歸一化為白色,使得指尖點(diǎn)與輪廓點(diǎn)在視覺(jué)上有所區(qū)分。如圖4所示。
圖4 手部分割效果
圖4所示為手形提取完成后的手部深度圖像??梢钥吹?,手部區(qū)域、輪廓、指尖點(diǎn)、掌心點(diǎn)都較為清晰、明確。
上文中得到的輪廓點(diǎn)是無(wú)序的,但是特征提取時(shí)需要用到有序的輪廓點(diǎn),因此要對(duì)輪廓點(diǎn)進(jìn)行排序操作。距離最近的兩個(gè)像素點(diǎn)必是相鄰點(diǎn),因此只要從任意一輪廓點(diǎn)依次尋找距離最近的點(diǎn),便可以將輪廓點(diǎn)有序排列。
(1)手勢(shì)0特判
相較于其它手勢(shì)而言,數(shù)字手勢(shì)0不具備本文手勢(shì)判別的任何一個(gè)特征,因此需要對(duì)手勢(shì)0進(jìn)行單獨(dú)判定。利用回歸分析法得到式(1),當(dāng)滿足式(1)時(shí),可以認(rèn)為該手勢(shì)是拳頭。Dk是人與Kinect之間的最短距離,Dmax是輪廓點(diǎn)距離掌心的最大距離,Dmin是最小距離
Dmin2-Dmax2≤C-Dk2
(1)
其中,C為常數(shù),實(shí)驗(yàn)時(shí)設(shè)定值為1130。
(2)手指點(diǎn)個(gè)數(shù)N
數(shù)字手勢(shì)1~5皆是依據(jù)手指點(diǎn)的個(gè)數(shù)來(lái)判斷。
(3)凸包檢測(cè)
找到手勢(shì)輪廓中最上方包圍特征點(diǎn)H和最左側(cè)包圍特征點(diǎn)L,掃描包圍特征點(diǎn)所包圍的輪廓點(diǎn),若存在輪廓點(diǎn)在包圍特征點(diǎn)連線的外側(cè),則判定存在凸包點(diǎn),否則判定無(wú)凸包點(diǎn)。如圖5手勢(shì)存在凸包點(diǎn),判定為手勢(shì)7。
圖5 凸包檢測(cè)
(4)相對(duì)距離
手勢(shì)判定時(shí),手勢(shì)9和手勢(shì)1皆被系統(tǒng)判定為只存在一個(gè)手指點(diǎn),唯一區(qū)別在于手指是否彎曲。仔細(xì)觀察發(fā)現(xiàn),若手指無(wú)彎曲,手指輪廓中的點(diǎn)和指尖點(diǎn)的相對(duì)距離不會(huì)大于手指的寬度,若手指彎曲則相反。因此可計(jì)算相對(duì)距離來(lái)判定手指是否彎曲。
距離計(jì)算方法如下:
如圖6中所示,首先找到指尖點(diǎn)Pf,在對(duì)應(yīng)手指輪廓點(diǎn)中找到距離指尖點(diǎn)一定距離的點(diǎn)記為Ps,計(jì)算兩個(gè)點(diǎn)間的相對(duì)距離Dis=|Pf·x-Ps·x|, 設(shè)置一個(gè)閾值thr,若Dis≥thr,判定手指為彎曲狀態(tài),否則判定手指為豎直狀態(tài)。經(jīng)過(guò)反復(fù)實(shí)驗(yàn)可得,Ps取距離指尖點(diǎn)30像素處的點(diǎn),閾值thr設(shè)定為10較為合適。
圖6 距離
(5)角度特征
通過(guò)實(shí)際觀察測(cè)量,常人的五指分開(kāi)后手指之間的角度在0°~180°之間。角度指的是連接指尖點(diǎn)和掌心形成的向量之間的角度。其中大拇指和食指之間的角度在40°~90°,食指與中指間的角度為10°~35°,大拇指和小拇指之間的角度為100°~150°。
總結(jié)以上可得手勢(shì)識(shí)別具體步驟如下:
步驟1 若手指點(diǎn)的個(gè)數(shù)為0,且符合式(1)則判定為手勢(shì)0,否則進(jìn)行凸包點(diǎn)檢測(cè),若存在凸包點(diǎn)則判定為手勢(shì)7;
步驟2 若手指點(diǎn)的個(gè)數(shù)為1,則計(jì)算手勢(shì)點(diǎn)與特定點(diǎn)之間的相對(duì)距離,若距離大于thr,則判定為手勢(shì)9,否則為手勢(shì)1;
步驟3 若手指點(diǎn)的個(gè)數(shù)為2,計(jì)算兩個(gè)指尖點(diǎn)的角度。若角度在10°~35°之間,判定為手勢(shì)2,若角度在100°~150°之間,判定為手勢(shì)6,若角度在40°~90°之間,判定為手勢(shì)8;
步驟4 若手指點(diǎn)個(gè)數(shù)為3,判定為手勢(shì)3;
步驟5 若手指點(diǎn)個(gè)數(shù)為4,判定為手勢(shì)4;
步驟6 若手指點(diǎn)個(gè)數(shù)為5,判定為手勢(shì)5。
實(shí)驗(yàn)時(shí)隨機(jī)邀請(qǐng)了10名志愿者,測(cè)試時(shí)需面對(duì)Kinect設(shè)備,使手掌位于身體的最前端,按照?qǐng)D2所示手勢(shì)做出動(dòng)作,每個(gè)動(dòng)作重復(fù)10次,每個(gè)手勢(shì)共計(jì)100次。
由于Kinect本身的物理限制,其測(cè)距范圍是60 cm~200 cm,因此首先在不同距離下進(jìn)行了測(cè)試。表1展示了3種不同距離下的測(cè)試結(jié)果。
表1 不同距離下手勢(shì)識(shí)別結(jié)果
從表1中可以看出,手勢(shì)一、二、三、四、五、九的識(shí)別率較好,識(shí)別率都在97%以上。其它的手勢(shì)的識(shí)別略低,但也均在95%以上,總體符合預(yù)期識(shí)別效果。可以看出,隨著人與Kinect距離的增大,識(shí)別率略微下降,這是由于近大遠(yuǎn)小的規(guī)律,距離較遠(yuǎn)時(shí)獲得的深度圖像尺寸較小,為識(shí)別增大了難度。雖然識(shí)別率有所降低,但平均識(shí)別率依然保持在95%以上。
對(duì)比各個(gè)手勢(shì)的識(shí)別率,發(fā)現(xiàn)數(shù)字手勢(shì)0的識(shí)別效率稍低,這是由于數(shù)字手勢(shì)0的特判式(1)中參數(shù)C為多次實(shí)驗(yàn)后得到的數(shù)值。數(shù)字手勢(shì)7識(shí)別率低的原因在于識(shí)別時(shí)將聚集的手指尖端部分誤判為手指點(diǎn),導(dǎo)致識(shí)別錯(cuò)誤。雖然兩種手勢(shì)的識(shí)別率相對(duì)于其它手勢(shì)較低,但也達(dá)到了97%。
將本文方法與文獻(xiàn)[6]和文獻(xiàn)[11]所提出的方法進(jìn)行對(duì)比,結(jié)果見(jiàn)表2,表中所示為共有手勢(shì)的識(shí)別率。由表2可以得出,文獻(xiàn)[6]的平均識(shí)別率為98.8%,文獻(xiàn)[6]使用的方法是通過(guò)建立六級(jí)分類(lèi)標(biāo)準(zhǔn)識(shí)別手勢(shì),使用的特征較為復(fù)雜,在獲取手部輪廓和特征提取過(guò)程耗時(shí)較多,實(shí)時(shí)性較差。文獻(xiàn)[11]的平均識(shí)別率為96.7%,它使用了基于YCbCr顏色空間提取手部的方法,對(duì)膚色和光照條件較為敏感,且定義的手勢(shì)皆為伸直狀態(tài),不符合日常生活中人們對(duì)手勢(shì)的定義,降低了實(shí)用性。本文方法的平均識(shí)別率達(dá)到了98.8%,并且克服了以上方法中的缺點(diǎn),在各種情況下都可以得到正確的識(shí)別結(jié)果。
為了驗(yàn)證本文方法具有旋轉(zhuǎn)、平移、縮放不變性,分別讓測(cè)試者在手部旋轉(zhuǎn)、平移及距離設(shè)備不同遠(yuǎn)近下進(jìn)行測(cè)試。結(jié)果如圖7中所示,圖7所示為實(shí)驗(yàn)所開(kāi)發(fā)的識(shí)別系統(tǒng)界面,界面中展示了人與Kinect之間的最近距離、識(shí)別結(jié)果,原始深度圖像和處理后的手部圖像。可以看到在各種情況下,本文實(shí)驗(yàn)開(kāi)發(fā)的手勢(shì)識(shí)別系統(tǒng)都可正確識(shí)別手勢(shì),說(shuō)明本文使用的方法滿足旋轉(zhuǎn)、平移、縮放不變性。
表2 不同方法識(shí)別結(jié)果對(duì)比
圖7 旋轉(zhuǎn)、平移、縮放測(cè)試
為了驗(yàn)證在光照和膚色變換條件下的魯棒性,測(cè)試者分別在戴手套和不同光照條件下進(jìn)行測(cè)試。但是由于實(shí)驗(yàn)本身是基于深度圖像的識(shí)別,不會(huì)受到光照的影響,因此圖8只展示了測(cè)試者戴手套的測(cè)試結(jié)果??梢钥闯鲈谶@種情況下也可正確識(shí)別手勢(shì)。
圖8 戴手套測(cè)試
實(shí)時(shí)性方面,將本文所用方法與文獻(xiàn)[6]所用方法各步驟處理時(shí)間做了簡(jiǎn)單對(duì)比。從表3中可以看出,本文所用方法各步驟耗時(shí)較少,識(shí)別速度快,實(shí)時(shí)性較高。
表3 各個(gè)步驟處理時(shí)間
本文提出一種基于Kinect的實(shí)時(shí)手勢(shì)識(shí)別算法,該算法可準(zhǔn)確識(shí)別數(shù)字手勢(shì)0~9。首先利用閾值分割法將手部圖像分割出來(lái),然后提取一系列手形特征,掌心、輪廓點(diǎn)、指尖點(diǎn)等,根據(jù)得到的手形特征提取手勢(shì)特征,指間的角度、是否存在凸包點(diǎn)、手指是否彎曲等,最終根據(jù)手勢(shì)特征實(shí)現(xiàn)數(shù)字手勢(shì)的判定。本文提出的方法可滿足手勢(shì)的旋轉(zhuǎn)、平移、縮放不變性,具有較高的計(jì)算效率,且具有良好的實(shí)時(shí)性與穩(wěn)定性。接下來(lái)的工作就是進(jìn)一步完善系統(tǒng),并將之推廣應(yīng)用到其它領(lǐng)域,如智能家庭、虛擬游戲當(dāng)中。