張仲一,楊成,吳曉雨
(中國傳媒大學信息工程學院,北京100024)
人手擁有人身體最靈活的肌肉,他不僅可以幫助我們完成日常的勞動,還可以幫助傳達豐富細致的信息,例如本文將要實現的人手三維空間虛擬鍵盤輸入功能?;谝曈X的手指交互現在及不久的將來在人機交互領域將有廣泛和重要的用武之地,主要包括四類:(1)手語識別,利用計算機視覺和紅外深度影像,應用圖像處理技術,完成手語、語音、文字指尖的相互轉換,以幫助聾啞人群。(2)手勢識別,利用靜態(tài)或動態(tài)手勢進行人機交互,在身份識別、機器人控制和家用電器控制等方面具有廣闊的應用前景。(3)虛擬觸控技術,使用非接觸式的空間虛擬觸控系統(tǒng),通過手掌和軀干的運動,操縱游戲、娛樂、多媒體設備。(4)手指書寫,使用手指的運動軌跡判定識別方法取代傳統(tǒng)鍵盤的文字輸入方式。而最后一項內容,就是本系統(tǒng)研究的主要目的。由于人手具有很高的復雜形變的特點,所以手指運動分析是一個很難的課題[1]。
Kinect是美國微軟公司為XBOX360游戲機開發(fā)的一款體感外設,于2010年11月4日正式推出。如圖1所示。
圖1 Kinect體感外設
Kinect事實上的核心是三維體感攝影機,并使用即時動態(tài)捕捉、影像辨識、麥克風輸入、語音辨識功能讓玩家不在依賴于使用手柄,通過玩家的四肢運動操作游戲。Kinect是由一個RGB攝像頭和一對由紅外發(fā)射器和CMOS接受器組成的深度攝像頭所組成的,可以得到場景的RGB顏色信息和深度數據。
Light Coding技術理論是利用近紅外光對測量空間進行編碼,經感應器讀取編碼的光線,交由晶片運算進行解碼后,產生成一張具有深度的圖像。Light Coding技術的關鍵e雷射光散斑,當雷射光照射到粗糙物體、或是穿透毛玻璃后,會形成隨機的反射斑點,稱之為散斑。散斑具有高度隨機性,也會隨著距離而變換圖案,空間中任何兩處的散斑都會是不同的圖案,等于是將整個空間加上了標記,所以任何物體進入該空間以及移動時,都可確切記錄物體的位置。Light Coding發(fā)出雷射光對測量空間進行編碼,就是指產生散斑。Kinect就是以紅外線發(fā)出人眼看不見的雷射光,透過鏡頭前的光柵將雷射光均勻分布投射在測量空間中,再透過紅外線攝影機記錄下空間中的每個散斑,獲取原始數據,再通過計算生成深度圖像。
Kinect的優(yōu)勢是無論周圍環(huán)境的光照條件強弱,都可以被Kinect的CMOS紅外傳感器所感知。紅外傳感器通過灰度值的大小來標度被測物體的深度值,也就是其傳感器的距離:越黑表示距離越遠,越白表示距離越近。Kinect測量感測范圍內的所有物體距離攝像頭的深度,并保存為景深數據圖。傳感器以每秒30幀的速度生成景深圖像流,以達到實時的數據監(jiān)測[2]。
最初,微軟并沒有公布其它平臺的Kinect驅動程序。國外的Kinect開發(fā)者們以及開源社區(qū)對其破解,使其可以應用到PC平臺之上,并且對于代碼開源。2月 1日 Microsoft正式使 Kinect支持于Windows系統(tǒng)平臺并公開發(fā)售 window版 Kinect。Microsoft同時推出 SDK 1.0,Kinect for Windows SDK是微軟 Kinect設備的開發(fā)工具包。目前最新的微軟Kinect SDK為Kinect for Windows Developer Toolkit v1.5.1。
我們所使用的驅動為OpenNI。OpenNI(開放式的自然交互),Open Natural Interaction的縮寫而來,一個由業(yè)界領導的非營利組織。該組織專注于提高和改善自然交互設備,應用軟件的互操作能力。通過使用這些硬件和中間件(軟件)來很方便的訪問和使用一些設備。主要成員之一是PrimeSense公司,Kinect的核心芯片正是這家公司提供的,因此它的使用較為廣泛。OpenNI定義了自然人機交互所需的很多API,提供一個多語言跨平臺的開發(fā)框架。
系統(tǒng)的原型設計流程圖圖2如下:
圖2 系統(tǒng)流程圖
圖2所示是系統(tǒng)的的實現過程,開始時在PC主機上獲取Kinect的RGB圖像和深度圖像。之后將獲取的原始數據,進行圖像的一些相關預處理工作,包括圖像校正和濾波降噪處理。為了得到手型的輪廓信息,系統(tǒng)使采用深度圖和RGB圖相結合的方法,進行人手分割。然后再根據輪廓點序列,檢測出指尖的空間坐標值。最后通過以上所得數據,完成空間鍵盤輸入操作。
2.2.1 圖像校正及預處理
KINECT傳感器可以同時獲取RGB彩色圖像數據以及深度數據圖。本系統(tǒng)通過Depth Generator imageGenerator兩個OPENNI提供的接口獲取RGB圖和深度圖。為了抑制數據中的噪聲干擾,對于深度數據進行高斯濾波處理。高斯濾波就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均后得到。高斯濾波的具體操作是:用一個模板掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值[3]。
2.2.2 圖像二值化
首先,設計此系統(tǒng)的需要消除背景信息和其他多余的人物干擾。由于KINECT擁有深度攝像和RGB攝像頭,我們只獲取主操作者的數據,丟棄背景數據和和其他攝像頭范圍內人物。這識別人物,分割背景功能的實現,使用了OPENNI的User Generator模塊。
主操作者和背景信息的輸出存儲在一個標簽數據圖之中。如果一個深度像素的被判定為背景像素則其值被標記為0,如果像素點是屬于用戶的范圍,則這個像素被標記為用戶的ID號。
之后,系統(tǒng)將用戶的雙手部分從身體范圍內分割出來。因為我們不要用戶的全身數據,只需要雙手的區(qū)域。因為當手伸出來時,手是身體離 KINECT最近的部分,所以系統(tǒng)設定一個深度閾值作為分割的門限把手部從身體分割出來[4]。
公式(1)為手部深度分割公式
將得到的包含手部多灰度級的圖像變成只有兩個灰度級的圖像。用閾值T作為分割值,T的值略大于手心點的深度值,從而得到手部的準確輪廓。
提取更為準確的手部區(qū)域,以便于之后對于手掌輪廓的提取。雖然可能存在干擾區(qū)域,但手部區(qū)域應該是所有可能區(qū)域中,最大的一片連續(xù)區(qū)域。檢索所有可能范圍內最大的閉合區(qū)域,并計算該區(qū)域的幾何中心,作為手心點。一般來說,手掌的長寬小于20cm,所以切割以手心為中心,邊長為20cm的正方形區(qū)域[5]。
圖示如下:
圖3 手掌矩形
2.3.1 指尖檢測
對于凸包輪廓的檢測,本系統(tǒng)采用葛立恒掃描法[6]。該方法的具體步驟為:
1)首先,檢索所有邊緣點之中Y值最小的點。當Y值最小的點多于一處時,則在這幾個點之中選取X值最小的點,將此點設為基點P。
2)將所有邊緣點與基點P連線,并計算連線與X軸之間的夾角數值。依據夾角數值的大小順序,將所有點進行排列編號,記為 P[0],P[1]…P[n]。
3)假設存在一條從P[0]依序連接到P[n]的虛擬路徑。判斷一點到下一點的轉向是“向左轉”還是“向右轉”。如果是向右轉,則證明之前一點不屬于凸包集。只有向左轉,才把前一點判定為凸包點,并加入堆之中棧。以此算法檢查所有邊緣點,并得到凸包輪廓。
4)對于向左轉還是向右轉的判定,算法是把三個連續(xù)的點看成一個夾角向量((P1,P0),(P2,P0)),d=(P1,P0)*(P2,P0)。如果 d 值大于 0 則為右轉(順時針方向),d值小于0則為左轉(逆時針方向),d等于0則為直線。
在完成凸包點檢測之后,繼續(xù)計算凹缺陷點。
2.3.2 指尖點篩選
使用以上獲得的數據進行更精確的指尖點篩選。把一個凸包點命名為起始點P1,下一個凸包點命名為終結點P3,在這兩點之間的凹陷點命名為深度點P2。起始點和終結點都有可能是指尖點。把(P2,P1),(P2,P3)設為兩個向量 V1,V2。當 V1,V2 的夾角小于100度,兩個向量的長度之和大于手掌矩形變長的一半,則把起始點和終結點判定為指尖點。
圖4 指尖點和凹缺陷點(紫色點計算所得指尖點,黃色點為凹缺陷點)
使用之前得到的手部的指尖點以及凹缺陷點數據、掌心點數據建立一個手型點擊的的基本數據單元,它是由兩個相鄰指尖與一個他們之間的凹缺陷點組成的夾角結構。這個數據模型需要以上所有點的三維坐標值。然后計算一個凹缺陷點與相鄰的兩指尖點所組成的夾角的大小,也就是計算向量P1P2和P2P3在YZ投影平面的夾角值α。
通過對希望觸發(fā)點擊事件時,手指動作數據的統(tǒng)計分析,得到一個合理的閾值α。每當指尖夾角大于閾值α時,則判定點擊事件被觸發(fā)一次。
圖5 手指點擊是指尖點在YZ軸上的示意圖
系統(tǒng)通過Open CV創(chuàng)建鍵盤窗口,在鍵盤窗口內布置1到10十個數字鍵點擊區(qū)域。用戶在處于KINECT體感攝像頭前1米左右進行空間鍵盤點擊動作。對于每個按鍵進行樣本容量為50次的試驗測試,結果如下:
表1 打開屏幕鍵盤文檔的輸入
在虛擬鍵盤點擊實驗結果來看,人手處于KINECT攝像范圍中心時,點擊事件識別率較高,而處于KINECT攝像范圍邊緣時,識別概率相對較低。原因是人手處于邊緣區(qū)域時,由于手掌相對于攝像頭的拍攝角度的問題,在人手進行深度分割之后所得手掌輪廓邊緣曲線有一定的變形,最后導致指尖識別定位效果下降。
[1]李文生,解梅,鄧春健.基于多點手勢識別的人機交互技術框架[J].多點手勢識別的人機,2011(6).
[2]OpenNI User Guide[S].PrimeSensor Ltd.
[3]湯勇,顧宏斌,周來.交互系統(tǒng)中實時手勢分割及指尖檢測方法[J]. 光電工程,2010,37(7).
[4]He G,Kang S,Song W.Real-time Gesture Recognition using 3D Depth Camera[J].
[5]Raheja J L,Chaudhary A,Singal K.Tracking of Fingertips and Centres of Palm using KINECT[J].
[6]耿海進.基于三維視覺的手勢跟蹤及人機交互中的應用[D].南京:南京大學.