郭小煥 全太鋒 潘英杰 馬 浩
1(重慶郵電大學 重慶 400065) 2(信號與信息處理重慶市重點實驗室 重慶 400065)
Kinect是由微軟開發的可以提供彩色和深度圖像的3D體感攝影機。Kinect能夠以每秒30幀的頻率實時檢測和跟蹤人體的25個關節并返回其3D空間坐標,實現無標記的人體關節空間位置信息的獲取[1]。人體姿態估計一直是計算機視覺的主要研究方向之一[2],特別是對手部的捕捉,被廣泛應用于行為識別、人機交互、醫療教育等領域。因此,許多學者在進行手勢識別和動作捕捉[3]等研究中使用Kinect進行深度信息的采集。
Kinect的關節捕捉不是絕對的精確。一些學者對Kinect的捕捉精度進行了研究。Xu等[4]在使用Kinect提取步態參數時,認為數據的偏差是由于Kinect在檢測踝部關節時產生了錯誤的識別。Wang等[5]研究了Kinect在進行骨骼追蹤中的關節位置精度,發現檢測到的關節位置平均偏移量在50~100 mm之間。對于如何矯正捕捉精度的偏差,相關的研究較少。Osman等[6]提出使用正向運動學判斷踝關節的位置。Srisen等[7]提出使用光流法進行手部關節的校正,但其需要密集的圖像采集,對光照條件有較大的要求,會嚴重影響人體捕捉的實時性。Rosario等[8]使用粒子濾波器來矯正Kinect輸出的關節旋轉角度。李昕迪等[9]提出人體單關節點的修復算法,利用上下關節的位置關系推斷被遮擋的中間關節的位置,該方法對手部關節的位置矯正效果較差。
針對Kinect對手部關節位置判斷錯誤的問題,本文提出一種判斷手部關節位置的新方法:通過圖像分割提取手臂和手部的深度圖像,利用正向運動學公式推斷出肘部關節和腕部關節的位置后,再分割出手部的深度圖像并計算出質心,解決手部關節位置無法正確判斷的問題。
本文針對Kinect攝像頭在追蹤手部骨骼關節時識別精度低的問題,提出一種用于糾正該跟蹤問題的手部關節位置推斷方法。首先,通過Kinect獲取深度信息并進行前景提??;然后通過閾值分割獲得手臂部分的深度圖像;接著基于正向運動學算法判斷腕部關節的3D空間位置,以此區分手臂與手部的深度圖像;最后對提取出的手部深度圖像利用質心公式推斷手部關節的空間坐標。圖1為手部關節位置判斷方法的流程。
第二代Kinect(以下簡稱Kinect)是微軟于2014年推出的一款3D體感設備[10]。Kinect硬件結構如圖2所示。該傳感器獲得的深度信息,表示物體與傳感器的實際距離。Kinect可以進行實時人體骨骼追蹤,追蹤的關節如圖3所示。

圖3 骨骼追蹤的關節示意圖
Kinect提供了使用深度數據進行前景分割的功能[11]。深度圖像對比圖如圖4所示,圖4(a)是原始深度圖像;通過Kinect為每個對象隨機分配的索引號可以獲得相應的掩碼深度,從而提取出人體的深度圖像,結果如圖4(b)所示;原始的深度圖像目標邊緣有很多噪點,如果直接處理粗糙圖像,則邊緣噪聲對后續骨架的提取和關節判斷具有很大的影響,因此本文使用深度中值濾波方法,在去除孤立噪聲點的同時保留目標邊緣信息[12],平滑后的圖像如圖4(c)所示。

(a)原始深度圖像 (b)掩碼深度圖像 (c)平滑后的深度圖像
人體的運動具有一定的遮擋性,在手臂揮動時,Kinect無法從圖4(c)的人體深度圖像中正確提取出手部的正確位置。為了解決該問題,需要將手臂與手部的深度圖像分離,以獲得精確的手部深度圖像。首先使用金字塔分割算法將深度圖像劃分為均勻的深度塊[13];然后設置深度信息直方圖Hd,根據每個塊的深度值來繪制深度圖像直方圖;再通過閾值分割來劃分人體和手臂。通常人體的軀干部分深度值是深度信息統計中最大的,因此可以將刪除的部分定義如下(假設有S個深度塊):
(1)
式中:ζ表示除手臂之外的部分;q表示深度圖像中深度塊的某一像素。通過選擇閾值來劃分身體部位(區域A)和手臂部位(區域B)。假設存在L個深度值,并且剩余深度塊的總和是N,深度值為i的深度塊數量是n,每個深度值出現的概率為P,得到以下公式:
(2)
區域A和區域B的出現概率滿足以下等式:
(3)
式中:t是假設的選定閾值。區域A和區域B的組間方差滿足以下等式:
(4)
(5)
σ2(t)=PA(ωA-ω0)2+PB(ωB-ω0)2
(6)
式中:ωA和ωB表示區域A和區域B的平均深度值;ω0表示全部人體深度圖像的平均深度值;σ2(t)代表兩個區域的方差,表示了深度分布均勻性的度量。手臂部分的提取是根據深度信息的特征來選擇閾值,從而最大化區域A和區域B之間的方差。兩個區域之間的方差過小,則提取出的圖像會包含過多的身體深度信息,導致提取失敗。因此,最大的方差意味著錯誤分類的概率最小。最佳分割閾值應使得區域A和區域B的方差最大化。最佳閾值T應滿足以下等式:
(7)
要通過深度圖像推斷出正確的手部關節位置,首先需要提高腕部關節的正確識別率。正向運動學原理利用機器人運動學方程,以從該關節參數指定的值計算所述端部執行器的空間位置。以此為基礎,本文提出了一種推斷腕部關節的方法,即在測試者揮動手臂的過程中,通過肩部和肘部的彎曲和伸展角度,判斷出腕部關節的位置。在確定腕部關節的前提下,可以精確地分割出手部的深度圖像,利用質心公式求得手部關節坐標的空間位置。
Kinect的真實世界坐標系如圖5所示,該坐標信息表明了人體與坐標原點的距離(x,y,z)。

圖5 Kinect 3D坐標系
要確定出肩部、肘部和腕部關節的幾何關系(彎曲、伸展)應滿足以下條件:
1)測試者應當正面朝向Kinect并且沿著坐標系的Z軸方向移動,確保準確檢測到人體;
2)肩部和肘部關節的角度信息是確定的,即沒有受到其他物體遮擋;
3)手臂的運動方向應與坐標系的YZ平面平行,以確保腕部關節在X軸上的值與肘部關節的值相同。
關節間的角度與空間關系如圖6所示,腕部空間坐標的計算公式如下:

圖6 人體手臂關節在YZ平面的關系示意圖
W(z)=E(z)+sin(β-α)L
(8)
W(y)=E(y)-cos(β-α)L
(9)
W(x)=E(x)
(10)
式中:W(x)、W(y)和W(z)表示腕部的x、y和z值;E(x)、E(y)和E(z)表示肘部的x、y和z值;L為前臂的長度;角度α是上臂彎曲/伸展的角度;角度β是前臂彎曲/伸展的角度?;谏疃葓D像可以得到前臂長度,以及肩部和肘部的位置信息,因此可以計算出角度α的值,所以對于當前幀,只需要確定角度β的值就可以推斷出腕部關節的位置。手臂的揮動可以看作是勻速平滑的運動,在肩部、肘部、腕部關節都處于追蹤狀態時,可以使用這些確定幀構建出手臂揮動模式的動態列表,對于需要推斷出未知腕部關節位置的幀,可以將肘部的彎曲/伸展角度與列表進行匹配,獲得角度β的值,然后計算出腕部關節的位置,同時更新列表。
確定肘關節和腕關節的位置后,將手臂的深度圖像進行二次分割,僅保留手部的深度圖像。將圖像轉換為二值圖像,使用質心公式求得手部關節的坐標。設二值圖像為I(x,y),目標部分為A,目標的質心(x0,y0)定義如下:
(11)
(12)
實驗環境為:動作捕捉設備Kinect for Windows 2.0,開發環境為Visual Studio 2015的C#平臺,Kinect SDK和Kinect Studio。
實驗電腦配置如下:CPU為Intel Core i5 3.30 GHz,64位處理器,4 GB RAM,視頻采集卡DX11,顯卡為NAIDIA Ge Force GT 940 M,內置USB3.0總線,OS為Windows 10。
本文選擇了10名身高在1.70~1.85 m之間的參與者進行測試。Kinect的放置高度為0.8 m,Kinect與測試者的距離為4 m,測試者在Kinect的Z軸方向上前進并且勻速揮動手臂。在初始狀態時保證測試者的肩部、肘部和腕部關節被正常追蹤,從而建立第一次運動周期的手臂揮動動態列表。分析關節在“追蹤”狀態下和“推斷”狀態下Kinect讀取出的Z值與本文提出方法得出的Z值之間的絕對誤差,最終得到均值和標準差。在“追蹤”狀態和“推斷”狀態時Kinect和本文方法的部分輸出如表1所示。

表1 關節推斷方法與Kinect返回讀數的輸出對比表 m
表2為關節推斷方法Y值和Z值絕對誤差的均值和標準差。可以看出,推斷算法有一個較小的誤差幅值。在關節處于“追蹤”狀態時,Y軸和Z軸上的絕對誤差分別為0.019 9±0.013 7和0.127 0±0.087 5。當Kinect處于“推斷”狀態時的絕對誤差幅度比處于“追蹤”狀態時的絕對誤差幅度更大,Y值為0.068 6±0.018 6,Z值為0.270 0±0.052 0。在“推斷”狀態時,Kinect無法準確檢測到手部關節,只能通過深度圖像推斷其他關節來確定手部關節。深度圖像的精確度越高,誤差越小。本文將手部關節輸出的坐標點位于手部深度圖像中心±0.02 m范圍內認為是一次正確識別,Kinect與本文方法在“追蹤”狀態和“推斷”狀態時的準確率如表3所示。

表2 關節推斷方法絕對誤差的均值和標準差

表3 Kinect與本文方法的準確率 %
本文方法與Kinect的骨骼追蹤方法比較結果如圖7所示。Kinect的骨骼跟蹤方法在人體輪廓清晰的情況下可以獲得較準確的骨骼提取結果,如圖7(c)中的第1幅圖像。在其他情況下,Kinect對關節部位評估的準確度會有較大的誤差,如圖7(b)的第2和第3幅圖。本文方法的結果如圖7(c)所示,與Kinect相比,本文方法可以在身體處于運動狀態或有部分遮擋時獲得更精確的關節定位。

(a)原始深度圖像 (b)Kinect捕捉結果 (c)本文結果
本文提出的手部關節位置推斷方法能有效解決Kinect在無法正確追蹤手部關節時識別精度較低的問題。本文方法基于深度圖像信息進行關節的識別判斷,避免了多余的數據采集,能夠在保證實時性的前提下保持系統的運行效率;基于正向運動學公式,能有效判斷出腕部關節的位置,提高了對腕部和手部關節位置的識別精度。下一步的工作是在大范圍揮動手臂的情況下(肘部和腕部的X值不同)進行精確地關節捕捉,從而使Kinect更好地運用到體育分析和游戲娛樂等領域。