(山東科技大學 電子信息工程學院,山東 青島 266590)
人機交互技術是研究人與計算機之間相互作用方式的技術,其重點在于通過改善使用者與計算機間的交互方式,提高交互的真實性與沉浸感[1-2]。由于傳統的鼠標、鍵盤等輸入設備的限制,使用者向計算機發送請求依舊是單通道的形式[3],輸入輸出的不平衡也導致使用者無法直接、主動地與研究對象進行自然交互。若能將人手用于交互操作,直接通過人手與仿真環境交互,發揮其多自由度的優勢,將極大地提高用戶在人機交互中的真實性感受,人手控制交互的技術不僅具有理論意義,在實際應用中也具有很大的研究價值。
早期的人手控制交互研究,主要致力于開發專用的硬件設備對手勢進行采集,Grimes[4]申請的“Data Glove”數據手套專利,利用彎曲傳感器實現了獲取手指運動的結果。Davis等[5]通過貼片標記的方式獲取手勢數據,得到區分識別7種不同手勢的結果。該類研究受到所用設備昂貴、受標記物等多種因素影響限制。Kinect作為帶有深度信息的體感輸入設備[6],價格低廉且無需借助外部標記即可對裸手識別。近年來,基于Kinect進行手勢識別的研究有諸多進展,針對手勢實現靜態與動態識別主要可概括為支持向量機算法[7-9]、隱馬爾可夫模型[10-13]和動態時間規整[14-16]等方法。但該類研究僅對固定手勢進行識別,忽略了手部的實時運動信息。
國內外也出現了針對手部特征信息提取的研究,以期獲取更為豐富的手部追蹤數據。Kirac等[17]利用區塊識別法實現了基于Kinect的實時手位估計,將人手劃分為21個區域做動態識別處理;Raheja等[18]利用手指與掌心檢測算法實現了利用Kinect追蹤指尖與手掌位置;Braun等[19]利用隨機決策森林與機器學習的方法實現了Kinect對人手的實時追蹤。Metrilus Gmbh公司[20-21]利用大量數據歸納的決策樹特征值并訓練Aiolos追蹤庫,實現了手指關節點位置定位。現有研究僅對原始數據作特征值分析處理,利用手部數據驅動虛擬手參與交互的研究存在不足。
本研究利用Aiolos庫與樸素貝葉斯算法追蹤獲取手部特征信息,通過數據的跨平臺傳輸與運動變換驅動虛擬手。結果驗證本研究中的手部特征點數據較Kinect官方SDK骨架追蹤特征點數有大幅提升,利用追蹤數據驅動虛擬手擺脫了傳統交互限制,可發揮人手多自由度優勢,對于虛擬現實研究中交互性與沉浸感的提高具有重要意義。
基于Kinect的虛擬手驅動算法流程主要通過Kinect獲取人手深度圖像,結合Aiolos追蹤庫獲取關鍵點數據,在虛幻引擎環境下逐幀更新數據流驅動虛擬手運動。可分為原始數據采集、Aiolos數據追蹤處理、數據流跨平臺傳輸和虛幻引擎平臺下的虛擬手驅動等4個模塊。設計流程如圖1所示。

圖1 基于Kinect深度信息的虛擬手驅動算法流程Fig.1 The algorithm process of driving virtual hand based on Kinect depth data
深度圖像與追蹤骨架等原始數據通過Kinect SDK采集[22],深度數據由校準方程標定,Aiolos庫在原始數據基礎上完成初始化,校正骨架后通過腕部JointType_Wrist節點完成手部區域的分割提取[23],采用貝葉斯算法與Aiolos決策樹識別匹配獨立手指骨架,獲取手部關鍵點數據。并通過指數平滑和EMA算法完成對點位的運動預測,降低抖動與偽影誤差對追蹤結果產生的影響。
Kinect是微軟開發設計的一款帶有深度信息的運動感應設備,提供自然用戶界面,檢測人體運動、手勢、語音命令及人臉識別,可在不借助手動控制設備的情況下與虛擬環境進行交互。其獲取深度數據所采用的TOF技術主要通過測量光脈沖之間的傳輸延遲時間來計算深度信息。
Kinect的數據流主要由中間層即Kinect SDK處理,用于應用層與硬件層的通訊和數據傳輸。Kinect SDK可分為Kinect驅動程序、Kinect運行時環境與多平臺API。以深度信息追蹤骨架為例,SDK通過程序驅動傳感器工作,然后通過骨架追蹤中間件識別深度圖像中人體位置,跟蹤用戶站立(25節點)或坐姿(10節點),每個關節相對于Kinect傳感器定位在三維空間中,作為Kinect傳感器的偏移量給出。以使用時的視角定義X軸指向右側,Y軸指向上方,Z軸從設備指向用戶。深度數據用像素表示,X軸數據范圍-2.2~2.2 m,總范圍4.2 m,Y軸范圍是-1.6~1.6 m,Z軸范圍是0~4 m。由于Kinect深度數據與骨骼追蹤數據測量方法的不同,需要采用坐標映射的方法將骨骼追蹤點數據從骨架數據空間轉換到深度圖像的二維空間中。獲取的實時三維坐標數據傳遞給應用層,實現傳感器硬件到應用層間數據流的雙向傳輸功能。
獲取原始數據需要對Kinect參數初始化[24]。深度與骨架幀數據源暴露元數據并賦予對應讀取器訪問深度幀元數據的權限。幀數據源開啟運行讀取器,通過事件注冊或輪詢方式訪問從傳感器逐幀獲取圖像。當幀數據被Kinect捕獲,幀事件逐幀發送幀引用,直至幀數據獲取完畢。
Kinect獲取原始數據信息中的深度值是相對距離,假設原始圖像某點p的深度值為dr,則實際深度距離d的標定校準方程[25]為:
d=Ktan(Hdr+L)-O。
(1)
其中,實際的深度距離以cm為單位,K=12.36 cm,H=3.50×10-4rad,L=1.18 rad,O=3.70 cm。校正數據正切近似值平方和的偏差為0.33cm2。利用上述校準函數獲取真實深度數據后,可通過坐標映射求得p點的實際位置,設(i,j)為p點投射到Kinect原始圖像上的像素位置,(x,y,z)為p點在空間中的實際位置。利用投射點結合深度數據的(i,j,d)求解實際位置(x,y,z)的轉換式如公式(2)~(4)所示。
(2)
(3)
z=d。
(4)
其中,u×v為Kinect獲取到的深度圖像平面尺寸,轉換控制常量c取值為0.002 1,此轉換過程中p點實際位置重構的精度控制到1 cm以內。控制臺負責Kinect數據流的獲取,校準后的深度數據轉換成EmguCV的Image〈Bgr,byte〉結構體在子線程窗口顯示。骨架數據標記腕部JointType_Wrist關節點,由Aiolos庫作手部特征值數據的追蹤處理。
Aiolos追蹤庫是由提供深度信息咨詢服務、定制多類型基于深度傳感器3D實時應用解決方案的Metrilus公司開發的手指追蹤庫。該類庫配合Kinect SDK使用,依賴于SDK提供的身體骨骼追蹤數據,Aiolos庫在Kinect獲取的骨架數據基礎上完成初始化,并通過深度圖像標記的腕部JointType_Wrist節點將人手深度信息與背景分割。為了保證追蹤點數據定位準確,本研究使用最小二乘法擬合,將獲取到的骨架追蹤數據在空間方向上校正,使其與Kinect投射平面保持平行。
校正平面的法向量定義為(a,b,c),骨架數據的校正即為針對骨骼節點的旋轉變換。假設校正平面繞X軸旋轉角度為α,繞Y軸旋轉角度為β時與投射平面平行,則旋轉角度分別為:
(5)
(6)
(7)
(8)
追蹤庫以大量輸入數據作為樣本,通過貝葉斯算法訓練特征值,樸素貝葉斯分類器是一種基于獨立假設貝葉斯定理的簡單概率分類器。假設樣本每個特征與其他特征都不相關,根據先驗概率和計算給定的待分類實例屬于各個類別的條件概率聯合求得后驗概率,選取計算所得后驗概率最高的類別,進行非確定性的決策。提升Aiolos庫提供的決策樹搜索手部特征信息的速度與精度。假設區域內任意點p可由訓練樣本集合進行描述,分類給定訓練數據(a1,a2,…,am)的條件下,找出最可能的類特征值點c(p)。由極大后驗假設可求出:
(9)
樸素貝葉斯算法假設給定目標點是在樣本數據之間,相互條件獨立。基于此,應用貝葉斯公式可將公式(9)修正為:
(10)
其中,P(c)為c的先驗概率,P(aj|c)為訓練樣本中不同特征點組合出現概率估計。通過測量兩點間深度差異,分析像素位置特征。針對像素位置x:
(11)
Aiolos決策樹追蹤手部骨架,根據特征值獲取手部關鍵點數據,并通過坐標映射函數進行坐標映射。對深度值進行歸一化處理,可保證關鍵點不受深度數據的影響。關鍵點序列與空間位置信息以鍵值對形式存儲,某幀手部特征關鍵點空間位置提取數據如表1所示。

表1 手部特征關鍵點空間位置提取數據Tab.1 Spatial location data of the key points of a hand
受原始深度圖像產生的抖動和偽影誤差的影響,關鍵點數據追蹤結果的不可靠性會升高,基于此,本研究引入指數平滑和EMA算法對追蹤數據過程進行優化。在追蹤關鍵點位置不變的理想情況下,僅考慮受到深度圖像抖動影響,假設當前關鍵點為點p,更新前關鍵點為點q,則指數平滑后下一幀關鍵點p′為:
p′=q+s(p-q),
(12)
其中,s是平滑因子常量,根據需求在0≤s≤1范圍內取值負責指數平滑。指數移動平均(exponential moving average,EMA)算法用于追蹤數據丟失時預測關鍵點數據位置,借助關鍵點數據值丟失前的幀隊列進行預測:
St=wyt+(1-w)st-1,
(13)
其中,t為讀取當前隊列所在幀,y為觀察值,權重因子w取值范圍為0 圖2 手部關鍵點數據追蹤對比圖Fig.2 The contrast diagram with the key points of hand 通過對比可知,使用傳統KinectSDK方式如圖2(a)中圓形區域所示,共可獲取4個手部關鍵節點,僅可根據節點間距離的閾值判斷當前張開握拳手勢,識別節點較少,手勢單一。如圖2(b)所示,根據本研究所提出的方法可獲取15個手部關鍵節點,并進一步細分為5組節點模擬手部關節,豐富的節點數據控制虛擬手骨骼節點的旋轉位移,有利于更精細化地驅動虛擬手。 虛擬手驅動處理以虛幻引擎為開發環境,采用數據表形式進行數據流傳輸。通過虛幻引擎提供的UDataTable讀寫組件,可將引擎外部的大量復雜數據整理為通用字符序列存放于臨時CSV文件中,由引擎逐幀讀取數據流,該設計可有效地解決數據多樣性與平臺差異性的問題,提高處理效率。 CSV文件將表格數據以文本形式存儲,避免類似二進制數字被解譯為復雜數據,具有良好的跨平臺性能。手部關鍵點數據寫入文件時,需要聲明包含有CSV文件路徑名稱的字符串變量;在每幀遍歷關鍵點數據時,通過文件流處理中的字符串追加函數,將數據與控制臺顯示同步寫入。 虛幻引擎的UDataTable組件通過自定義行結構,用于導入器識別DataTable數據表。傳統的UDataTable組件僅支持讀取靜態數據,由于CSV文件數據會隨著外部數據更新而發生改變,這里提出采用C++動態加載*.csv文件的思路。通過動態加載至虛幻引擎的數據流,由關卡藍圖完成數據遍歷,經過運動變換得到旋轉矢量存儲在對應的Orientation變量中,獲取到手部控制數據即可對仿真環境的虛擬手進行驅動設計。 與傳統預設動畫序列的方式不同,該設計通過Transform Bone控制器驅動虛擬手,該控制器主要應用在虛幻引擎的捏臉系統中,通過修改特定骨骼變形調整模型蒙皮的形態。在獲取手部關鍵點且經過運動變換得到數據流后,借助Transform Bone控制器分別綁定虛擬手模型的各骨骼節點,靈活處理各骨骼節點的平移、旋轉運動,避免了預設動畫序列單一性,滿足外部數據驅動設計實時性與多樣性要求。基于虛擬手建模導入虛幻引擎的骨架網格物體包含腕部與手指多個骨骼節點,將Kinect識別的腕部JointType_Wrist節點平移與旋轉數據作用于虛擬手根骨骼,控制虛擬手在世界坐標系的移動與旋轉;以根節點為原點建立局部坐標系,通過關鍵點運動變換后存儲在Orientation變量中的旋轉信息作為手指控制數據,綁定Transform Bone控制器函數驅動手指骨骼,在局部坐標系下相對于根節點運動。手部控制數據驅動虛擬手運動的藍圖設計如圖3所示,獲取到手部關鍵點數據通過運動變換后的旋轉平移數據存儲,對應作用在各自Transform Bone控制器上,動態控制虛擬手各骨骼關節的坐標點和旋轉矢量變化,從而實現虛擬手驅動。 圖3 手部控制數據驅動虛擬手的藍圖設計Fig.3 The blueprint design of virtual hand driven by hand control data 為對Kinect獲取數據驅動虛擬手可行性進行驗證,本研究采用VS 2015作為數據獲取開發環境,并以虛幻引擎作為驅動虛擬手平臺。使用Kinect采集300幀人手實時運動狀態圖像,通過對獲取到的原始數據深度校準標定和平滑優化去除抖動后,實現了對手部特征關鍵點數據追蹤,數據流經跨平臺傳輸和運動變換處理后驅動虛擬手的結果與帶有追蹤關鍵點的紅外圖像數據對比如圖4所示。 六組手勢包含了手部伸展、握拳及各種手指屈伸狀態,代表了虛擬手的屈伸與收展運動情況,可驗證多種手部運動狀態下虛擬手骨骼關節的圖形表示,以及利用手部追蹤數據驅動虛擬手的可實施性。實驗結果表明,通過校準方程和最小二乘法擬合后,可對原始圖像準確迅速獲取手部追蹤數據,手部追蹤在彎屈狀態下丟失的數據由EMA算法預測彌補,跨平臺數據流傳輸和骨骼綁定驅動效果可滿足人手直接參與交互的要求。 圖4 六組帶有關鍵點的紅外圖像與虛擬手驅動效果對比圖Fig.4 Six groups of infrared image with key points and the effect of driving virtual hand 基于Kinect傳感器可獲取深度信息的特點,研究了手部追蹤數據驅動虛擬手算法,利用Kinect獲取手部關鍵點數據實現對虛擬手驅動。相較于Kinect SDK骨架追蹤數據,本方法獲取到的手部關鍵點數據更為豐富,對于人手多自由度運動還原有較大提高。利用數據驅動虛擬手可突破傳統交互的限制,在不借助手動控制設備情況下與虛擬環境進行自然交互。該研究應用于礦井災害動態演化技術驗證平臺,可以提高平臺的交互性和沉浸感。同時也可廣泛應用在虛擬現實項目開發中。
3 驅動虛擬手設計
3.1 數據流跨平臺讀寫和動態加載
3.2 基于藍圖的虛擬手驅動

4 結果驗證

5 結語