本發(fā)明涉及基于kinect的多手指實(shí)時跟蹤方法,屬于生物特征計(jì)算機(jī)識別技術(shù)領(lǐng)域。
背景技術(shù):
在虛擬現(xiàn)實(shí)和人機(jī)交互系統(tǒng)中,實(shí)時、準(zhǔn)確并且穩(wěn)定的多手指跟蹤能給用戶帶來友好的交互體驗(yàn)?;谄湄S富的應(yīng)用前景,三維多手指跟蹤得到了研究者的廣泛關(guān)注,其算法主要分為四個步驟:手部區(qū)域的分割、指尖的檢測、指尖三維位置的獲取、指尖三維位置及其軌跡的跟蹤。其中,手部區(qū)域的分割是很重要的一個步驟,因?yàn)樗苯記Q定了指尖檢測算法的準(zhǔn)確性。但是該方法的缺點(diǎn)是易受燈光等外部環(huán)境的影響,在光照條件不好的情況下容易失敗。為此,一些研究者利用紅外相機(jī)來得到可靠的手分割區(qū)域,然而紅外相機(jī)價格昂貴。還有一些研究者通過給出一些限制條件,如固定的背景、固定的光照等來得到較好的分割區(qū)域,但此方法限制了手指跟蹤的應(yīng)用場合。指尖的檢測算法主要分三類:基于輪廓、基于形狀、基于模板?;谳喞椒ǖ娜秉c(diǎn)是它要求手部區(qū)域的輪廓比較準(zhǔn)確,否則就會出現(xiàn)錯誤;基于模板匹配的方法也有此缺點(diǎn),而且速度比較慢。至于基于形狀的方法,要確定一個合適的open操作窗口大小是比較困難的。
隨著微軟公司kinect設(shè)備的推出,利用這一廉價的硬件設(shè)備,能夠?qū)崟r捕獲場景的彩色和深度信息。一些研究者嘗試?yán)胟inect進(jìn)行多手指跟蹤的研究,但都是在kinect給出的深度圖的基礎(chǔ)上設(shè)計(jì)更加魯棒的二維指尖檢測算法,并沒有在得到二維指尖點(diǎn)之后,繼續(xù)利用kinect給出的深度值來跟蹤指尖點(diǎn)的三維坐標(biāo)和軌跡。
本軟件實(shí)現(xiàn)的算法利用kinect的深度圖來分割手部區(qū)域,并且根據(jù)kinect的數(shù)據(jù)特點(diǎn),提出了一個改進(jìn)的基于像素分類的指尖檢測算法。在此基礎(chǔ)上,再利用kinect的深度圖,獲得指尖的三維坐標(biāo),然后通過應(yīng)用幀之間連續(xù)性的卡爾曼濾波器實(shí)現(xiàn)指尖三維位置和軌跡的穩(wěn)定跟蹤。相比之下,本發(fā)明的算法能穩(wěn)定地跟蹤到指尖的三維位置,不僅能實(shí)現(xiàn)2d人機(jī)交互,還能有效地進(jìn)行3d人機(jī)交互。本發(fā)明的算法更加簡單,速度更快,在一般pc平臺,同時跟蹤兩個手的所有手指的情況下,也能達(dá)到20+fps,跟蹤一個手能達(dá)到40+fps。
技術(shù)實(shí)現(xiàn)要素:
目的:為了克服現(xiàn)有技術(shù)中存在的不足,本發(fā)明提供基于kinect的多手指實(shí)時跟蹤方法。
技術(shù)方案:本發(fā)明通過如下技術(shù)方案來實(shí)現(xiàn):
一種基于kinect的多手指實(shí)時跟蹤方法,包括步驟如下:
步驟一:手部區(qū)域分割;
步驟二:基于像素分類的指尖檢測;
步驟三:獲取指尖的三維位置;
步驟四:三維指尖軌跡跟蹤。
所述手部區(qū)域分割包括如下步驟:
1a:利用nite庫來跟蹤手的中心點(diǎn)位置,再根據(jù)中心點(diǎn)深度坐標(biāo),提取深度手部區(qū)域:
其中,zhand表示跟蹤到的手的中心點(diǎn)的深度值,z(x,y)表示像素點(diǎn)(x,y)處的深度值,thresh表示手的最大深度范圍;handmask(x,y)表示手部區(qū)域的辨別函數(shù);
1b:將步驟1a中的像素點(diǎn),范圍縮小到一個包括手部區(qū)域的包圍盒內(nèi);令包圍盒內(nèi)的手部區(qū)域handmask(x,y)=255,包圍盒外的區(qū)域handmask(x,y)=0;
其中,w(z)表示以手的中心點(diǎn)為中心的包圍盒,z為相應(yīng)坐標(biāo)的深度值包圍盒大小與手距離kinect的關(guān)系如下:
width(w(z))=heigth(w(z))=2*min{max{80-0.2*(z-640),60},80}
其中,width(w(z))和heigth(w(z))分別代表包圍盒的水平寬度與垂直高度的數(shù)值。
所述基于像素分類的指尖檢測,包括如下步驟:
2a:將kinect深度值離散化為六段:[501mm,600mm]、[601mm,700mm]、[710mm,800mm]、[801mm,900mm]、[901mm,1000mm]、[1001mm,1100mm];設(shè)每一段的gap1與gap2取值分別為gap1i與gap2i;利用kinect提供的手指輪廓獲得指尖位置,以指尖為圓心畫半徑為20px的圓,交點(diǎn)距離為手指寬度fli,對應(yīng)六段區(qū)域fli分別取10px、10px、12px、13px、14px、15px,令delta=3px,則可求出兩圓半徑:
gap1i=fli/2-delta
gap2i=fli/2+delta
2b:根據(jù)2a的結(jié)果對二值圖像進(jìn)行基于像素的分類:a.若像素點(diǎn)p為圓心,gap1為半徑的圓區(qū)域中手區(qū)域所占比例的大小不大于該圓面積的一半,判定像素點(diǎn)p在手部區(qū)域外;b.若像素點(diǎn)p為圓心,gap1為半徑的圓區(qū)域中手區(qū)域所占比例的大小大于該圓面積的一半,判定像素點(diǎn)p在手部區(qū)域內(nèi);c.若像素點(diǎn)p為圓心,滿足b的前提下,以gap2為半徑的圓與手區(qū)域有四個交點(diǎn),判定像素點(diǎn)p在手指區(qū)域;d.若像素點(diǎn)p為圓心,滿足b的前提下,gap2為半徑的圓與手區(qū)域有兩個交點(diǎn),且交點(diǎn)間距離小于對應(yīng)的手指的寬度fli,判定像素點(diǎn)p在指尖區(qū)域。
所述獲取指尖的三維位置,選取指尖區(qū)域內(nèi)像素點(diǎn)p周圍以3px為半徑的圓在xy平面中的所有點(diǎn)進(jìn)行取樣,若采樣點(diǎn)深度值與圓心點(diǎn)深度值差值大于10px,則舍去,計(jì)算剩余采樣點(diǎn)深度值的均值作為圓心點(diǎn)的深度值。
所述三維指尖軌跡跟蹤,包括如下步驟:
4a:建定卡爾曼濾波器預(yù)測指尖點(diǎn)位置:
首先,在每一幀中,測量指尖點(diǎn)在三維中的位置和速度,定義卡爾曼濾波器的狀態(tài)向量為
xt=(x(t),y(t),z(t),vx(t),vy(t),vz(t))
其中,x(t),y(t),z(t)表示指尖點(diǎn)在三維中的坐標(biāo)位置,vx(t),vy(t),vz(t)表示在每一幀中指尖點(diǎn)的速度;同理,定義卡爾曼濾波器的觀察向量為
yt=(x(t),y(t),z(t))
觀察向量表示指尖點(diǎn)在每一幀中的三維坐標(biāo);
列出卡爾曼濾波器方程:
xt+1=fxt+gwt
yt=hxt+vt
其中,f是狀態(tài)轉(zhuǎn)移矩陣,g是驅(qū)動矩陣,h是觀察矩陣,wt是狀態(tài)向量xt的系統(tǒng)誤差,vt是觀察誤差,表示指尖點(diǎn)檢測算法和kinect深度檢測的誤差:
其次,假設(shè)δt<0.05s,連續(xù)兩幀之間的指尖點(diǎn)的運(yùn)動近似看作是勻速直線運(yùn)動;f,g和h定義如下:
最后,利用每個手指的卡爾曼濾波器,通過手指在t幀的位置預(yù)測手指在t+1幀時候的位置;
4b:預(yù)測指尖點(diǎn)和檢測指尖點(diǎn)之間的匹配跟蹤:
在當(dāng)前幀,利用基于像素分類的指尖檢測方法檢測出當(dāng)前幀的所有指尖點(diǎn);同時,利用卡爾曼濾波器通過上一幀預(yù)測出當(dāng)前幀指尖點(diǎn)所在的位置;將預(yù)測指尖點(diǎn)位置和檢測指尖點(diǎn)位置按手中心點(diǎn)順時針排列后做組合匹配,找到匹配誤差最小的組合作為最終結(jié)果,匹配誤差的值是指尖點(diǎn)三維位置的歐氏距離的差值;之后,利用匹配誤差最小的組合中的卡爾曼濾波器的預(yù)測位置來代替真實(shí)位置,如此一直跟蹤下去;
4c:處理指尖數(shù)量的變化跟蹤
在第一種情況下,操作者確實(shí)改變了指尖的數(shù)量;當(dāng)指尖數(shù)量增加時,開啟新的卡爾曼濾波器來跟蹤它;當(dāng)指尖數(shù)量減少時,終止相應(yīng)的卡爾曼濾波器;
在第二種情況下,由于誤差和運(yùn)動模糊的原因,在某些幀某些指尖點(diǎn)檢測不到或者誤檢測到多余的指尖點(diǎn);首先,設(shè)置計(jì)時器用于當(dāng)指尖數(shù)量開始變化時計(jì)算時間;其次,若計(jì)算時間大于某個閾值,則判斷指尖數(shù)量變化是第一種情況;否則判斷指尖數(shù)量變化是第二種情況,卡爾曼濾波器不變化。
作為優(yōu)選方案,計(jì)時器的閾值設(shè)置0.2s。
有益效果:本發(fā)明提供的基于kinect的多手指實(shí)時跟蹤方法,可以實(shí)時,迅速而準(zhǔn)確地進(jìn)行手指跟蹤,系統(tǒng)穩(wěn)定性高,用戶體驗(yàn)度高,反映速度快。
附圖說明
圖1為本發(fā)明跟蹤方法的系統(tǒng)流程圖;
圖2為手部區(qū)域分割示意圖;
圖3為像素分類示意圖;
圖4為像素分類決策樹示意圖。
具體實(shí)施方式
下面結(jié)合附圖對本發(fā)明作更進(jìn)一步的說明。
如圖1所示,一種基于kinect的多手指實(shí)時跟蹤方法,包括如下步驟:
步驟一:用kinect獲取人的深度圖像;
步驟二:將手部區(qū)域分割出來;
步驟三:檢測出二維的指尖位置;
步驟四:獲得三維指尖位置;
步驟五:跟蹤三維指尖位置獲得其運(yùn)動軌跡。
如圖2所示,kinect在獲取深度圖像之后,將手部區(qū)域采用盒裝的方式分割開來。所述手部區(qū)域分割包括如下步驟:
2a:利用nite庫來跟蹤手的中心點(diǎn)位置,再根據(jù)中心點(diǎn)深度坐標(biāo),提取深度手部區(qū)域:
其中,zhand表示跟蹤到的手的中心點(diǎn)的深度值,z(x,y)表示像素點(diǎn)(x,y)處的深度值,thresh表示手的最大深度范圍;handmask(x,y)表示手部區(qū)域的辨別函數(shù);
2b:將步驟2a中的像素點(diǎn),范圍縮小到一個包括手部區(qū)域的包圍盒內(nèi);令包圍盒內(nèi)的手部區(qū)域handmask(x,y)=255,包圍盒外的區(qū)域handmask(x,y)=0;
其中,w(z)表示以手的中心點(diǎn)為中心的包圍盒,z為相應(yīng)坐標(biāo)的深度值包圍盒大小與手距離kinect的關(guān)系如下:
width(w(z))=heigth(w(z))=2*min{max{80-0.2*(z-640),60},80}
其中,width(w(z))和heigth(w(z))分別代表包圍盒的水平寬度與垂直高度的數(shù)值,以后的計(jì)算都是基于這個范圍來完成的。
所述檢測出二維的指尖位置包括如下步驟:
3a、將kinect深度值離散化為六段:[501mm,600mm]、[601mm,700mm]、[710mm,800mm]、[801mm,900mm]、[901mm,1000mm]、[1001mm,1100mm];設(shè)每一段的gap1與gap2取值分別為gap1i與gap2i;利用kinect提供的手指輪廓獲得指尖位置,以指尖為圓心畫半徑為20px的圓,交點(diǎn)距離為手指寬度fli,對應(yīng)六段區(qū)域fli分別取10px、10px、12px、13px、14px、15px,令delta=3px,則可求出兩圓半徑:
gap1i=fli/2-delta
gap2i=fli/2+delta
3b、如圖3、4所示,根據(jù)3a的結(jié)果對二值圖像進(jìn)行基于像素的分類:如圖3(a)所述,若像素點(diǎn)p為圓心,gap1為半徑的圓區(qū)域中手區(qū)域所占比例的大小不大于該圓面積的一半,判定像素點(diǎn)p在手部區(qū)域外;如圖3(b)所述,若像素點(diǎn)p為圓心,gap1為半徑的圓區(qū)域中手區(qū)域所占比例的大小大于該圓面積的一半,判定像素點(diǎn)p在手部區(qū)域內(nèi);如圖3(c)所述,若像素點(diǎn)p為圓心,滿足b的前提下,以gap2為半徑的圓與手區(qū)域有四個交點(diǎn),判定像素點(diǎn)p在手指區(qū)域;如圖3(d)所述,若像素點(diǎn)p為圓心,滿足b的前提下,gap2為半徑的圓與手區(qū)域有兩個交點(diǎn),且交點(diǎn)間距離小于對應(yīng)的手指的寬度fli,判定像素點(diǎn)p在指尖區(qū)域。
所述獲得三維指尖位置包括如下步驟:
選取指尖區(qū)域內(nèi)像素點(diǎn)p周圍以3px為半徑的圓在xy平面中的所有點(diǎn)進(jìn)行取樣,若采樣點(diǎn)深度值與圓心點(diǎn)深度值差值大于10px,則舍去,計(jì)算剩余采樣點(diǎn)深度值的均值作為圓心點(diǎn)的深度值。
所述三維指尖軌跡跟蹤,包括如下步驟:
5a:建定卡爾曼濾波器預(yù)測指尖點(diǎn)位置:
首先,在每一幀中,測量指尖點(diǎn)在三維中的位置和速度,定義卡爾曼濾波器的狀態(tài)向量為
xt=(x(t),y(t),z(t),vx(t),vy(t),vz(t))
其中,x(t),y(t),z(t)表示指尖點(diǎn)在三維中的坐標(biāo)位置,vx(t),vy(t),vz(t)表示在每一幀中指尖點(diǎn)的速度;同理,定義卡爾曼濾波器的觀察向量為
yt=(x(t),y(t),z(t))
觀察向量表示指尖點(diǎn)在每一幀中的三維坐標(biāo);
列出卡爾曼濾波器方程:
xt+1=fxt+gwt
yt=hxt+vt
其中,f是狀態(tài)轉(zhuǎn)移矩陣,g是驅(qū)動矩陣,h是觀察矩陣,wt是狀態(tài)向量xt的系統(tǒng)誤差,vt是觀察誤差,表示指尖點(diǎn)檢測算法和kinect深度檢測的誤差:
其次,假設(shè)δt<0.05s,連續(xù)兩幀之間的指尖點(diǎn)的運(yùn)動近似看作是勻速直線運(yùn)動;f,g和h定義如下:
最后,利用每個手指的卡爾曼濾波器,通過手指在t幀的位置預(yù)測手指在t+1幀時候的位置;
5b:預(yù)測指尖點(diǎn)和檢測指尖點(diǎn)之間的匹配跟蹤:
在當(dāng)前幀,利用基于像素分類的指尖檢測方法檢測出當(dāng)前幀的所有指尖點(diǎn);同時,利用卡爾曼濾波器通過上一幀預(yù)測出當(dāng)前幀指尖點(diǎn)所在的位置;但是實(shí)際上,基于像素分類的指尖檢測存在一定的隨機(jī)誤差,經(jīng)驗(yàn)預(yù)測也存在一定經(jīng)驗(yàn)誤差。為了減少計(jì)算量,同時考慮到操作者很少會將手指進(jìn)行交叉,本發(fā)明將指尖點(diǎn)都按手中心點(diǎn)順時針排列,這樣在匹配的時候,手指的順序就是固定的,因此整個搜索空間就從排列級降為組合級,可以較大的減小計(jì)算量。將預(yù)測指尖點(diǎn)位置和檢測指尖點(diǎn)位置按手中心點(diǎn)順時針排列后做組合匹配,找到匹配誤差最小的組合作為最終結(jié)果,匹配誤差的值是指尖點(diǎn)三維位置的歐氏距離的差值;之后,利用匹配誤差最小的組合中的卡爾曼濾波器的預(yù)測位置來代替真實(shí)位置,如此一直跟蹤下去。
5c:處理指尖數(shù)量的跟蹤
指尖數(shù)量的變化有兩種情況,第一種是,操作者確實(shí)改變了指尖的數(shù)量。第二種情況是,由于誤差和運(yùn)動模糊的原因,在某些幀某些指尖點(diǎn)檢測不到或者誤檢測到多余的指尖點(diǎn)。
在第一種情況下,當(dāng)指尖數(shù)量增加時,開啟新的卡爾曼濾波器來跟蹤它;當(dāng)指尖數(shù)量減少時,終止相應(yīng)的卡爾曼濾波器;
在第二種情況下,就不能這樣處理。為了解決這個問題,本發(fā)明必須區(qū)分出兩種指尖數(shù)量變化。由于第一種指尖數(shù)量變化是一種穩(wěn)定的變化,那么在多幀之間,它將維持這種變化。相反,第二種指尖數(shù)量變化只是一種暫時、不穩(wěn)定的變化,因此,在多幀之間它不能維持。根據(jù)這個差別,本發(fā)明采用如下步驟:首先,設(shè)置計(jì)時器用于當(dāng)指尖數(shù)量開始變化時計(jì)算時間;其次,若計(jì)算時間大于某個閾值,計(jì)時器的閾值設(shè)置0.2s,則判斷指尖數(shù)量變化是第一種情況;否則判斷指尖數(shù)量變化是第二種情況,卡爾曼濾波器不變化,從而較大程度的提高了跟蹤的穩(wěn)定性。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出:對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。