李曉璇, 伍新華, 劉 鋼
(武漢理工大學 計算機學院,湖北 武漢 430000)
計算機電子商務迅速發展起來后,網上交易己經成為服裝業的熱門銷售方式。為了與電子商務發展相適應,方便人們網上購買服裝合體美觀,需要真人三維模型的服裝展示,方便快速地看到試衣效果。應用于虛擬試衣的真人三維模型需要通過三維人體表面重建[1~3]獲得。
有些基于軟件的人體建模是根據人體體型特征,利用通用建模軟件3Dmax[4],楊魯等人[5]構建標準化三維人體模型。呂珍等人[6~8]利用OpenGL結合Delphi讀取現有三維軟件3Dmax中的人體與服裝三維數據3 DS文件,進行人體模型的簡單服裝試穿,減少了實現的復雜度。還有些是基于人體照片信息的人體建模,利用拍攝人物的二維圖像,通過提取人體輪廓線、特征尺寸等快速生成三維個性化人體模型[9,10]。Geisen G R等人[11]采用神經網絡系統與圖像識別方法檢測頭部關鍵特征點,通過標定點定位其他特征點。這兩類方法能快速構建的人體模型,但不夠精確,應用場合有限。
基于三維掃描的人體建模是利用三維人體掃描設備掃描人體獲得人體表面的點云數據,通過對點云數據進行降噪、精簡、孔洞修補、表面重建等構建個性化的三維人體模型。應用該方法構建的三維人體模型精確,應用場合廣泛,但由于在進行三維重構時大多數都涉及到點云計算和點云拼接,而生成點云的計算量相當大,三維重構的時間長度。
為了提高重建人物模型的精度和速度,提出了基于Kinect[12,13]的人體模型構建方法。利用Kinect采集的圖像信息構建三維試穿者模型,并提出使用體素八叉樹[14]存儲體模型,以及布料與此人體模型的碰撞算法及布料自碰撞算法。體素八叉樹的結構可以提升查詢速度,減少內存消耗,同時此樹形結構在虛擬試衣的布料與人體模型的碰撞階段,也可以顯著減少人體與布料的碰撞測試的數量,節省虛擬試衣響應時間。
體素八叉樹采用空間分解法建樹并用葉節點保存體素信息,所有的節點操作都可以簡化為對樹結構的遍歷。構建過程中利用如圖1(a)所示的體緩存的特殊結構,其長、寬、高與場景全局坐標系x,y,z坐標軸平行,左下角和右上角兩點坐標決定了一個區域,用點序列表達為〈A,G〉=〈(x,y,z),(x′,y′,z′)〉,其中,x 圖1 構建流程 Hoppe等人通過構造點到物體表面的符號距離函數 (signed distance function,SDF)來重建物體表面。因此,可以用SDF表達物體的3D幾何結構,SDF為0的體素即為物體所在處。本文將SDF定義為每一個體素的中心點到模型表面對應點的有向距離值。 本文設計的體緩存為8×8×8的體素塊,每個體素有一個索引坐標:(0,0,0)~(7,7,7)。由于體素塊與坐標軸對齊,因此,由索引坐標為(0,0,0)的體素的中心點的坐標po和體素的邊長r,可計算索引(x,y,z)的坐標oi (1) 獲取到深度圖像后,為了根據當前深度圖計算SDF值,需要先找到每個體素中心點在當前深度圖中的投影點,然后結合投影點深度值計算投影點的三維點坐標,最后精確計算出體素中心點與投影點之間的距離即可求出每個體素中心點到當前幀深度圖像所觀察到的表面的距離。 圖2 體素中心點到表面距離 以一個體素為例,如圖2所示,對假定的體素,可以獲得其在三維空間的坐標xG,并根據當前的攝像機的姿態即旋轉和平移量R,t(已經通過光流法計算得到較為準確值),則該體素的中心點C在當前幀坐標系下對應的坐標為 x=(x,y,z)T=RT(xG-t) (2) 而將三維空間上的點C=[(x,y,z)]T投影到二維圖像平面得到的相應的點的坐標為 (3) 式中fx,fy為相機在x軸和y軸方向上的焦距,cx,cy表示偏移值。結合式(2)和式(3),將該體素在當前幀坐標系下對應的坐標點投影到二維圖像平面的坐標為 (i,j)T=π(x) (4) 像素點(i,j)T在當前的攝像機姿態形成的坐標系下的深度zd,此時該投影點在三維坐標系下的坐標為 (5) 體素中心點到表面的距離即為體素中心點與點在當前坐標系中的距離為 (6) 此時,負值表示體素在表面因為距離表面越近的體素對重構的影響更大,所以希望距離表面越近的體素有更高的權重,而距離表面越遠的體素權重可以較低,因此需要對不同的體素設置不同的權重。使用的權重函數為 w=(v·n)2 (7) 式中v為視線方向單位向量,n為像素中心點的法向量,w值越小表示誤差越小。 基于每幀深度圖像計算得到的SDF合成為一個SDF,所有體素的合成可并行進行。 假設所有的距離測量都是正態分布的,將每幀深度圖像計算得到的SDF值合成的一個SDF值即為對SDF函數Ψ觀察數據的似然最大時的解 (8) 即最優的ψ是所有測量的加權平均,D(x)即當前幀圖像合并成的一個SDF值,這個值和權重可隨著新的深度圖的加入增量式更新 (9) Wi+1(x)=Wi(x)+wi+1(x) (10) 式中di(x)和wi(x)為第i幀圖像求得的SDF值和權重值。 最后根據三原色(RGB)圖像和計算出的權重值進行色彩融合,估計出模型的彩色紋理,并使用Marching cubes[15]算法得到等值面的點面信息,并在人體模型與布料的碰撞檢測中用到該數據,最后進行三維立體的渲染并將結果顯示出來。 在虛擬試衣過程中,由于重力等各種外力的作用,為了有效避免布料“穿透”人體模型或布料相互“穿透”,必須在虛擬試衣過程中對布料裁片和人體模型以及裁片自身進行碰撞檢測及響應。根據前面構建的體模型的八叉樹結構,提出將布料進行三角剖分后對布料裁片構建AABB包圍盒八叉樹,對裁片—人體模型碰撞以及裁片自碰撞進行檢測,可以有效提高碰撞檢測速度。 本文采用AABB層次包圍盒法,對布料裁片構建AABB八叉樹,對裁片—人體模型的碰撞區域進行檢測,并及時響應處理。其具體過程為: 1)在對虛擬物體進行碰撞檢的時候,首先檢查這兩個模型的層次包圍盒樹根結點是否發生相交,若沒有,則可斷定兩個物體間沒有發生碰撞,如果兩個根節點包圍盒發生了相交,暫時還不能斷定在兩物體間一定有碰撞發生,有待對子樹結點進行進一步碰撞檢測。 2)如果在某個結點上,兩個物體的包圍盒不相交,那么以此結點為根結點的所有子樹就不再需要進行相應的碰撞檢測??梢源蟠鬁p小檢測次數,提高仿真速度。 3)如果結點相交,就繼續遍歷,最后在葉節點進行體素與布料三角片的相交測試。 在由八叉樹結構確定了可能發生碰撞的包圍盒節點后,采用《實施碰撞測試算法技術》[16]一書中所提到的三角片與三角片求交測試來具體進一步判斷包圍盒中的物體是否發生碰撞。 在虛擬試衣過程中,除了2D裁片與人體模型之間的碰撞外,由于裁片的動態變形,使得裁片間也有碰撞發生,因此必須進行裁片的自碰撞檢測。 本文通過計算2D裁片相鄰三角形法線夾角來對裁片自碰撞檢測進行處理。通過分析,只有當裁片的相鄰三角形法線的夾角較大時才有可能發生碰撞。建立2D裁片表面三角形鄰域內的三角形列表,計算相鄰三角形法線的夾角。設置角度閾值p,只有當三角形法線夾角大于p時,才進行碰撞檢測,有效減少參與檢測的碰撞元素,提高了檢測效率。 如圖3所示為本文提出的虛擬試衣算法的流程。首先,使用體素八叉樹表示人體模型,并利用體感傳感器Kinect完成人體模型的構建與更新;隨后使用質點—彈簧模型進行衣物模擬;最后利用體素八叉樹與質點彈簧模型實現對人體試衣的虛擬模擬。 圖3 本文算法流程 通過手持Kinect攝像機圍繞三維模型旋轉1周獲取三維模型的深度和彩色圖像數據。在實驗中掃描三維模型大約需要150 s,共采集到了2 400多幀數據。經過實驗發現,保留220~260幀圖像數據既可以有效地減少耗時也可以滿足三維模型重構的精確度。 圖4(a)為當前幀深度圖像;圖4(b)為當前幀深度圖像;圖4(c)中數據表示在體素化過程中每個體素中存儲的占有該體素的對應物體點的顏色和SDF值。因為當前幀圖像為第一幀,體素中的數據只是第一幀的圖像信息;圖4(d)表示為根據圖4(c)中的數據重構到該幀圖像時得到的三維模型。 圖4 第1幀圖像的深度圖像、RGB圖像、屬性值和重構結果 不同幀之間圖像根據相機姿態計算得到兩幀圖像之間的重合部分,將兩幀圖像重合部分進行融合,將融合后的結果進行重構,得到清晰完整真實的三維人體模型。采用流行的彈簧—質點模型來進行布料的模擬。對于受力分析得到的常微分方程采用Verlet算法進行積分,并將網格劃分為三角片。圖5是用一個40×40的網格進行下落模擬的效果圖。 圖5 布料下落與人體的碰撞 布料在下落的過程中和與人體模型觸后,形狀隨著時間變化而改變,不停留在人體上方。實驗結果顯示使用此體重構算法實現了顯示逼真性的要求。 另外,本文對基于OBB包圍盒和基于八叉樹碰撞檢測的實驗數據進行對比,實驗表明,對同一實驗模型,OBB包圍盒的創建時間是本算法的3.44倍,由實驗結果可知,八叉樹精確劃分包圍盒的簡單性優于OBB,而OBB包圍盒樹中各結點上包圍盒的方向任意性使得其需要更多的存儲空間。 對兩種算法的碰撞檢測的各項指標進行了比較,八叉樹精確劃分包圍盒的整體性能要好于OBB,其碰撞檢測的速度約是OBB的1.475倍。該算法在速度上較OBB方法有所提高,為解決各種復雜環境中的碰撞檢測問題提供了一條有效的途徑,在虛擬試衣中多次換裝的情況下極有優勢。 本文以Kinect為傳感器,實現基于體素八叉樹的虛擬試衣人體模型的重建,并提出了基于此體模型的布料碰撞算法。實驗結果表明,運用本文的方法,在提高重構的人體精度的同時,可以有效縮短碰撞檢測的時間。
2 基于體素八叉樹的體重構方法

3 碰撞檢測與響應
3.1 碰撞檢測
3.2 自碰撞算法
4 實 驗



5 結束語