郭小煥 全太鋒 潘英杰 馬 浩
1(重慶郵電大學(xué) 重慶 400065) 2(信號(hào)與信息處理重慶市重點(diǎn)實(shí)驗(yàn)室 重慶 400065)
Kinect是由微軟開發(fā)的可以提供彩色和深度圖像的3D體感攝影機(jī)。Kinect能夠以每秒30幀的頻率實(shí)時(shí)檢測(cè)和跟蹤人體的25個(gè)關(guān)節(jié)并返回其3D空間坐標(biāo),實(shí)現(xiàn)無標(biāo)記的人體關(guān)節(jié)空間位置信息的獲取[1]。人體姿態(tài)估計(jì)一直是計(jì)算機(jī)視覺的主要研究方向之一[2],特別是對(duì)手部的捕捉,被廣泛應(yīng)用于行為識(shí)別、人機(jī)交互、醫(yī)療教育等領(lǐng)域。因此,許多學(xué)者在進(jìn)行手勢(shì)識(shí)別和動(dòng)作捕捉[3]等研究中使用Kinect進(jìn)行深度信息的采集。
Kinect的關(guān)節(jié)捕捉不是絕對(duì)的精確。一些學(xué)者對(duì)Kinect的捕捉精度進(jìn)行了研究。Xu等[4]在使用Kinect提取步態(tài)參數(shù)時(shí),認(rèn)為數(shù)據(jù)的偏差是由于Kinect在檢測(cè)踝部關(guān)節(jié)時(shí)產(chǎn)生了錯(cuò)誤的識(shí)別。Wang等[5]研究了Kinect在進(jìn)行骨骼追蹤中的關(guān)節(jié)位置精度,發(fā)現(xiàn)檢測(cè)到的關(guān)節(jié)位置平均偏移量在50~100 mm之間。對(duì)于如何矯正捕捉精度的偏差,相關(guān)的研究較少。Osman等[6]提出使用正向運(yùn)動(dòng)學(xué)判斷踝關(guān)節(jié)的位置。Srisen等[7]提出使用光流法進(jìn)行手部關(guān)節(jié)的校正,但其需要密集的圖像采集,對(duì)光照條件有較大的要求,會(huì)嚴(yán)重影響人體捕捉的實(shí)時(shí)性。Rosario等[8]使用粒子濾波器來矯正Kinect輸出的關(guān)節(jié)旋轉(zhuǎn)角度。李昕迪等[9]提出人體單關(guān)節(jié)點(diǎn)的修復(fù)算法,利用上下關(guān)節(jié)的位置關(guān)系推斷被遮擋的中間關(guān)節(jié)的位置,該方法對(duì)手部關(guān)節(jié)的位置矯正效果較差。
針對(duì)Kinect對(duì)手部關(guān)節(jié)位置判斷錯(cuò)誤的問題,本文提出一種判斷手部關(guān)節(jié)位置的新方法:通過圖像分割提取手臂和手部的深度圖像,利用正向運(yùn)動(dòng)學(xué)公式推斷出肘部關(guān)節(jié)和腕部關(guān)節(jié)的位置后,再分割出手部的深度圖像并計(jì)算出質(zhì)心,解決手部關(guān)節(jié)位置無法正確判斷的問題。
本文針對(duì)Kinect攝像頭在追蹤手部骨骼關(guān)節(jié)時(shí)識(shí)別精度低的問題,提出一種用于糾正該跟蹤問題的手部關(guān)節(jié)位置推斷方法。首先,通過Kinect獲取深度信息并進(jìn)行前景提??;然后通過閾值分割獲得手臂部分的深度圖像;接著基于正向運(yùn)動(dòng)學(xué)算法判斷腕部關(guān)節(jié)的3D空間位置,以此區(qū)分手臂與手部的深度圖像;最后對(duì)提取出的手部深度圖像利用質(zhì)心公式推斷手部關(guān)節(jié)的空間坐標(biāo)。圖1為手部關(guān)節(jié)位置判斷方法的流程。
第二代Kinect(以下簡(jiǎn)稱Kinect)是微軟于2014年推出的一款3D體感設(shè)備[10]。Kinect硬件結(jié)構(gòu)如圖2所示。該傳感器獲得的深度信息,表示物體與傳感器的實(shí)際距離。Kinect可以進(jìn)行實(shí)時(shí)人體骨骼追蹤,追蹤的關(guān)節(jié)如圖3所示。
圖3 骨骼追蹤的關(guān)節(jié)示意圖
Kinect提供了使用深度數(shù)據(jù)進(jìn)行前景分割的功能[11]。深度圖像對(duì)比圖如圖4所示,圖4(a)是原始深度圖像;通過Kinect為每個(gè)對(duì)象隨機(jī)分配的索引號(hào)可以獲得相應(yīng)的掩碼深度,從而提取出人體的深度圖像,結(jié)果如圖4(b)所示;原始的深度圖像目標(biāo)邊緣有很多噪點(diǎn),如果直接處理粗糙圖像,則邊緣噪聲對(duì)后續(xù)骨架的提取和關(guān)節(jié)判斷具有很大的影響,因此本文使用深度中值濾波方法,在去除孤立噪聲點(diǎn)的同時(shí)保留目標(biāo)邊緣信息[12],平滑后的圖像如圖4(c)所示。
(a)原始深度圖像 (b)掩碼深度圖像 (c)平滑后的深度圖像
人體的運(yùn)動(dòng)具有一定的遮擋性,在手臂揮動(dòng)時(shí),Kinect無法從圖4(c)的人體深度圖像中正確提取出手部的正確位置。為了解決該問題,需要將手臂與手部的深度圖像分離,以獲得精確的手部深度圖像。首先使用金字塔分割算法將深度圖像劃分為均勻的深度塊[13];然后設(shè)置深度信息直方圖Hd,根據(jù)每個(gè)塊的深度值來繪制深度圖像直方圖;再通過閾值分割來劃分人體和手臂。通常人體的軀干部分深度值是深度信息統(tǒng)計(jì)中最大的,因此可以將刪除的部分定義如下(假設(shè)有S個(gè)深度塊):
(1)
式中:ζ表示除手臂之外的部分;q表示深度圖像中深度塊的某一像素。通過選擇閾值來劃分身體部位(區(qū)域A)和手臂部位(區(qū)域B)。假設(shè)存在L個(gè)深度值,并且剩余深度塊的總和是N,深度值為i的深度塊數(shù)量是n,每個(gè)深度值出現(xiàn)的概率為P,得到以下公式:
(2)
區(qū)域A和區(qū)域B的出現(xiàn)概率滿足以下等式:
(3)
式中:t是假設(shè)的選定閾值。區(qū)域A和區(qū)域B的組間方差滿足以下等式:
(4)
(5)
σ2(t)=PA(ωA-ω0)2+PB(ωB-ω0)2
(6)
式中:ωA和ωB表示區(qū)域A和區(qū)域B的平均深度值;ω0表示全部人體深度圖像的平均深度值;σ2(t)代表兩個(gè)區(qū)域的方差,表示了深度分布均勻性的度量。手臂部分的提取是根據(jù)深度信息的特征來選擇閾值,從而最大化區(qū)域A和區(qū)域B之間的方差。兩個(gè)區(qū)域之間的方差過小,則提取出的圖像會(huì)包含過多的身體深度信息,導(dǎo)致提取失敗。因此,最大的方差意味著錯(cuò)誤分類的概率最小。最佳分割閾值應(yīng)使得區(qū)域A和區(qū)域B的方差最大化。最佳閾值T應(yīng)滿足以下等式:
(7)
要通過深度圖像推斷出正確的手部關(guān)節(jié)位置,首先需要提高腕部關(guān)節(jié)的正確識(shí)別率。正向運(yùn)動(dòng)學(xué)原理利用機(jī)器人運(yùn)動(dòng)學(xué)方程,以從該關(guān)節(jié)參數(shù)指定的值計(jì)算所述端部執(zhí)行器的空間位置。以此為基礎(chǔ),本文提出了一種推斷腕部關(guān)節(jié)的方法,即在測(cè)試者揮動(dòng)手臂的過程中,通過肩部和肘部的彎曲和伸展角度,判斷出腕部關(guān)節(jié)的位置。在確定腕部關(guān)節(jié)的前提下,可以精確地分割出手部的深度圖像,利用質(zhì)心公式求得手部關(guān)節(jié)坐標(biāo)的空間位置。
Kinect的真實(shí)世界坐標(biāo)系如圖5所示,該坐標(biāo)信息表明了人體與坐標(biāo)原點(diǎn)的距離(x,y,z)。
圖5 Kinect 3D坐標(biāo)系
要確定出肩部、肘部和腕部關(guān)節(jié)的幾何關(guān)系(彎曲、伸展)應(yīng)滿足以下條件:
1)測(cè)試者應(yīng)當(dāng)正面朝向Kinect并且沿著坐標(biāo)系的Z軸方向移動(dòng),確保準(zhǔn)確檢測(cè)到人體;
2)肩部和肘部關(guān)節(jié)的角度信息是確定的,即沒有受到其他物體遮擋;
3)手臂的運(yùn)動(dòng)方向應(yīng)與坐標(biāo)系的YZ平面平行,以確保腕部關(guān)節(jié)在X軸上的值與肘部關(guān)節(jié)的值相同。
關(guān)節(jié)間的角度與空間關(guān)系如圖6所示,腕部空間坐標(biāo)的計(jì)算公式如下:
圖6 人體手臂關(guān)節(jié)在YZ平面的關(guān)系示意圖
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為前臂的長(zhǎng)度;角度α是上臂彎曲/伸展的角度;角度β是前臂彎曲/伸展的角度?;谏疃葓D像可以得到前臂長(zhǎng)度,以及肩部和肘部的位置信息,因此可以計(jì)算出角度α的值,所以對(duì)于當(dāng)前幀,只需要確定角度β的值就可以推斷出腕部關(guān)節(jié)的位置。手臂的揮動(dòng)可以看作是勻速平滑的運(yùn)動(dòng),在肩部、肘部、腕部關(guān)節(jié)都處于追蹤狀態(tài)時(shí),可以使用這些確定幀構(gòu)建出手臂揮動(dòng)模式的動(dòng)態(tài)列表,對(duì)于需要推斷出未知腕部關(guān)節(jié)位置的幀,可以將肘部的彎曲/伸展角度與列表進(jìn)行匹配,獲得角度β的值,然后計(jì)算出腕部關(guān)節(jié)的位置,同時(shí)更新列表。
確定肘關(guān)節(jié)和腕關(guān)節(jié)的位置后,將手臂的深度圖像進(jìn)行二次分割,僅保留手部的深度圖像。將圖像轉(zhuǎn)換為二值圖像,使用質(zhì)心公式求得手部關(guān)節(jié)的坐標(biāo)。設(shè)二值圖像為I(x,y),目標(biāo)部分為A,目標(biāo)的質(zhì)心(x0,y0)定義如下:
(11)
(12)
實(shí)驗(yàn)環(huán)境為:動(dòng)作捕捉設(shè)備Kinect for Windows 2.0,開發(fā)環(huán)境為Visual Studio 2015的C#平臺(tái),Kinect SDK和Kinect Studio。
實(shí)驗(yàn)電腦配置如下:CPU為Intel Core i5 3.30 GHz,64位處理器,4 GB RAM,視頻采集卡DX11,顯卡為NAIDIA Ge Force GT 940 M,內(nèi)置USB3.0總線,OS為Windows 10。
本文選擇了10名身高在1.70~1.85 m之間的參與者進(jìn)行測(cè)試。Kinect的放置高度為0.8 m,Kinect與測(cè)試者的距離為4 m,測(cè)試者在Kinect的Z軸方向上前進(jìn)并且勻速揮動(dòng)手臂。在初始狀態(tài)時(shí)保證測(cè)試者的肩部、肘部和腕部關(guān)節(jié)被正常追蹤,從而建立第一次運(yùn)動(dòng)周期的手臂揮動(dòng)動(dòng)態(tài)列表。分析關(guān)節(jié)在“追蹤”狀態(tài)下和“推斷”狀態(tài)下Kinect讀取出的Z值與本文提出方法得出的Z值之間的絕對(duì)誤差,最終得到均值和標(biāo)準(zhǔn)差。在“追蹤”狀態(tài)和“推斷”狀態(tài)時(shí)Kinect和本文方法的部分輸出如表1所示。
表1 關(guān)節(jié)推斷方法與Kinect返回讀數(shù)的輸出對(duì)比表 m
表2為關(guān)節(jié)推斷方法Y值和Z值絕對(duì)誤差的均值和標(biāo)準(zhǔn)差。可以看出,推斷算法有一個(gè)較小的誤差幅值。在關(guān)節(jié)處于“追蹤”狀態(tài)時(shí),Y軸和Z軸上的絕對(duì)誤差分別為0.019 9±0.013 7和0.127 0±0.087 5。當(dāng)Kinect處于“推斷”狀態(tài)時(shí)的絕對(duì)誤差幅度比處于“追蹤”狀態(tài)時(shí)的絕對(duì)誤差幅度更大,Y值為0.068 6±0.018 6,Z值為0.270 0±0.052 0。在“推斷”狀態(tài)時(shí),Kinect無法準(zhǔn)確檢測(cè)到手部關(guān)節(jié),只能通過深度圖像推斷其他關(guān)節(jié)來確定手部關(guān)節(jié)。深度圖像的精確度越高,誤差越小。本文將手部關(guān)節(jié)輸出的坐標(biāo)點(diǎn)位于手部深度圖像中心±0.02 m范圍內(nèi)認(rèn)為是一次正確識(shí)別,Kinect與本文方法在“追蹤”狀態(tài)和“推斷”狀態(tài)時(shí)的準(zhǔn)確率如表3所示。
表2 關(guān)節(jié)推斷方法絕對(duì)誤差的均值和標(biāo)準(zhǔn)差
表3 Kinect與本文方法的準(zhǔn)確率 %
本文方法與Kinect的骨骼追蹤方法比較結(jié)果如圖7所示。Kinect的骨骼跟蹤方法在人體輪廓清晰的情況下可以獲得較準(zhǔn)確的骨骼提取結(jié)果,如圖7(c)中的第1幅圖像。在其他情況下,Kinect對(duì)關(guān)節(jié)部位評(píng)估的準(zhǔn)確度會(huì)有較大的誤差,如圖7(b)的第2和第3幅圖。本文方法的結(jié)果如圖7(c)所示,與Kinect相比,本文方法可以在身體處于運(yùn)動(dòng)狀態(tài)或有部分遮擋時(shí)獲得更精確的關(guān)節(jié)定位。
(a)原始深度圖像 (b)Kinect捕捉結(jié)果 (c)本文結(jié)果
本文提出的手部關(guān)節(jié)位置推斷方法能有效解決Kinect在無法正確追蹤手部關(guān)節(jié)時(shí)識(shí)別精度較低的問題。本文方法基于深度圖像信息進(jìn)行關(guān)節(jié)的識(shí)別判斷,避免了多余的數(shù)據(jù)采集,能夠在保證實(shí)時(shí)性的前提下保持系統(tǒng)的運(yùn)行效率;基于正向運(yùn)動(dòng)學(xué)公式,能有效判斷出腕部關(guān)節(jié)的位置,提高了對(duì)腕部和手部關(guān)節(jié)位置的識(shí)別精度。下一步的工作是在大范圍揮動(dòng)手臂的情況下(肘部和腕部的X值不同)進(jìn)行精確地關(guān)節(jié)捕捉,從而使Kinect更好地運(yùn)用到體育分析和游戲娛樂等領(lǐng)域。