本發(fā)明屬于計算機圖形學和虛擬現(xiàn)實相結(jié)合的交叉學科技術領域,具體涉及一種人體點云模型的骨架提取方法。
背景技術:
三維模型的骨架信息是一種強有力的形狀描述符,可以描述物體的拓撲結(jié)構(gòu)和關鍵形體特征,因此三維物體的骨架提取是計算機圖形學領域的一個重要研究熱點,在模式識別、圖像檢索和虛擬運動、以及醫(yī)學影像、動畫動漫,物體變形研究等領域有著廣泛的應用。
針對三維模型骨架提取基本方法層出不窮,并且有很多新的算法不斷出現(xiàn)??傮w來說,由于點云模型不包含顯式的拓撲連接信息,而且還有可能遇到部分數(shù)據(jù)缺失的情況,導致三維點云模型骨架的提取變得更有難度?,F(xiàn)存的點云骨架提取算法或多或少地對模型外形有形狀先驗性限制。
①基于拓撲細化的骨架提取方法能夠很好的簡化原始模型,獲得邊緣較為光滑,與原始模型拓撲結(jié)構(gòu)相一致的良好骨架結(jié)構(gòu)。但是,需要用戶輸入修剪參數(shù),不斷調(diào)整以確定適當?shù)男藜魠?shù)來計算理想骨架。
②基于收縮方法收縮過程不會改變原始網(wǎng)格的連通性,能夠確保最終的曲線骨架和原始物體保持良好的拓撲一致性;由于幾何收縮過程是基于迭代隱式平滑操作的,能夠處理噪聲,使得它對噪聲不敏感;但是,該曲線骨架提取框架只適用于具有連通性的封閉模型,這是由于幾何收縮需要為每個頂點定義一個良好的拉普拉斯算子;雖然該算法對模型分辨率基本不敏感,但它不能對非常粗糙的模型產(chǎn)生良好的骨架,對于有5000多個頂點的普通模型都可以生成良好的曲線骨架。
③基于l1中值骨架提取方法可以直接在原始掃描數(shù)據(jù)上進行操作,即就是不需要任何預處理,包括去噪,去除離群值,法線骨架,空間離散化,數(shù)據(jù)完整性,或者網(wǎng)格化或者參數(shù)設置等;但是假如噪聲或者缺失數(shù)據(jù)的數(shù)量非常大,算法參數(shù)設置不合理時,該算法可能會產(chǎn)生錯誤輸出。
④基于rosa的骨架提取方法過程中利用法矢信息對缺失數(shù)據(jù)進行有效彌補,因此對于大面積數(shù)據(jù)缺失的多分支點云模型,利用該方法提取的骨架仍能正確地表示原始模型的拓撲結(jié)構(gòu),同時提取的模型骨架與模型的變換和姿態(tài)無關的。但是,由于該算法更多的關注于算法的魯棒性,進行了較多的預處理,并且進行了骨架分割、拼接等過程,因此算法時間復雜度較高,同時對于大規(guī)模點云模型,處理的空間復雜度也有待提高。
⑤基于距離變換的方法利用的是物體的連通性,對局部領域進行距離變換,從而直接抽取出物體的骨架點。物體內(nèi)每一點的dt(distancetransform)值被定義為這個點到邊界點的最小距離。由于骨架點相對于物體的邊界而言應當處于中心的位置,所以從理論上講,最接近于物體中心的點應該具有最大的dt值。因此,dt值就為骨架點的確定提供有用的信息。
技術實現(xiàn)要素:
本發(fā)明的目的是提供一種人體點云模型的骨架提取方法,解決了現(xiàn)有技術僅適用于特定的模型或者很難針對模型骨架曲線所有性質(zhì)達到最理想狀態(tài)的問題,能夠自動地完成人體點云模型的骨架提取。
本發(fā)明所采用的技術方案是,一種人體點云模型的骨架提取方法,具體按照以下步驟實施:
步驟1:基于切片思想,獲取人體模型骨架點,連接骨架點,生成模型初始曲線骨架;
步驟2:對初始曲線骨架進行粗優(yōu)化,去除噪聲點或者空洞產(chǎn)生的多余分叉點和內(nèi)部分支;
步驟3:利用在待優(yōu)化骨架線上插入插值點對模型曲線骨架進行精優(yōu)化,得到最終的骨架信息。
本發(fā)明的特點還在于:
步驟1中獲取人體模型骨架點具體為:
步驟1.1:求取人體點云模型的走向趨勢;
步驟1.2:計算人體點云模型的最小包圍盒;
步驟1.3:初始骨架點的計算。
步驟1.1具體為:
給定一個包含n個點的人體點云模型,設點云中某一個點為p,則p和
其中,
根據(jù)m求出模型的三個空間特征向量λ1、λ2和λ3,比較λ1、λ2和λ3的大小,用其中最大的特征值對應的特征向量表示人體點云模型的走向趨勢方向。
步驟1.2具體為:
旋轉(zhuǎn)坐標軸并縮小aabb包圍盒,記錄每次旋轉(zhuǎn)后的邊界數(shù)據(jù)di={xmax,xmin,ymax,ymin,zmax,zmin},比較每次坐標軸旋轉(zhuǎn)后對應包圍盒的體積,求得體積最小包圍盒對應的{di}和vi,記錄此時坐標軸的角度α′、β′、γ′,根據(jù)α′、β′、γ′的值來建立模型最小包圍盒即為所求obb最小包圍盒;
根據(jù)最小包圍盒長軸與yoz面的夾角α和與xoy面的夾角β作為模型繞z軸和x軸旋轉(zhuǎn)角度,首先繞z周旋α后使得模型與yoz面平行,然后繞x軸旋轉(zhuǎn)β是模型與xoy面平行;最終模型被轉(zhuǎn)到基本垂直xoz坐標平面的位置。
步驟1.3具體為:
步驟1.3.1:人體模型的切片獲取
沿著旋轉(zhuǎn)后的y軸方向,給定步長h,將整個模型分成若干個高度為h的帶狀點集t,然后將t中的所有點投影到該帶狀點集的中間垂直于切割方向的橫穿平面上,得到帶狀點集所有二維投影點集t′;
步驟1.3.2:投影區(qū)域劃分
將二維投影區(qū)域網(wǎng)格化,即給定一個網(wǎng)格大小ω,求得區(qū)域整體的最大寬度
步驟1.3.3:投影區(qū)域中心點計算
按照點x軸坐標值和z坐標值升序排序,當點集中點個數(shù)n為奇數(shù)時,分別取排序后兩個集合中的中間元素x坐標x1和z坐標z1,則所求二維投影區(qū)域中心點為o(x1,z1);當點集中點個數(shù)n為偶數(shù)時,分別取排序后兩個集合中的中間兩個元素對應x軸坐標和z軸坐標,求其平均值x2和z2,則所求二維投影區(qū)域中心點為o(x2,z2);
步驟1.3.4:投影區(qū)域中心點標記
定義變量:劃分參數(shù)λ,切片高度h=(ymax-ymin)/n,其中,ymax是模型長軸上點最大y坐標,ymin是模型長軸上點最小y坐標,n是切片層數(shù),兩個中心點之間的歐氏距離
確定“基準層”
在所有切片中尋找到第一個劃分區(qū)域數(shù)n最大的層作為“基準層”并記住該層的層號no,將該層中所有區(qū)域的標號作為其它層標號的標準,對其它層依次重新標記;
以“基準層”為標準,依次向上和向下重標記
先向上標記:取“基準層”中的區(qū)域中心點oj作為參考點,“基準層”向上相鄰的切片中的中心點oi作為標記點,計算ξ=d/h,判斷ξ和λ大小關系,若ξ≥λ,則表示當前標記點和參考點偏離比較遠,此時,當參考點的標記為“1”時,標記點標記為“n+1”,更新n=n+1;若ξ<λ,則表示當前標記點和參考點距離比較近,此時,標記點和參考點做統(tǒng)一標記,直到“標記層”中所有區(qū)域的中心點都重新標記完為止;
改變“基準層”,迭代操作
當前標記層標記完后,以當前“標記層”為“基準層”,按照上述步驟迭代操作,直到模型的所有層都被重新標記完為止;
到此,將整個模型中屬于同一個分支的區(qū)域中心點做了相同的標記;
步驟1.3.5:基于投影面積獲得骨架點
首先逐一計算基準層中每一個區(qū)域面積s1、s2……si,求得投影區(qū)域的總面積s:
步驟1.3.6:去除模型外的骨架點
設當前點p(x0,z0),首先求得區(qū)域點集中x坐標、z坐標對應的最大值和最小值xmax、xmin、zmax和zmin,以xmax、xmin、zmax和zmin做一個包圍該區(qū)域的最小矩形t,當點p(x0,z0)坐標位于該矩形t之外時,那么可以認定判斷點p(x0,z0)位于區(qū)域之外,將視為錯誤骨架點被剔除;當該點p位于t之內(nèi)時,即
如果公式(3)成立,則點p(x0,z0)可能位于某一區(qū)域內(nèi)部,繼續(xù)下一步判定;將區(qū)域帶狀點集擬合成為一個n多邊形t′,要判斷的p點位于t′內(nèi)還是外;在t′之外取一點p′(x1,z1),過p′向p做一條射線l,該射線的方程為:
其中,x∈[-∞,x0];
取t′內(nèi)相鄰的兩個點,求解出一個多邊形對應的一個邊的直線方程為:
其中,x∈[xi,xj];
聯(lián)立(4)和(5),求解方程組,若方程組根的個數(shù)為偶數(shù)時,也就是射線l與多邊形t′交點的個數(shù)為偶數(shù)時,此時點p位于區(qū)域之外,若方程組根的個數(shù)為奇數(shù)時,也就是射線l與多邊形t′交點的個數(shù)為奇數(shù)時,此時點p位于區(qū)域之內(nèi);
經(jīng)過剔除模型外部的骨架點,由此確定了人體模型的初始骨架點集合sk。
步驟2對初始曲線骨架進行粗優(yōu)化具體為:
步驟2.1:初始骨架線的獲取
由于模型同一組成部分的骨架點有相同的分類和標記,因此,在同一組成部分骨架點連接時,按照區(qū)域號的順序,將相鄰層屬于同一組成部分的骨架點相連,并且被連接的骨架點度加一,組成該組成部分的初始骨架線,迭代操作模型骨架點集劃分結(jié)果中的每一個組成部分,直到所有組成部分骨架點都連接,就得到了整個模型的各個組成部分的初始骨架線;
在進行不同組成部分之間骨架線連接時,根據(jù)之前對骨架點集sk的重標記,將標記為“m”和標記為“n”的骨架點相連,標記為“m”的骨架點表示位于模型主體部分,標記為“n”的骨架點表示位于模型分支部分;分支部分的所有骨架點連接后形成的是一條折線l,l會有兩個端點,由于人體姿態(tài)的不同將導致連接點的選擇會不同,此時我們必須在l的兩個端點中選擇一個作為連接點和主體部分連接,依次將所有分支部分骨架線和主體部分骨架線連接;
步驟2.2:骨架線的粗優(yōu)化
遍歷所有骨架點,統(tǒng)計每個骨架點對應的度,找到度為3的骨架點并統(tǒng)計起個數(shù):
如果度為3的骨架點個數(shù)為1,說明在人體胯部位置存在一個分叉點,此時沒有錯誤分叉點;
如果為3的骨架點個數(shù)大于1,說明在除胯部位置存在錯誤分叉點;然后,以y軸坐標最大的點為基準點,將其余錯誤分叉點坐標更為成基準點坐標,實現(xiàn)錯誤分叉點合并;
在待處理骨架線上等距離的插入n個值,逐一判斷插值點相對于模型的位置情況,若插值點位于模型之外,則按照一定方向調(diào)整主體部分連接點,再次判斷插值點位置,循環(huán)操作,直到所有插值點位于模型內(nèi)部,此時,待處理骨架線也對應被移動到了模型內(nèi)部。
步驟3具體為:
根據(jù)骨架點的度確定待優(yōu)化骨架線,將模型主體部分度為3或者度為4的骨架點視為分支點,將連接分支部分和分支點連接的骨架線視為待優(yōu)化骨架線;其次,在待優(yōu)化骨架線上等間距插入m個點使待優(yōu)化骨架線離散化;然后,對于每一個插值點給定一個球形鄰域,所有球形鄰域內(nèi)的點組成點集v,在插值點處,沿垂直于原始切割方向,厚度為兩個插值點之間的距離d切割v,得到帶狀點集c,將c投影到經(jīng)過插值點方向平行于xoy平面的平面π上得到二維投影區(qū)域;最后,計算二維投影區(qū)域中心點oi,將插值點移動到oi位置處,直到所有插值點被移動到最終位置后,連接插值點形成優(yōu)化處理后的分支點出模型骨架l,最終將l的端點分別和模型分支部分、主體部分相連,完成一條待優(yōu)化處理骨架線段優(yōu)化;迭代操作,直到所待優(yōu)化處理骨架線段被處理完成,得到模型最終曲線骨架。
本發(fā)明的有益效果是:本發(fā)明一種人體點云模型的骨架提取方法中,實現(xiàn)的三維人體點云模型曲線骨架提取算法,基于切片求骨架點的思想,更好的保證了模型曲線骨架中軸性,根據(jù)人體模型拓撲關系設計分支骨架線連接算法,更好保證了模型曲線骨架的拓撲不變性,利用插值點方法對待優(yōu)化骨架線進行優(yōu)化處理,更好保證了模型曲線骨架的準確性。
附圖說明
圖1是采用本發(fā)明骨架提取方法中模型主趨勢的走向示意圖;
圖2是采用本發(fā)明骨架提取方法中模型的有向包圍盒建立;
圖3是本發(fā)明骨架提取方法中的切片示意圖;
圖4是采用本發(fā)明骨架提取方法得到的初始骨架點結(jié)果圖;
圖5是本發(fā)明骨架提取方法中骨架線生成結(jié)果圖;
圖6是本發(fā)明骨架提取方法中骨架線的粗處理結(jié)果圖;
圖7是本發(fā)明骨架提取方法中骨架線的精細處理結(jié)果圖。
具體實施方式
下面結(jié)合附圖和具體實施方式對本發(fā)明進行詳細說明。
本發(fā)明一種人體點云模型的骨架提取方法,具體按照以下步驟實施:
步驟1:基于切片思想,獲取人體模型骨架點,連接骨架點,生成模型初始曲線骨架;
其中,獲取人體模型骨架點具體為:
步驟1.1:求取人體點云模型的走向趨勢,具體為:
給定一個包含n個點的人體點云模型,設點云中某一個點為p,則p和
其中,
根據(jù)m求出模型的三個空間特征向量λ1、λ2和λ3,比較λ1、λ2和λ3的大小,用其中最大的特征值對應的特征向量表示人體點云模型的走向趨勢方向,如圖1所示。
步驟1.2:計算人體點云模型的最小包圍盒,具體為:
旋轉(zhuǎn)坐標軸并縮小aabb包圍盒,記錄每次旋轉(zhuǎn)后的邊界數(shù)據(jù)di={xmax,xmin,ymax,ymin,zmax,zmin},比較每次坐標軸旋轉(zhuǎn)后對應包圍盒的體積,求得體積最小包圍盒對應的{di}和vi,記錄此時坐標軸的角度α′、β′、γ′,根據(jù)α′、β′、γ′的值來建立模型最小包圍盒即為所求obb最小包圍盒;如圖2所示。
根據(jù)最小包圍盒長軸與yoz面的夾角α和與xoy面的夾角β作為模型繞z軸和x軸旋轉(zhuǎn)角度,首先繞z周旋α后使得模型與yoz面平行,然后繞x軸旋轉(zhuǎn)β是模型與xoy面平行;最終模型被轉(zhuǎn)到基本垂直xoz坐標平面的位置。
步驟1.3:初始骨架點的計算,具體為:
步驟1.3.1:人體模型的切片獲取
沿著旋轉(zhuǎn)后的y軸方向,給定步長h,將整個模型分成若干個高度為h的帶狀點集t,如圖3所示,在此基礎上,將t中的所有點投影到該帶狀點集的中間垂直于切割方向的橫穿平面上,得到帶狀點集所有二維投影點集t′;
步驟1.3.2:投影區(qū)域劃分
將二維投影區(qū)域網(wǎng)格化,即給定一個網(wǎng)格大小ω,求得區(qū)域整體的最大寬度
步驟1.3.3:投影區(qū)域中心點計算
按照點x軸坐標值和z坐標值升序排序,當點集中點個數(shù)n為奇數(shù)時,分別取排序后兩個集合中的中間元素x坐標x1和z坐標z1,則所求二維投影區(qū)域中心點為o(x1,z1);當點集中點個數(shù)n為偶數(shù)時,分別取排序后兩個集合中的中間兩個元素對應x軸坐標和z軸坐標,求其平均值x2和z2,則所求二維投影區(qū)域中心點為o(x2,z2);
步驟1.3.4:投影區(qū)域中心點標記
定義變量:劃分參數(shù)λ,切片高度h=(ymax-ymin)/n,其中,ymax是模型長軸上點最大y坐標,ymin是模型長軸上點最小y坐標,n是切片層數(shù),兩個中心點之間的歐氏距離
確定“基準層”
在所有切片中尋找到第一個劃分區(qū)域數(shù)n最大的層作為“基準層”并記住該層的層號no,將該層中所有區(qū)域的標號作為其它層標號的標準,對其它層依次重新標記;
以“基準層”為標準,依次向上和向下重標記
先向上標記:取“基準層”中的區(qū)域中心點oj作為參考點,“基準層”向上相鄰的切片中的中心點oi作為標記點,計算ξ=d/h,判斷ξ和λ大小關系,若ξ≥λ,則表示當前標記點和參考點偏離比較遠,此時,當參考點的標記為“1”時,標記點標記為“n+1”,更新n=n+1;若ξ<λ,則表示當前標記點和參考點距離比較近,此時,標記點和參考點做統(tǒng)一標記,直到“標記層”中所有區(qū)域的中心點都重新標記完為止;
改變“基準層”,迭代操作
當前標記層標記完后,以當前“標記層”為“基準層”,按照上述步驟迭代操作,直到模型的所有層都被重新標記完為止;
到此,將整個模型中屬于同一個分支的區(qū)域中心點做了相同的標記;
步驟1.3.5:基于投影面積獲得骨架點
首先逐一計算基準層中每一個區(qū)域面積s1、s2……si,求得投影區(qū)域的總面積s:
步驟1.3.6:去除模型外的骨架點
設當前點p(x0,z0),首先求得區(qū)域點集中x坐標、z坐標對應的最大值和最小值xmax、xmin、zmax和zmin,以xmax、xmin、zmax和zmin做一個包圍該區(qū)域的最小矩形t,當點p(x0,z0)坐標位于該矩形t之外時,那么可以認定判斷點p(x0,z0)位于區(qū)域之外,將視為錯誤骨架點被剔除;當該點p位于t之內(nèi)時,即
如果公式(3)成立,則點p(x0,z0)可能位于某一區(qū)域內(nèi)部,繼續(xù)下一步判定;將區(qū)域帶狀點集擬合成為一個n多邊形t′,要判斷的p點位于t′內(nèi)還是外;在t′之外取一點p′(x1,z1),過p′向p做一條射線l,該射線的方程為:
其中,x∈[-∞,x0];
取t′內(nèi)相鄰的兩個點,求解出一個多邊形對應的一個邊的直線方程為:
其中,x∈[xi,xj];
聯(lián)立(4)和(5),求解方程組,若方程組根的個數(shù)為偶數(shù)時,也就是射線l與多邊形t′交點的個數(shù)為偶數(shù)時,此時點p位于區(qū)域之外,若方程組根的個數(shù)為奇數(shù)時,也就是射線l與多邊形t′交點的個數(shù)為奇數(shù)時,此時點p位于區(qū)域之內(nèi);
經(jīng)過剔除模型外部的骨架點,由此確定了人體模型的初始骨架點集合sk,如圖4所示。
步驟2:對初始曲線骨架進行粗優(yōu)化,去除噪聲點或者空洞產(chǎn)生的多余分叉點和內(nèi)部分支;
對初始曲線骨架進行粗優(yōu)化具體為:
步驟2.1:初始骨架線的獲取
由于模型同一組成部分(如左胳膊、左腿等)的骨架點有相同的分類和標記,因此,在同一組成部分骨架點連接時,按照區(qū)域號的順序,將相鄰層屬于同一組成部分的骨架點相連,并且被連接的骨架點度加一,組成該組成部分的初始骨架線,迭代操作模型骨架點集劃分結(jié)果中的每一個組成部分,直到所有組成部分骨架點都連接,就得到了整個模型的各個組成部分的初始骨架線;
在進行不同組成部分之間骨架線連接時,根據(jù)之前對骨架點集sk的重標記,將標記為“m”和標記為“n”的骨架點相連,標記為“m”的骨架點表示位于模型主體部分,標記為“n”的骨架點表示位于模型分支部分;分支部分的所有骨架點連接后形成的是一條折線l,l會有兩個端點,由于人體姿態(tài)的不同將導致連接點的選擇會不同,此時我們必須在l的兩個端點中選擇一個作為連接點和主體部分連接,依次將所有分支部分骨架線和主體部分骨架線連接,得到如圖5所示的骨架線連接圖;
步驟2.2:骨架線的粗優(yōu)化
遍歷所有骨架點,統(tǒng)計每個骨架點對應的度(degree),找到度為3的骨架點并統(tǒng)計起個數(shù):
如果度為3的骨架點個數(shù)為1,說明在人體胯部位置存在一個分叉點,此時沒有錯誤分叉點;
如果為3的骨架點個數(shù)大于1,說明在除胯部位置存在錯誤分叉點;然后,以y軸坐標最大的點為基準點,將其余錯誤分叉點坐標更為成基準點坐標,實現(xiàn)錯誤分叉點合并;
在待處理骨架線上等距離的插入n個值,逐一判斷插值點相對于模型的位置情況,若插值點位于模型之外,則按照一定方向調(diào)整主體部分連接點,再次判斷插值點位置,循環(huán)操作,直到所有插值點位于模型內(nèi)部,此時,待處理骨架線也對應被移動到了模型內(nèi)部。
通過以上兩步可以得到如圖6所示的粗處理結(jié)果。
步驟3:利用在待優(yōu)化骨架線上插入插值點對模型曲線骨架進行精優(yōu)化,得到最終的骨架信息,具體為:
根據(jù)骨架點的度確定待優(yōu)化骨架線,將模型主體部分度為3或者度為4的骨架點視為分支點,將連接分支部分和分支點連接的骨架線視為待優(yōu)化骨架線;其次,在待優(yōu)化骨架線上等間距插入m個點使待優(yōu)化骨架線離散化;然后,對于每一個插值點給定一個球形鄰域,所有球形鄰域內(nèi)的點組成點集v,在插值點處,沿垂直于原始切割方向,厚度為兩個插值點之間的距離d切割v,得到帶狀點集c,將c投影到經(jīng)過插值點方向平行于xoy平面的平面π上得到二維投影區(qū)域;最后,計算二維投影區(qū)域中心點oi,將插值點移動到oi位置處,直到所有插值點被移動到最終位置后,連接插值點形成優(yōu)化處理后的分支點出模型骨架l,最終將l的端點分別和模型分支部分、主體部分相連,完成一條待優(yōu)化處理骨架線段優(yōu)化;迭代操作,直到所待優(yōu)化處理骨架線段被處理完成,得到模型最終曲線骨架,如圖7所示。