本發(fā)明涉及手勢識別領(lǐng)域,特別涉及一種手勢指令識別方法。
背景技術(shù):
在計(jì)算機(jī)科學(xué)中,手勢識別是通過數(shù)學(xué)算法來識別人類手勢的一個(gè)議題。手勢識別可以來自人的身體各部位的運(yùn)動,但一般是指人體手部的運(yùn)動。手勢作為一種自然、直觀的人機(jī)交互手段,在過去二十多年里一直是人機(jī)交互技術(shù)的一個(gè)研究熱點(diǎn)。
在手勢識別技術(shù)中,最為基本的問題就是,人手的形狀及位置的判斷,只有能精確識別人手形狀變化,才能精確識別人的手勢?,F(xiàn)有技術(shù)的手勢識別技術(shù)主要有兩種,一種是應(yīng)用彩色攝像頭結(jié)合圖像算法來識別手勢,其不足之處在于,由于攝像頭不是景深攝像頭,難以識別帶有深度的手勢(例如前推,彎曲等),其識別精度比較低;另一種是采用3D體感攝影機(jī)Kinect來識別,Kinect自帶的SDK軟件的優(yōu)點(diǎn)是在人體骨骼識別方面效果出色,為了保證識別效果,需要將整個(gè)人體都出現(xiàn)攝像頭覆蓋區(qū)域內(nèi),操作不便。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的目的在于,提供一種手勢指令識別方法,有效解決現(xiàn)有手勢識別技術(shù)中存在的難以識別帶有深度的手勢、手形識別精度低、操作不便的技術(shù)問題。
為實(shí)現(xiàn)上述目的,本發(fā)明提供一種手勢指令識別方法,包括:利用至少一Kinect彩色攝像頭獲取至少一三維人手圖像,利用至少一景深攝像頭獲取至少一景深數(shù)據(jù);對所述三維人手圖像進(jìn)行圖像增強(qiáng)處理;對所述三維人手圖像進(jìn)行輪廓檢測處理,獲取至少一人手圖像,存儲人手輪廓坐標(biāo);根據(jù)所述人手輪廓坐標(biāo)計(jì)算并存儲至少一人手掌心位置坐標(biāo);根據(jù)所述人手輪廓坐標(biāo)及所述人手掌心位置坐標(biāo),計(jì)算人手輪廓上任一像點(diǎn)到掌心的距離;以及判斷手指尖位置,存儲手指尖位置坐標(biāo)。
其中,判斷手指尖位置,包括如下步驟:將手掌輪廓上的所有像點(diǎn)依次編號,記錄為第1像點(diǎn)、第2像點(diǎn)、.......第M像點(diǎn),M為像點(diǎn)編號;計(jì)算手掌輪廓上每一像點(diǎn)到人手掌心的距離,記錄第N像點(diǎn)到人手掌心的距離SN;將SN分別與SN-1及SN+1作對比,當(dāng)SN大于SN-1且SN大于SN+1時(shí),判定第N像點(diǎn)為一手指的指尖;以及記錄伸出的指尖總數(shù)量K。
進(jìn)一步地,所述的手勢指令識別方法,還包括如下步驟:定義第P幀時(shí)第Q個(gè)指尖點(diǎn)到掌心的距離TQP;P為幀數(shù),Q小于或等于K;當(dāng)伸出的指尖數(shù)量K為1時(shí),若T1(P+5)與T1P的差值大于一恒定距離X,判定當(dāng)前手勢為單擊手勢;其中X大于20mm且小于40mm;以及當(dāng)伸出的指尖數(shù)量K大于4時(shí),若若TQ(P+W)小于TQP/2,或者,伸出的指尖數(shù)量K減少至小于或等于1,判定當(dāng)前手勢為握手手勢;其中,W大于10且小于20。
進(jìn)一步地,所述手勢指令識別方法,還包括如下步驟:根據(jù)所述景深數(shù)據(jù)計(jì)算第P幀時(shí)人手掌心到Kinect彩色攝像頭的距離RP;若R(P+W)與RP的差值大于一恒定距離Y,判定當(dāng)前手勢為后拉手勢;若R(P+W)與RP的差值小于一恒定距離-Y,判定當(dāng)前手勢為前推手勢;其中, Y大于10mm且小于30mm。
進(jìn)一步地,所述手勢指令識別方法還包括如下步驟:將人手掌心位置與顯示器上光標(biāo)位置形成映射,當(dāng)人手掌心坐標(biāo)發(fā)生移動時(shí),顯示器光標(biāo)會發(fā)生對應(yīng)移動,判定當(dāng)前的手勢為移動手勢。
本發(fā)明的優(yōu)點(diǎn)在于,可以精確地識別手掌輪廓、手指指尖及掌心位置,具有景深識別功能,可以識別帶有深度的手勢,如前推、后拉、點(diǎn)擊、握手等,無需使用人體骨骼數(shù)據(jù),不用使整個(gè)人體出現(xiàn)在攝像頭視野內(nèi)。
附圖說明
圖1所示為本發(fā)明中手勢指令識別方法的流程圖。
具體實(shí)施方式
以下參考說明書附圖介紹本發(fā)明的優(yōu)選實(shí)施例,用以舉例證明本發(fā)明可以實(shí)施,這些實(shí)施例可以向本領(lǐng)域中的技術(shù)人員完整介紹本發(fā)明的技術(shù)內(nèi)容,使得本發(fā)明的技術(shù)內(nèi)容更加清楚和便于理解。然而本發(fā)明可以通過許多不同形式的實(shí)施例來得以體現(xiàn),本發(fā)明的保護(hù)范圍并非僅限于文中提到的實(shí)施例。
如圖1所示,本發(fā)明提供一種手勢指令識別方法,包括:
步驟S1)利用至少一Kinect彩色攝像頭獲取至少一三維人手圖像,利用至少一景深攝像頭獲取至少一景深數(shù)據(jù)。Kinect是微軟公司設(shè)計(jì)的一種3D體感攝影機(jī),可以通過USB接口與主機(jī)相連接,它導(dǎo)入了即時(shí)動態(tài)捕捉、影像辨識、麥克風(fēng)輸入、語音辨識、社群互動等功能。Kinect比一般的攝像頭更為智能,Kinect能夠發(fā)射紅外線,從而對整個(gè)房間進(jìn)行立體定位。Kinect彩色攝像頭則可以借助紅外線來識別人體的運(yùn)動,還可以識別出完整的RGB色彩,并借助面部識別技術(shù)自動為用戶登錄。除此之外,配合主機(jī)上的一些高端軟件,便可以對人體的48個(gè)部位進(jìn)行實(shí)時(shí)追蹤。在Kinect彩色攝像頭拍照速度為30幀/秒的情況下,每秒會獲取30張三維人手圖像,以及相應(yīng)的30組景深數(shù)據(jù)。指令判斷步驟中,每一次判斷手勢指令都是在一個(gè)特定的時(shí)間段內(nèi)(如0.8-1.8秒)進(jìn)行,或者說,是在一個(gè)特定的幀數(shù)范圍(如24-36幀)內(nèi)進(jìn)行,這個(gè)特定的時(shí)間段或者特定的幀數(shù)范圍可以由用戶自行設(shè)定,只需判斷手指移動前后的幀數(shù)量就可以判斷手指的移動,可以減少誤判的出現(xiàn)。
步驟S2)對所述三維人手圖像進(jìn)行圖像增強(qiáng)處理,具體包括:修正直方圖,用以調(diào)整圖像顏色,使圖像的灰度平均;以及調(diào)整分辨率,將分辨率調(diào)整為512×424。該步驟是通過與Kinect彩色攝像頭相連接的主機(jī)中的軟件來實(shí)現(xiàn)的。
步驟S3)對所述三維人手圖像進(jìn)行輪廓檢測處理,獲取至少一人手圖像,存儲人手輪廓坐標(biāo),具體包括如下步驟:步驟S301)定義人的皮膚顏色在YCbCr色度空間上分布范圍;步驟S302)計(jì)算所述三維人手圖像上的每一像點(diǎn)在YCbCr色度空間上的映射數(shù)據(jù);步驟S303)在YCbCr色度空間上,將所述映射數(shù)據(jù)中符合人的皮膚顏色的像點(diǎn)集合定義為人手圖像,將所述映射數(shù)據(jù)中不符合人的皮膚顏色的像點(diǎn)設(shè)置為白色;以及步驟S304)定義所述人手圖像邊緣處的像點(diǎn)集合為所述三維人手圖像對應(yīng)的人手輪廓。該步驟是通過與Kinect彩色攝像頭相連接的主機(jī)中的軟件來實(shí)現(xiàn)的,例如OpenCV軟件。OpenCV是一個(gè)基于(開源)發(fā)行的跨平臺計(jì)算機(jī)視覺庫,可以運(yùn)行在Linux、Windows和Mac OS操作系統(tǒng)上。它輕量級而且高效--由一系列 C 函數(shù)和少量 C++ 類構(gòu)成,同時(shí)提供了Python、Ruby、MATLAB等語言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。計(jì)算機(jī)用OpenCV軟件的cvFindCounters方法找出人手圖像的輪廓,由于人的皮膚顏色在YCbCr色度空間的分布范圍:100<=Cb<=127, 138<=Cr<=170,在此范圍內(nèi)的像素點(diǎn)可以認(rèn)為是人手部分的圖像,其他像素點(diǎn)可以設(shè)置為白色,這樣可初步去除色差較大的背景色,得到一個(gè)人手圖像,該人手圖像中與白色部分相鄰的像點(diǎn)即為人手輪廓。如有必要可以進(jìn)行二次或三次輪廓檢測處理,以獲取比較精確的人手輪廓。
步驟S4)根據(jù)所述人手輪廓坐標(biāo)計(jì)算并存儲至少一人手掌心位置坐標(biāo),該步驟是通過與Kinect彩色攝像頭相連接的主機(jī)中的軟件來實(shí)現(xiàn)的,例如OpenCV軟件。計(jì)算機(jī)用OpenCV的moments方法可以計(jì)算出掌心的位置,即掌心點(diǎn)的三維坐標(biāo)。先通過findContours方法,由前面找到的輪廓參數(shù)找到手的面積,用HandArea表示,然后通過moments方法,以HandArea為參數(shù),得出掌心的位置。
步驟S5)根據(jù)所述人手輪廓坐標(biāo)及所述人手掌心位置坐標(biāo),計(jì)算人手輪廓上任一像點(diǎn)到掌心的距離。該步驟是通過與Kinect彩色攝像頭相連接的主機(jī)中的軟件來實(shí)現(xiàn)的。
步驟S6)判斷手指尖位置,存儲手指尖位置坐標(biāo),具體包括如下步驟:步驟S601)將手掌輪廓上的所有像點(diǎn)依次編號,記錄為第1像點(diǎn)、第2像點(diǎn)、.......第M像點(diǎn),M為像點(diǎn)編號;步驟S602)計(jì)算手掌輪廓上每一像點(diǎn)到人手掌心的距離,記錄第N像點(diǎn)到人手掌心的距離SN;步驟S603)將SN分別與SN-1及SN+1作對比,當(dāng)SN大于SN-1且SN大于SN+1時(shí),判定第N像點(diǎn)為一手指的指尖;步驟S604)記錄伸出的指尖總數(shù)量K。正常情況下,用戶的手握成拳狀,K=0;用戶的手五指張開,K=5。該步驟是通過與Kinect彩色攝像頭相連接的主機(jī)中的軟件來實(shí)現(xiàn)的。
步驟S7)定義第P幀時(shí)第Q個(gè)指尖點(diǎn)到掌心的距離TQP;P為幀數(shù),Q小于或等于K;當(dāng)伸出的指尖數(shù)量K為1時(shí),用戶只伸出一個(gè)手指,T1P為第P幀時(shí)該手指指尖點(diǎn)到掌心的距離;T1(P+5)為5幀后的第P+5幀時(shí)該手指指尖點(diǎn)到掌心的距離。若T1(P+5)與T1P的差值大于一恒定距離X,判定當(dāng)前手勢為單擊手勢;其中X大于20mm且小于40mm,優(yōu)選30mm。也就是說,用戶伸出一根手指,向下按壓30mm,即為單擊操作。用戶可以事先設(shè)定,將一根手指的單擊操作設(shè)定為鼠標(biāo)左鍵單擊。該步驟是通過與Kinect彩色攝像頭相連接的主機(jī)中的軟件來實(shí)現(xiàn)的。
當(dāng)伸出的指尖數(shù)量K大于4時(shí),用戶伸出五個(gè)手指,TQP為第P幀時(shí)第Q個(gè)手指指尖點(diǎn)到掌心的距離;TQ(P+W)為W幀后的第P+W幀時(shí)第Q個(gè)手指指尖點(diǎn)到掌心的距離。若TQ(P+W)小于TQP/2,或者,伸出的指尖數(shù)量K減少至小于或等于1,判定當(dāng)前手勢為握手手勢;其中,W大于10且小于20。也就是說,用戶張開五個(gè)手指,向內(nèi)收縮再握住,即為握手操作。用戶可以事先設(shè)定,將五指張開再握住的操作設(shè)定為選取,例如選取地圖。
步驟S8)根據(jù)所述景深數(shù)據(jù)計(jì)算第P幀時(shí)人手掌心到Kinect彩色攝像頭的距離RP;W幀后的第P+W幀時(shí)人手掌心到Kinect彩色攝像頭的距離R(P+W);若R(P+W)與RP的差值大于一恒定距離Y,判定當(dāng)前手勢為后拉手勢;若R(P+W)與RP的差值小于一恒定距離-Y,判定當(dāng)前手勢為前推手勢;其中, Y大于10mm且小于30mm。也就是說,用戶將手掌向前推移,即為前推操作;將手掌向后拉動,即為后拉操作。用戶可以事先設(shè)定,將前推操作設(shè)定為放大,實(shí)現(xiàn)地圖放大的效果;將前推操作設(shè)定為縮小,實(shí)現(xiàn)地圖縮小的效果。
步驟S9)將人手掌心位置與顯示器上光標(biāo)位置形成映射,當(dāng)人手掌心坐標(biāo)發(fā)生移動時(shí),顯示器光標(biāo)會發(fā)生對應(yīng)移動,判定當(dāng)前的手勢為移動手勢。也就是說,用戶利用手掌上下左右移動,即可以控制顯示器上光標(biāo)的移動效果。該步驟是通過與Kinect彩色攝像頭相連接的主機(jī)中的軟件來實(shí)現(xiàn)的。
其中,步驟S7)-步驟S9)基本是同步進(jìn)行,并無先后順序。步驟S6)-步驟S9)的指令判斷步驟中,每一次判斷手勢指令都是在一個(gè)特定的時(shí)間段內(nèi)進(jìn)行,或者說,是在一個(gè)特定的幀數(shù)范圍(如24-36幀/秒)內(nèi)進(jìn)行,這個(gè)特定的時(shí)間段或者特定的幀數(shù)范圍可以由用戶自行設(shè)定,只需判斷手指移動前后的幀數(shù)量就可以判斷手指的移動,可以減少誤判的出現(xiàn)。
本發(fā)明將彩色攝像頭與景深攝像頭結(jié)合起來使用,將兩者的數(shù)據(jù)相疊加,優(yōu)化了判斷算法,提升了手指判斷的精度,因此手勢識別更加精準(zhǔn)。本發(fā)明具有景深識別功能,可以識別帶有深度的手勢,如前推、后拉、點(diǎn)擊、握手等,無需使用人體骨骼數(shù)據(jù),不用使整個(gè)人體出現(xiàn)在攝像頭視野內(nèi)。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。