姚 玲 陳建新 潘招來 黃湘君
(南京郵電大學(xué)通信與信息工程學(xué)院 江蘇 南京 210000)
人機交互已有30多年的歷史,其發(fā)展極大地豐富了用戶體驗[1]。在人機交互領(lǐng)域,對人體骨骼姿態(tài)的追蹤已經(jīng)變得越來越重要,這主要是由于它們在醫(yī)療、生物醫(yī)學(xué)、人機界面、虛擬現(xiàn)實、機器人技術(shù)等領(lǐng)域的應(yīng)用[2]。手作為人體骨骼中最靈活的關(guān)節(jié),被認為是最方便、最有效的交流工具,因此對手姿勢的估計一直是一個熱門領(lǐng)域。文獻[3]提出了一種將17個慣性傳感器(IMU)和中央處理器(CPU)集成在可穿戴式感應(yīng)手套上來捕捉手關(guān)節(jié)的自由度。文獻[4]提出了一種在大拇指、中指和手背上分別帶三個IMU傳感器來估計手和手指之間的相對方向。這種基于傳感器的方法雖然準(zhǔn)確度較高但是手上需要佩戴設(shè)備,視野和跟蹤范圍受到一定的限制。文獻[5]提出一種利用更快的卷積神經(jīng)網(wǎng)絡(luò)(CNN)的主干生成矩形區(qū)域檢測手并提取特征,旋轉(zhuǎn)網(wǎng)絡(luò)生成一個與手對齊的估計面來估計手方向。文獻[6]提出了一種利用卷積神經(jīng)網(wǎng)絡(luò)(CNN)來檢測手的邊界框,并將與手邊界框?qū)R的向量的方向作為手的方向?;诰矸e神經(jīng)網(wǎng)絡(luò)的方法需要大量的數(shù)據(jù)集來訓(xùn)練,準(zhǔn)確度高,但是實時性差,并且在環(huán)境改變時會對準(zhǔn)確度有影響。文獻[7]提出了一種利用幾何方法來計算角度并結(jié)合分解四元數(shù)算法(FQA)[8]對手方向進行估計。文獻[9]提出了一種將手的手掌區(qū)域和手指區(qū)域分離,并提取出手掌中心點和手的中指點、拇指點來估計手方向。幾何方法是計算關(guān)節(jié)角度的一種常用方法,簡單易行,但是在準(zhǔn)確獲取關(guān)節(jié)位置信息的基礎(chǔ)上,抖動和噪聲較大,準(zhǔn)確度不高。因此,上述方法對手方向進行估計時的缺陷可歸結(jié)為實時性差以及準(zhǔn)確率低。針對此問題,本文提出一種基于Kinect的手方向?qū)崟r估計系統(tǒng)。該系統(tǒng)可以準(zhǔn)確、實時對手方向進行估計,并利用開放圖形庫(OpenGL)構(gòu)建一個3D的虛擬手模型,模仿手的實時運動,提高了人機交互的體驗。
本文系統(tǒng)框圖如圖1所示,首先通過深度數(shù)據(jù)尋找目標(biāo)用戶,結(jié)合從Kinect獲得骨骼數(shù)據(jù)找到目標(biāo)用戶的手腕點的位置,并利用Holt雙指數(shù)平滑濾波算法對手腕位置的骨骼點坐標(biāo)進行平滑處理;然后將從Kinect獲得手腕點的四元數(shù)轉(zhuǎn)換為歐拉角以便可以直觀地觀察手的方向變化。為了消除由Kinect噪聲引起的歐拉角抖動,利用一種將卡爾曼濾波和中值濾波結(jié)合的算法來平滑歐拉角,濾除噪聲。最后,對計算出的歐拉角進行可視化,主要通過兩種方法,分別是在彩色圖像中繪制代表手方向的坐標(biāo)系以及運用OpenGL構(gòu)建3D手模型。
圖1 手方向?qū)崟r估計系統(tǒng)框圖
深度傳感器(Kinect)以其成本低,提供彩色圖像數(shù)據(jù)以及來自紅外傳感器的深度數(shù)據(jù)的特點而在人機交互領(lǐng)域越來越被研究者青睞[10]。與傳統(tǒng)的彩色攝像頭不同的是,Kinect深度傳感器能夠克服彩色攝像頭易受光線等外界干擾的缺點,準(zhǔn)確跟蹤到視野范圍內(nèi)的人體[11]。Kinect可以同時跟蹤六個用戶,并為這六個用戶分配不同的ID信息。為了防止用戶間的相互干擾,導(dǎo)致從Kinect獲取的數(shù)據(jù)不準(zhǔn)確,本文選取距離Kinect最近的用戶ID作為標(biāo)記用戶ID。然后,將當(dāng)前幀的用戶ID與標(biāo)記用戶ID進行匹配。用戶ID完成匹配之后,檢查當(dāng)前幀的用戶ID的跟蹤狀態(tài),因為只有當(dāng)前幀的用戶ID的狀態(tài)處于被跟蹤時,Kinect才能對其信息進行處理。其算法流程如下:
1) 識別用戶,利用Kinect的深度數(shù)據(jù)找到距離Kinect最近的用戶ID,作為標(biāo)記用戶ID。
2) 搜索當(dāng)前幀的用戶ID,將其與標(biāo)記用戶ID進行匹配。
3) 如果ID值相同,則匹配成功,將當(dāng)前幀的用戶作為目標(biāo)用戶。
4) 檢測目標(biāo)用戶的跟蹤狀態(tài),如果處于被跟蹤狀態(tài),就可以對Kinect輸入幀的信息進行處理。
5) 如果ID匹配不成功或者目標(biāo)用戶狀態(tài)不是被跟蹤時,返回步驟1)重做處理。
開啟骨骼數(shù)據(jù)流后,當(dāng)目標(biāo)用戶出現(xiàn)在Kinect的有效視野范圍內(nèi),Kinect就可以迅速檢測出人體并獲取其骨骼信息[12]。由于從Kinect獲取的骨骼信息存在噪聲和抖動,因此可以通過對不同幀的骨骼信息濾波來減小抖動。濾波不可避免地會存在一定的延遲。為了確保實時性,本文使用Holt雙指數(shù)平滑濾波算法[13],因為其延遲比其他濾波算法要小。Holt雙指數(shù)平滑濾波算法主要是通過5個參數(shù)進行濾波處理,這5個參數(shù)分別為:
平滑參數(shù):代表著處理骨骼數(shù)據(jù)時的平滑量,其值在0~1之間,值越大代表平滑得越多,0代表不平滑,平滑參數(shù)增大得越多,返回的骨骼數(shù)據(jù)的延遲就越大。
修正參數(shù):代表對原始數(shù)據(jù)的修正量,其值在0~1之間,較小的值對原始數(shù)據(jù)修正的速度較慢但會更平滑。
預(yù)測超前期數(shù):其值應(yīng)該大于等于0.5,增大該值能減小濾波的延遲。
抖動半徑參數(shù):代表修正的半徑,如果抖動超過了設(shè)置的這個半徑,將會被糾正到這個半徑之內(nèi)。
最大偏離半徑參數(shù):用來和抖動半徑參數(shù)一起來設(shè)置抖動半徑的最大邊界。
同時,為了減少骨骼點坐標(biāo)的噪聲,本文對五幀連續(xù)幀的數(shù)據(jù)進行加權(quán)平均來更新當(dāng)前幀的骨骼點坐標(biāo)。
常用的兩種表示姿態(tài)的方法是四元數(shù)[14-16]和歐拉角。由于四元數(shù)比歐拉角更復(fù)雜并且不夠直觀,因此本文選用歐拉角來表示手的姿態(tài)。歐拉角是用來描述物體旋轉(zhuǎn)姿態(tài)的三個角度[17]。如圖2所示,ψ、θ和φ分別定義為繞Z軸、Y軸和X軸的旋轉(zhuǎn)角度。
圖2 歐拉角示意圖
如果用卡爾丹角(Tait-Bryan angles)表示,定義歐拉角的轉(zhuǎn)動順序為Z-Y-X,則ψ、θ和φ分別對應(yīng)偏航角(Yaw)、俯仰角(Pitch)、翻滾角(Roll)。
本文首先從Kinect獲得手腕點的四元數(shù)q=[w,x,y,z]。然后根據(jù)式(1)將四元數(shù)轉(zhuǎn)換為歐拉角。
(1)
用式(1)計算歐拉角會存在奇異解問題,發(fā)生自由度的損失。例如,當(dāng)俯仰角為90度時,偏航和翻滾角就變成一個自由度[18]。為了解決這個問題,本文通過設(shè)置合理的閾值來檢測俯仰角的狀態(tài)。由于當(dāng)俯仰角等于±90度時,wy-xz的值等于±0.5,因此,設(shè)置閾值使其盡可能接近0.5。其算法流程如下:
1) 設(shè)置閾值為0.499。
2) 計算四元數(shù)q中的wy-xz的值,如果其值在-0.499到0.499之間,則不存在奇異解問題,用式(1)計算歐拉角。
3)如果其值不在-0.499到0.499之間,則存在奇異解問題,用式(2)計算歐拉角。
(2)
由于Kinect傳感器自身存在的噪聲,使得計算得到的歐拉角存在很大的噪聲并且非常不穩(wěn)定。對姿態(tài)進行濾波常用的算法是卡爾曼濾波[19]??柭鼮V波是一種基于狀態(tài)空間的遞歸濾波算法。其模型包括狀態(tài)空間模型和觀測模型。前者使用狀態(tài)方程來描述相鄰狀態(tài)矩陣的轉(zhuǎn)換定律,后者則反映了實際觀測值與狀態(tài)變量之間的關(guān)系。濾波是將觀測信息和狀態(tài)轉(zhuǎn)移定律結(jié)合起來,以獲得對系統(tǒng)狀態(tài)的最優(yōu)估計。假設(shè)動態(tài)系統(tǒng)的狀態(tài)空間模型是:
xk=Akxk-1+Bkuk+wk
(3)
zk=Hkxk+vk
(4)
式中:k是時間索引;xk是狀態(tài)向量;zk是測量向量;Ak是狀態(tài)轉(zhuǎn)移矩陣;uk是控制向量;Bk是控制矩陣;wk是系統(tǒng)誤差(噪聲);Hk是測量矩陣;vk是測量誤差(噪聲)。wk和vk均為高斯噪聲,均服從高斯分布,即:
wk~N(0,Qk)
(5)
vk~N(0,Rk)
(6)
式中:Qk、Rk分別是wk和vk的協(xié)方差矩陣。
根據(jù)式(3)和式(4),計算過程主要分為預(yù)測和修正兩個階段。在預(yù)測階段,濾波器使用上一狀態(tài)的估計對當(dāng)前狀態(tài)進行預(yù)測。主要計算過程如下:
(7)
(8)
式中:yk是測量誤差;Kk是最佳卡爾曼增益;xk/k為修正后的狀態(tài)值;Pk/k為修正后的均方誤差。
傳統(tǒng)的卡爾曼濾波算法僅適用于線性高斯系統(tǒng),且當(dāng)描述系統(tǒng)動態(tài)特性的數(shù)學(xué)模型和噪聲估計模型不準(zhǔn)確時,無法獲得良好的效果[20]。并且,卡爾曼濾波是一個遞歸過程[21],所以隨著濾波次數(shù)增加,舍入誤差將逐漸累積。針對這個問題,本文提出一種將卡爾曼濾波和中值濾波結(jié)合的算法,首先利用卡爾曼濾波器消除在每一幀中歐拉角的噪聲。然后,對連續(xù)幀的卡爾曼濾波輸出進行中值濾波,將中值濾波之后輸出的歐拉角作為代表手旋轉(zhuǎn)方向的角。
本文實驗環(huán)境為一臺配置為Intel Xeon E5 2.4 GHz處理器,48 GB內(nèi)存,Windows 10 64位操作系統(tǒng)的計算機,一個用于捕獲手部動作的深度相機Kinect v2。
為了驗證本文方法與卡爾曼濾波相比平滑效果更好,設(shè)計實驗一如下:將手沿骨骼方向任意旋轉(zhuǎn),并從中選取手水平、手垂直和手傾斜時的這三個代表狀態(tài),繪制了在這三個狀態(tài)時不同方法下的歐拉角變化曲線。
實驗一的結(jié)果如圖3所示,本文方法和卡爾曼濾波都對原始歐拉角有平滑效果,但是本文方法的平滑效果更好,使得歐拉角的波動幅度減小,變化曲線趨于更平緩,減小歐拉角的抖動的效果更明顯。
(a) 手水平時的歐拉角濾波效果
(b) 手垂直時的歐拉角濾波效果
(c) 手傾斜時的歐拉角濾波效果圖3 手不同狀態(tài)時歐拉角的濾波效果
當(dāng)手掌平面垂直于Kinect平面時,偏航角Yaw可以表示手沿骨骼旋轉(zhuǎn)的角度。實驗數(shù)據(jù)測量到,當(dāng)手掌平面垂直于Kinect平面且正對時,偏航角等于0。當(dāng)手逆時針旋轉(zhuǎn)時,該角度為正;當(dāng)手順時針旋轉(zhuǎn)時,該角度為負。
為了驗證本文方法與卡爾曼濾波相比對歐拉角的濾波效果更好,從而使歐拉角更加穩(wěn)定,設(shè)計實驗二如下:將手旋轉(zhuǎn)到任意11個偏航角值,然后,計算手旋轉(zhuǎn)到這11個角度下不同方法濾波后歐拉角的方差。實驗二的結(jié)果如表1-表3所示,表中分別列出了Roll、Pitch、Yaw角的原始方差、經(jīng)過卡爾曼濾波后的方差以及經(jīng)過本文方法濾波后的方差。從實驗結(jié)果可以看出,經(jīng)過本文方法濾波后歐拉角的方差這11個角度下都要小于經(jīng)過卡爾曼濾波后歐拉角的方差。
表1 不同方法濾波后Roll角的方差比較
表2 不同方法濾波后Pitch的方差比較
表3 不同方法濾波后Yaw的方差比較
重復(fù)上述實驗10次,得到歐拉角方差的平均值。表4列出了卡爾曼濾波和本文方法對原始數(shù)據(jù)方差減小的程度??梢钥闯?,與卡爾曼濾波相比,本文方法對Roll、Pitch、Yaw這三個角原始數(shù)據(jù)的方差的減小程度更大,分別比卡爾曼濾波多減小11百分點、14百分點、15百分點,從而使歐拉角的穩(wěn)定性更好。
表4 不同方法對原始數(shù)據(jù)方差減小的程度比較(%)
本系統(tǒng)可以得到手在任何姿勢下的角度,并將角度可視化到彩色圖像上和OpenGL構(gòu)建的3D手模型上,為了驗證可視化效果,設(shè)計實驗三如下:站在Kinect攝像頭面前,旋轉(zhuǎn)手,在彩色圖像上繪制了一個與Kinect具有相同初始狀態(tài)的坐標(biāo)系,然后將計算得到的歐拉角傳遞給坐標(biāo)系和OpenGL構(gòu)建的3D手模型。實驗三的結(jié)果如圖4所示,圖4展示了手旋轉(zhuǎn)在一系列連續(xù)幀的彩色圖像和OpenGL虛擬手模型上的估計結(jié)果,可以看出彩色圖像中的坐標(biāo)系和OpenGL構(gòu)建的3D手模型都隨手的旋轉(zhuǎn)而旋轉(zhuǎn),能夠準(zhǔn)確地模仿手的旋轉(zhuǎn)運動。由于本文方法是基于Kinect骨骼點的四元數(shù)進行手方向估計,Kinect的幀率為30幀/s,滿足實時性要求。
圖4 手方向估計結(jié)果
本文是基于Kinect的手方向?qū)崟r估計系統(tǒng)。該系統(tǒng)利用Holt雙指數(shù)平滑濾波算法平滑Kinect的骨骼數(shù)據(jù),根據(jù)骨骼數(shù)據(jù)定位到手的位置。由于四元數(shù)旋轉(zhuǎn)較復(fù)雜且不直觀,該系統(tǒng)將四元數(shù)轉(zhuǎn)換為歐拉角,但是在此過程中會出現(xiàn)奇異解問題,該系統(tǒng)通過設(shè)置合理的閾值的方法來解決,使得轉(zhuǎn)換過來的歐拉角不會發(fā)生自由度損失。為了克服Kinect噪聲對歐拉角的影響,該系統(tǒng)提出一種將卡爾曼濾波和中值濾波結(jié)合的算法。實驗結(jié)果表明,與卡爾曼濾波相比,該方法能更有效地消除歐拉角中的噪聲,使得歐拉角更穩(wěn)定。為了驗證系統(tǒng)的準(zhǔn)確性和實時性,本文在彩色圖像中對手方向進行估計,同時運用OpenGL建立了3D手模型,可以實時準(zhǔn)確地模仿手的運動。但是該系統(tǒng)在手不是沿骨骼方向運動時對手方向估計不準(zhǔn)確,因為會出現(xiàn)手掌平面將手腕點遮擋的情況,導(dǎo)致骨骼點不能定位到手腕點,因此,優(yōu)化系統(tǒng),使其能夠解決此問題是下一步的研究方向。