陳艷艷,陳正鳴,2,周小芹,2
(1.河海大學 物聯網工程學院,江蘇 常州 213022;2.江蘇省輸配電裝備技術重點實驗室 江蘇 常州 213022)
基于視覺的手勢識別,是通過視頻圖像信息獲取人的手勢姿態,對其進行分類識別的一種人機交互技術。它作為一門新興的技術,近年來受到了眾多國內外學者的關注。Kinect是微軟公司推出的XBox 360的外接體感設備,以其深度數據的獲取特點,成為手勢輸入設備的重點研究對象[1]。開源軟件OpenNI(開放式自然交互)能夠方便的訪問和使用Kinect設備,但它只提供了基于手點的4種手勢,微軟的開發包中還沒有集成手勢引擎,這就需要根據實際需要開發手勢識別引擎。
以人手的自然行為觸發三維交互的相關研究在虛擬現實領域有著重要的理論價值和應用價值[2]?;谔摂M現實技術的虛擬裝配系統是一個沉浸式或半沉浸式的虛擬環境,為解決產品的裝配問題提供了一個低成本的快速手段[3]。目前,對于裝配手段多采取數據手套[4]方式,但數據手套價格比較昂貴,設備繁重。而Kinect相對低廉,人手在操作時也更加自然方便。文中由此提出了基于Kinect的手勢識別方法,用多個指尖的相對運動代替整只手,來完成虛擬裝配過程。針對虛擬裝配系統,設計了選取、移動、旋轉和縮放等手勢,以滿足裝配過程中的基本操作,并對Virtools裝配環境中的關鍵問題作了說明。
目前,OpenNI支持的手勢過于簡單,不能完全滿足裝配需求,因此本文開發了針對裝配操作所需的幾種手勢,可以有效實現裝配過程中的基本操作。手勢識別系統框架如圖1所示。

圖1 手勢識別系統框架圖Fig.1 Structure diagram of the gesture regnization system
首先,通過Kinect獲取深度圖像的數據流,系統根據手勢的深度位置分割出手勢,得到手勢的二值圖像;其次,根據指尖特征,分割出指尖并有效跟蹤目標的形變和運動;再次,根據手勢特征進行分析,生成模型參數,根據模型參數對手勢進行分類并按需要定義交互語義;最后,系統根據交互語義去驅動手勢裝配物體。
Kinect采集到的深度信息保存在一個二維數組中,數組中的每一個元素表示該位置的深度像素點對應的實際物體的點到Kinect的距離,單位為mm。利用深度信息,將人手所在深度范圍的圖像提取出來。首先獲得Kinect的深度圖,利用Nite[5]模塊跟蹤手點位置,如圖2(a)所示。在跟蹤到手點位置后,根據手點的深度值做閾值截取,分割出到手的深度圖。為了顯示效果,對深度圖中的手勢區域與背景區域作二值化處理,利用輪廓檢測,提取手勢的最外層輪廓,實現手勢分割。其次,考慮到手的擺放角度不一定正對攝像頭,手臂就可能顯示出來,因此利用以手點為中心的包圍盒,來截取手區域部分。如圖2(b)所示。
想要滿足裝配操作的需求,僅僅一個手點顯然不夠,而指尖是手勢識別中最為常用的特征點。目前,指尖檢測算法中,模板匹配和輪廓曲率分析兩種方法應用較為普遍。但模版匹配方法必須遍歷圖像而導致實時效率不高,曲率分析對精度要求較高而使檢測指尖效果不理想[6]。從Kinect手勢分割結果來看,發現與手掌區域相比,手指比較細長,考慮基于形狀的方法比較合適,并且在形態學操作下,手指區域較易剔除,因此本文利用此特征對指尖進行檢測。
首先,記錄根據分割算法得到的手區域Hand;其次,對手圖像進行膨脹 (dilate)操作后對其做連續十次的腐蝕(erode)操作;再次,根據手掌面積不小于50來確定dilate次數,分割出手掌區域Palm,如圖2(c)。手指部分Finger由公式Finger=Hand-Palm得到,指尖位置則利用指尖距離手心點較遠的這一特征進行提取,如圖2(d)所示。

圖2 指尖特征提取過程圖Fig.2 Diagrams of fingertip festure extraction process
由于手在運動過程中會有一些變化,Kinect攝像頭也會產生噪聲,使得對指尖的三維位置不能穩定地跟蹤。通過Kalman濾波,用前幀指尖位置預測下幀的指尖位置,根據預測位置將指尖區域設置為圖像的感興趣區域(ROI,Region of interest),有效提高分割速度。跟蹤過程為:
1)利用Kalman濾波器預測當前幀的指尖位置,設置ROI區域是以預測指尖點為中心,大小為80×80的窗口。
2)目標匹配。在連續兩幀中,指尖運動假定為勻速,則Kalman濾波器的狀態向量為

式中X(t),Y(t),Z(t)是指尖在 三維中的坐標位 置,Vx(t),Vy(t),Vz(t)是指在每一幀中指尖點的速度,則狀態方程和觀測方程分別為
根據鉆孔抽水試驗資料,含煤地層地下水位整體呈北部高,最南部高,中間低的趨勢(圖5),含煤地層地下水主要從北部自東西兩側向中間匯集再流向南部,同時最南部水位也較高,地下水自最南部流向水位最低處。地下水徑流特征有利于煤層氣自東西向中部聚集,自南北向中部富集,與井田煤層氣的分布特征基本吻合。鉆孔單位涌水量0.003 2~28.070 0 mL/(s·m),富水性極弱,起到水力封閉和封堵的作用,是8號煤層在整個井田煤層含氣量均較高,平均達到18.6m3/t的重要原因。

其中,wt是過程噪聲,具有高斯分布;vk是測量誤差,F為狀態轉化矩陣,H為觀測矩陣。


由此,通過指尖在t幀之前的位置來預測它在t幀時刻的位置。但Kinect本身存在局限性,有時會出現很大誤差,導致指尖出現抖動。為防止預測與指尖的實際位置相差太大,利用Nite手點與指尖深度相差不大的先驗知識,可設定指尖深度在直徑為手長的手點深度范圍內。
3)更新Kalman濾波狀態,用匹配好的指尖位置作為下一幀的預測值來更新Kalman濾波狀態,達到穩定跟蹤的目的。
手勢的表觀特征包括手指數、手指的指尖點、指根點以及指間的夾角等具有標志性的信息,通過指尖檢測得到多個指尖。利用指尖個數狀態、指尖向量和手指相對運動軌跡來劃分手勢類型,并根據不同場景中的具體應用進行交互語義的描述。虛擬裝配過程中的物體操縱主要包括對物體的選取、移動、旋轉、放縮和釋放等操作。
1)選取(Select):當手心點在物體的包圍盒內時,定義一個手指狀態為選取操作,選中的物體就可以做旋轉或縮放動作了。
2)旋轉(Rotate):當物體為選取狀態時,再將大拇指伸出,此時識別出兩指尖與手心3個手點位置,將三點所構平面近似為手掌平面。定義手掌旋轉手勢為旋轉動作,旋轉軸為兩指尖點間的向量V,旋轉角度為旋轉過程中的平面法向Vt與初始平面法向V的角度Angle。
3)放縮(Scale):當物體為選取狀態時,指尖個數為3~5,當至少兩個指尖點與手點的距離都減小/增大時,取每個指尖點與手點放縮距離的平均值為放縮程度,即定義手握拳與張開動作為放縮動作。
4)移動(Move):當手心點在物體包圍盒內并且含大拇指在內的兩只手指的指尖距離在70之內時,定義此手勢為抓取移動狀態,抓取到的物體隨手的移動而移動。
Virtools是一套具備豐富的互動行為模塊的實時三維環境虛擬實境編輯軟件,引入插件式模塊化的開發技術,所有功能以功能塊(Building Block,BB)的形式存在,每個BB實現一個特定的功能,多種BB組合完成各種功能。本文通過開發面向Kinect設備的插件,封裝手勢BB,在Virtools下完成手勢操控。
Virtools的架構中,CK2是最核心的部分,定義了所有行為準則,用來組織和管理其他模塊。為了在Virtools中獲取Kinect的數據和手勢信息設計了手勢插件。該插件中包括手勢封裝,Kinect管理器和Kinect BB,如圖3所示。其中,手勢封裝模塊是將手勢識別中所有方法封裝在一起;Kinect管理器用來獲取使用Kinect設備的能力;Kinect BB模塊實現插件的功能。

圖3 手勢插件結構圖Fig.3 Diagram of gesture plug structure
管理器是Virtools中除BB外最重要的模塊,用來封裝所有的使用方法。設計Kinect管理器封裝相關的手勢偵測和跟蹤算法,并進行管理器注冊,得到處理Kinect的能力,從而讀取Kinect設備提供的手勢信息,實現手勢跟蹤及偵測功能。虛擬裝配交互流程框圖如圖4所示。

圖4 虛擬裝配手勢交互流程框圖Fig.4 Flow chart the virtual assembly of gesture interaction design
在Kinect管理器中創建手心節點和指尖節點完成事件的驅動。當用戶舉起手,系統識別出RaiseHand手勢后,開始跟蹤手點和手指位置。用戶伸出一只手指,將手平移至所需物體上進行Select操作,若手心點在物體包圍盒內時,物體為選中狀態,與手固定為一體;若沒選中,則繼續Select操作。用戶通過展示不同手勢,觸發對虛擬物體相應的操作,并更新相應的狀態信息。管理器只是定義抽象的操作,具體情況要在BB中完成。
手勢與場景交互需要多個BB協同工作,Kinect BB是最核心的部分。它提供給其他相關BB實時更新的手心和指尖位置信息,手的狀態信息,自定義手勢及手勢相關參數。
如圖5所示,在輸出參數引腳中,手心位置:(ScreenX,ScreenY,ScreenZ),Depth指示其世界坐標的Z值;三個指尖位置:(f1 X,f1 Y,f1 Z),(f2 X,f2 Y,f2 Z),(f3 X,f3 Y,f3 Z);HandCreate、HandUpdate和HandDestroy指示手的狀態;Raxis和Rangle指示旋轉軸和旋轉角度;Distance指示放縮程度;其余引腳指示不同手勢。

圖5 Kinect BBFig.5 Kinect BB design
本系統所設計的手勢運用于整個場景中,因此手勢與場景的交互操作在Level層中設計完成。圖6所示即為實時交互設計的BB程序圖。

圖6 手勢與場景交互BB圖Fig.6 The BBs of Gesture and scene interaction design
其中,Hand State BB用來指示手的狀態,Handpoint3D BB用來指示手心點的坐標,Finger1、Finger2、Finger3 BB指示指尖位置信息,Move、Rotate、Scale BB將實現具體的裝配操作,而Kinect BB將所有參數以輸出引腳形式傳入各個相關BB。當Kinect在Virtools中被激活后,首先傳入手心與指尖位 置 坐 標 于Handpoint3D、Finger1、Finger2和Finger3 BB,Hand State BB更改手狀態,然后用Select觸發Select 3D BB進行選取并保持激活狀態,最后用不同手勢激發相應BB,根據BB中傳入的參數,物體進行相應的操作。
本系統以Virtools為三維空間顯示平臺,利用Virtools SDK,VSL,OpenNI及中間件Nite的程序開發包以及OpenCV的圖像處理函數庫,在Windows XP環境下采用面向對象技術以Microsoft Visual Studio 2010為開發工具,設計并完成了手勢操控相關BB的編輯,結合Virtools自帶的BB,成功實現了手勢在虛擬裝配中的交互控制。
圖7描述了不同手勢交替工作,共同完成虛擬裝配的過程。首先,將3DS Max中創建的模型、貼圖等轉化為Virtools的場景文件,導入到Virtools中。然后,用戶通過舉手動作觸發RaiseHand手勢。若觸發成功,找到手位置,用中間的小黃手表示。Select手勢用于選取所需零件,Move、Rotate及Scale手勢則分別完成零件的平移、旋轉和放縮操作,如圖7(a)、(b)、(c)、(d)所示。

圖7 手勢操控虛擬裝配過程實例Fig.7 Example of gesture control virtual assembly process
本文在Kinect只有一個手點的基礎上,利用數學形態學方法檢測出多個指尖,并用Kalman濾波器進行穩定跟蹤,滿足交互過程中的實時性要求。根據裝配需求,基于多指尖特征設計了多種手勢并定義了有效的交互語義,有效提高了裝配的精確性。以Virtools為虛擬裝配開發平臺,將Kinect中的手勢及位置參數信息封裝成一個插件,實現了Virtools與Kinect的實時通信。實驗證明,基于Kinect的三維手勢在虛擬裝配技術中,具有良好的識別效果,能夠滿足復雜裝配環境的要求。Virtools與Kinect的結合也對虛擬現實技術的應用具有重要的推廣作用。
[1]BISWAS K K.Gesture recognition using microsoft kinect[J].Proceedings of the 5th International Conference on Automation,Robotics and Applications,2011:100-103.
[2]郭康德,張明敏.基于視覺技術的三維指尖跟蹤算法[J].計算機研究與發展,2010,47(6):1013-1019.GUO Kang-de,ZHANG Ming-min.3D fingertip tracking algorithm based on computer vision[J].Journal of Computer Research and Development,2010,47(6):1013-1019.
[3]劉江省,姚英學.虛擬裝配中基于數據手套的虛擬操作研究[J].系統仿真學報,2004,16(8):1744-1747.LIU Jiang-sheng,YAO Ying-xue.Virtual manipulation based on data glove in virtual assembly[J].Journal of System Simulation,2004,16(8):1744-1747.
[4]朱英杰,李淳芃.沉浸式虛擬裝配中物體交互特征建模方法研究[J].計算機研究與發展,2011,48(7):1298-1306.ZHU Ying-jie,LI Chun-peng.Interaction feature modeling of virtual object in immersive virtual assembly[J].Journal of Computer Research and Development,2011,48(7):1298-1306.
[5]Prime Sensor NITE 1.3 Algorithms notes[EB/LO].[2010-09-08].http://www.primesense.com/nite.
[6]湯勇,顧宏斌.交互系統中實時手勢分割及指尖檢測方法[J].光電工程,2010,37(7):145-149.TANG Yong,GU Hong-bin.Real-time hand segmentation and fingertip detection for interaction[J].Opto-Electronic Engineering,2010,37(7):145-149.