劉子威
【摘要】本文探索采用體感設(shè)備Kinect,結(jié)合visual studio C++開發(fā)SLAM圖形建模,使用Kinect傳感設(shè)備對(duì)足部進(jìn)行掃描,實(shí)現(xiàn)對(duì)足部的數(shù)據(jù)搜集,并利用SLAM軟件對(duì)圖像進(jìn)行點(diǎn)云的拼接、曲面的重建新從而構(gòu)建出足部三維模型,讓人們能使用價(jià)格較低的Kinect裝置就可以簡便精確的獲得足部三維模型。
【關(guān)鍵詞】Kinect設(shè)備、圖形建模、足部模型
Kinect是微軟公司推出了一款體感攝像頭,具有實(shí)時(shí)獲取圖片、生成深度圖的特點(diǎn)。利用這一特點(diǎn),我們探索利用圖像技術(shù)再結(jié)合Kinect設(shè)備來生成人的足部三維模型。我們首先利用Kinect獲取足部深度圖像數(shù)據(jù)。再對(duì)拍攝到的圖像進(jìn)行處理,選區(qū)有效目標(biāo)并減小誤差,處理點(diǎn)云數(shù)據(jù)獲得足部數(shù)據(jù)。然后實(shí)現(xiàn)足部點(diǎn)云的實(shí)時(shí)拼接與曲面重建,最后輸出足部模型數(shù)據(jù)。
1. 對(duì)獲取深度圖像的介紹
1)Kinect是微軟公司開發(fā)的體感周邊外設(shè),能實(shí)時(shí)采集行為圖像并生成深度圖。Kinect的正面有三個(gè)傳感器,中間的是用來采集 RGB 彩色圖像的視覺傳感器,兩邊的紅外線傳感器一個(gè)為發(fā)射器,另一個(gè)為3D結(jié)構(gòu)光的深度感應(yīng)器。通過設(shè)置幀數(shù)據(jù)與數(shù)據(jù)流,對(duì)足部進(jìn)行拍攝后可獲取深度圖像。
2)首先需要獲取該攝像頭的內(nèi)參。用待標(biāo)定的攝像頭拍攝多張不同角度的棋盤圖像,然后使用OpenCV來計(jì)算出該攝像頭的內(nèi)參。
A.盡量使用較大的標(biāo)定棋盤,尺寸至少與A3紙的大小相似;
B.棋盤平面與攝像頭像平面之間的夾角需在45度以下;
C.棋盤的姿勢與位置盡可能多樣化;
D.標(biāo)定圖片多于10張;
E.注意設(shè)置好攝像頭的分辨率,長寬比最好和深度圖的相同;
3)計(jì)算相機(jī)的內(nèi)參存在切向畸變。由于透鏡與成像平面沒有完全平行所以導(dǎo)致切向畸變的產(chǎn)生,可以用公式①和公式②修正
xcorr=xdis+[2p1xy+p2(r2+2x2)] ? ? ? ? ? ? ? ?①
ycorr=ydis+[p1(r2+2y2)+2p2xy] ? ? ? ? ? ? ? ?②
其中:
xdis和ydis 表示有畸變的坐標(biāo);
xcorr和ycorr 表示修復(fù)后的坐標(biāo);
k1,k2,k3表示徑向畸變參數(shù);
p1,p2表示切向畸變參數(shù);
2.處理拍攝到的圖像,選取正確的有效目標(biāo),并盡可能減小誤差所帶來的影響,并處理點(diǎn)云數(shù)據(jù)獲得足部信息
1)將獲得的深度圖轉(zhuǎn)化為點(diǎn)云
將相機(jī)所在位置作為坐標(biāo)原點(diǎn),并規(guī)定坐標(biāo)系為:與相機(jī)平面平行的平面為x-y平面,水平方向?yàn)閤軸,x-y平面中,垂直于x軸向上為y軸正方向。
設(shè)(i,j)表示kinect深度圖數(shù)據(jù)流的一幀(分辨率320*240)中第i行,第j列的點(diǎn),該點(diǎn)出的深度值為d,該點(diǎn)的三維坐標(biāo)為(X,Y,Z),則如公式③所示:
X=(i-CX)/f×d
Y=(j-CY)/f×d ? ? ? ? ?③
Z=d
其中,CX=161,CY=121。f為相機(jī)焦距。
2)對(duì)點(diǎn)云數(shù)據(jù)進(jìn)行處理:
深度數(shù)據(jù)轉(zhuǎn)化成的三維點(diǎn)云到數(shù)據(jù)不能直接作為人體重建的輸入,這是由于掃描得到的數(shù)據(jù)中存在離散的噪點(diǎn),不是我們所需要的,此外邊界的數(shù)據(jù)比較粗糙,會(huì)影響后續(xù)的重建,因此我們需要消除以下列出的數(shù)據(jù)誤差。
A.濾波、去噪
我們使用高斯濾波實(shí)現(xiàn)。根據(jù)二維高斯函數(shù)公式④的圖像,通過計(jì)算每一個(gè)像素點(diǎn)和鄰域內(nèi)的其他像素點(diǎn)的值的加權(quán)平均,我們可以對(duì)整幅圖像求加權(quán)平均值。使用PCL開源庫的 RadiusRemoval、ConditionRemoval等濾波器來移除離群點(diǎn)和邊界點(diǎn)。
二維高斯函數(shù): ④
B.去除重復(fù)點(diǎn)
得到點(diǎn)云數(shù)據(jù)存在著大量的重復(fù),同位置的點(diǎn)可能被重復(fù)記錄了多次,使得數(shù)據(jù)量非常大,因此需要先做簡化,以減少后期的工作量。我們需要重新排序點(diǎn)云,將點(diǎn)云按照坐標(biāo)的字典序排列,即若(x1,y1,z1)在(x2,y2,z2)之前,則x1<x2。我們使用C++快速排序算法完成。排完序之后,在保證點(diǎn)的位置相鄰后即可實(shí)現(xiàn)快速地剔除重復(fù)點(diǎn)。
C.精簡處理
針對(duì)Kinect獲取的點(diǎn)云特征,通常是以行為單位進(jìn)行一個(gè)方向上的精簡。我們引入曲率參數(shù),并采用自適應(yīng)精簡算法來處理圖像的復(fù)雜性:
a.設(shè)定一個(gè)曲率閾值K以及步長x
b.根據(jù)步長分別計(jì)算每數(shù)據(jù)點(diǎn)段的曲率k
c.若k<K,則設(shè)置一個(gè)最小距離閾值dmin,從本數(shù)據(jù)段第一個(gè)點(diǎn)開始依次求出相鄰兩點(diǎn)的距離,若d<dmin,則后一個(gè)點(diǎn)刪除,反之保留,直到本數(shù)據(jù)點(diǎn)段最后一個(gè)點(diǎn)結(jié)束。執(zhí)行步驟⑤。
d.若k>K,則給定一個(gè)角度閾值θmin,并依據(jù)公式⑤計(jì)算出弦高閾值hmin;
⑤
其中,μ為相鄰點(diǎn)間的正太分布值,Nb和Na分別為簡化后和簡化前的點(diǎn)的數(shù)量。依次計(jì)算相鄰三點(diǎn)x,y,z間的夾角和弦高。若h<hmin或者θ<θmin,令z=y,刪除y。若如果z=y,y=x,刪除x。直到本數(shù)據(jù)段最后一個(gè)點(diǎn)結(jié)束。執(zhí)行步驟e。
e.如果本段是最后一段則結(jié)束。若不是,執(zhí)行步驟b。
3.足部點(diǎn)云的實(shí)時(shí)拼接和曲面重建足部模型
1)確定中心坐標(biāo)系與像素坐標(biāo)的關(guān)系以建立世界坐標(biāo)系進(jìn)行模型重建
預(yù)處理后的深度圖像具有二維信息,像素點(diǎn)的值表示物體表面到Kinect傳感器之間的直線距離,并以毫米為單位表示。以攝像機(jī)成像原理為基礎(chǔ),可以計(jì)算出世界坐標(biāo)系與圖像像素坐標(biāo)系之間具有如圖所示的轉(zhuǎn)換關(guān)系:
2)將多張圖像配準(zhǔn)以匹配的統(tǒng)一坐標(biāo)系
因?yàn)閳D像是從不同角度拍攝,所以圖像的幀之間會(huì)存在一些共性,我們需要對(duì)此進(jìn)行分析求解變換參數(shù)。配準(zhǔn)深度圖像,首先搜集不同圖像幀之間的共性,然后把在不同時(shí)間、空間、角度拍攝到的多幀圖像疊加匹配到統(tǒng)一的坐標(biāo)系中,并計(jì)算出相應(yīng)的平移向量與旋轉(zhuǎn)矩陣,同時(shí)消除冗余信息。
3) 將點(diǎn)云數(shù)據(jù)融合處理
配準(zhǔn)后的深度信息仍為無序的點(diǎn)云數(shù)據(jù),無法展現(xiàn)物體的整體信息。我們需要將點(diǎn)云數(shù)據(jù)進(jìn)行融合處理,以獲得更加精細(xì)的重建模型。以Kinect傳感器的初始位置為原點(diǎn)構(gòu)造體積網(wǎng)格,通過為所有體素賦予SDF(Signed Distance Field,有效距離場)值來還原圖像表面。SDF值等于此體素到重建表面的最小距離值。當(dāng)SDF>0,該體素位于圖像表面之前;當(dāng)SDF<0,該體素位于圖像表面之后;當(dāng)SDF值越接近于零,表示該體素越貼近于場景的真實(shí)表面。
四.提取足部特征點(diǎn)輸出
在獲得足部的模型和數(shù)據(jù)后,根據(jù)人的腳掌對(duì)于鞋子的適應(yīng)性,選擇特征點(diǎn)進(jìn)行分析處理,給出人足部特征部位的關(guān)鍵數(shù)據(jù),讓用戶對(duì)自己的腳掌能有一個(gè)更加全面和詳細(xì)的了解。
1)選取特征點(diǎn)
考慮到測量系統(tǒng)的實(shí)際情況,我們定義了如下幾個(gè)參數(shù)作為輸出的特征點(diǎn)。定義如下:
腳長L:沿軸線腳前端點(diǎn)與后跟端點(diǎn)之間的距離。
跖趾直寬W:第一跖趾里寬與第五跖趾外寬之和。
跖圍C1:圍繞跖趾關(guān)節(jié)突出點(diǎn)測量的圍長。
跗圍C2:圍繞腳前跗骨突出點(diǎn)測量的圍長。
兜圍C3:圍繞舟上彎點(diǎn)和后跟測量的圍長。
第一跖趾關(guān)節(jié)高度H1:第一跖趾關(guān)節(jié)最高點(diǎn)距離測量面的高度。
前跗骨高度H2:前跗骨突出點(diǎn)距離測量面的高度。
舟上彎點(diǎn)高度H3:舟上彎點(diǎn)距離測量面的高度。
2)輸出方法
腳長是長度方向上各特征參數(shù)的基準(zhǔn),調(diào)整后腳長的求解轉(zhuǎn)化為腳底輪廓圖中前、后端點(diǎn)在軸線上的投影點(diǎn)之間的距離,可得的公式⑥如下所示:
Lf=|Zmax-Zmin| ? ? ? ?⑥
由腳型基本規(guī)律,找到第一跖趾關(guān)節(jié)部位到腳型外側(cè)距離絕對(duì)值最大的點(diǎn)P1,該點(diǎn)就是第一跖骨外凸點(diǎn)。再按照同樣的方法找出點(diǎn)P2,此點(diǎn)為第五跖骨外凸點(diǎn)。設(shè)P1 P2在YOZ平面上的投影點(diǎn)分別為P1、P2,則P1、P2到軸線的距離分別為第一跖趾里寬和第五跖趾外寬,跖趾直寬為:W=|y1|+|y2|
在確定P1和P2后,設(shè)一點(diǎn)P3沿第一跖骨外凸點(diǎn)附近的輪廓線最高點(diǎn)移動(dòng),P1(x1,y1,z1)、P2(x2,y2,z2)、P3(x3,y3,z3)三點(diǎn)確定平面的方程⑦如下所示:
Ax+By+Cz+D=0 ? ? ?⑦
我們計(jì)算出矩陣中各點(diǎn)到平面的距離,找到距離最小的兩個(gè)點(diǎn)N1、N2交于點(diǎn)N,共有360個(gè)交點(diǎn)。隨著P3(x3,y3,z3)的移動(dòng),可得到一系列的圍長,我們把最小圍長作為趾圍,x3的最小絕對(duì)值作為第一跖趾關(guān)節(jié)高度。
我們設(shè)一點(diǎn)P4(x4,y4,z4)沿舟上彎點(diǎn)輪廓線最高點(diǎn)移動(dòng),P4與腳后跟觸地點(diǎn)、垂直于XOZ平面的輪廓線都相交。為了填滿兩點(diǎn)之間的稀疏部分,我們對(duì)兩點(diǎn)之間進(jìn)行插值再求其平均值。通過P4的變換,得到一系列的平面與腳型相交形成的圍線,我們對(duì)這些該圖像進(jìn)行擬合,求出最小值,對(duì)應(yīng)的x4的絕對(duì)值為舟上彎點(diǎn)高度。
3)輸出結(jié)果
用腳型三維掃描儀對(duì)足部模型其進(jìn)行數(shù)字化,并提取相關(guān)特征參數(shù)。L為腳長,C1,C2,C3分別是跖圍、跗圍、兜圍曲線,H1,H2,H3,分別為第一跖趾關(guān)節(jié)高度,前跗骨高度,舟上彎點(diǎn)高度。最后對(duì)特征參數(shù)進(jìn)行多次測量并取平均值來得到人工測量值。
參考文獻(xiàn):
[1]胡安鐸, 蘇顯渝, 向立群, et al. 腳型三維測量與特征參數(shù)自動(dòng)提取[J]. 四川大學(xué)學(xué)報(bào)(自然科學(xué)版), 2009(06):123-128.
[2] 《皮鞋設(shè)計(jì)學(xué)》李運(yùn)河 于百計(jì) 周福民 高士剛
[3] 劉靜雯. 基于Kinect的密集視覺里程計(jì)SLAM算法研究[D]. 2016.
[4] 張少玉. 基于Kinect的三維人體建模技術(shù)研究[D]. 西安工程大學(xué).