劉翔宇,王 健,常清法,王效蓋
(1.山東科技大學(xué)測(cè)繪與空間信息學(xué)院,山東 青島 266590;2.山東黃金礦業(yè)(萊州)有限公司焦家金礦,山東 煙臺(tái) 261441)
三維重建技術(shù)在逆向工程、數(shù)據(jù)可視化、計(jì)算機(jī)視覺、醫(yī)療技術(shù)等領(lǐng)域得到了廣泛的應(yīng)用[1]。該技術(shù)發(fā)展至今,已經(jīng)取得了一定的研究成果。根據(jù)點(diǎn)云三維重建的方式不同,將三維重建技術(shù)分為[2]:參數(shù)曲面重建、隱式曲面重建[3]和網(wǎng)格曲面重建?;趨?shù)曲面重建的方法主要包括B樣條曲面重建[4]和NURBS曲面重建[5],因?yàn)樵擃惙椒ㄔ谶M(jìn)行重建時(shí)需要對(duì)點(diǎn)云數(shù)據(jù)進(jìn)行參數(shù)化,而散亂點(diǎn)云數(shù)據(jù)的參數(shù)化效果非常差,所以在對(duì)該類數(shù)據(jù)進(jìn)行重建時(shí)就會(huì)造成重構(gòu)出的模型存在孔洞問題,因此該類方法只適用于表面光滑、變化較小的物體重建。張丹丹等人在傳統(tǒng)的NURBS曲面重建基礎(chǔ)上提出一種基于點(diǎn)云的整體參數(shù)曲面重構(gòu)方法,該算法采用八叉樹建立點(diǎn)云間拓?fù)潢P(guān)系,然后基于法矢和曲率進(jìn)行點(diǎn)云精簡(jiǎn),該方法提高了整體重建效率并且重建效果較好,但是對(duì)于數(shù)量較少的點(diǎn)云重建效果不佳[6]。隱式曲面重建的方法主要有泊松算法[7]和移動(dòng)立方體算法[8],該類算法可以很好的將結(jié)構(gòu)簡(jiǎn)單的物體擬合成光滑的曲面,但是對(duì)于外表結(jié)構(gòu)復(fù)雜的物體不能達(dá)到理想的重建效果,并且該類算法在進(jìn)行重建時(shí)耗時(shí)較長(zhǎng)。劉濤等人提出一種基于點(diǎn)云增強(qiáng)優(yōu)化的泊松重建算法,該算法首先對(duì)點(diǎn)云進(jìn)行降噪處理,然后使用雙三次樣條插值擬合曲面,該方法有效的減少了模型孔洞的生成,但是在耗時(shí)上有所增加[9]。網(wǎng)格曲面重建在點(diǎn)云三維重建中應(yīng)用最為廣泛,經(jīng)常用于重建具有復(fù)雜結(jié)構(gòu)的物體,貪婪投影三角化算法[10](以下簡(jiǎn)稱貪婪投影算法)是網(wǎng)格曲面重建算法的主要代表算法之一,它是基于三維Delaunay三角形的曲面重建方法,貪婪投影算法能夠很好的重建出具有復(fù)雜拓?fù)浣Y(jié)構(gòu)的物體,但存在耗時(shí)長(zhǎng)且對(duì)大量點(diǎn)云數(shù)據(jù)進(jìn)行重建時(shí)模型會(huì)出現(xiàn)孔洞的問題。
針對(duì)貪婪投影算法的缺點(diǎn),許多科研工作者做了一些相應(yīng)的研究。李學(xué)兵等人提出一種廣度優(yōu)先搜索算法來(lái)調(diào)整點(diǎn)云法向量方向,并在此基礎(chǔ)上對(duì)點(diǎn)云進(jìn)行重建,該方法得出的模型效果要高于傳統(tǒng)貪婪投影算法,但在耗時(shí)上有所增加[11]。楊玉澤等提出一種基于KD樹紋理映射的貪婪投影算法的點(diǎn)云重建方法,該方法重建出的模型在細(xì)節(jié)表達(dá)上效果較好,但存在點(diǎn)云缺失與孔洞的問題[12]。張津銘等人提出使用移動(dòng)最小二乘算法對(duì)點(diǎn)云數(shù)據(jù)進(jìn)行平滑處理,該方法雖然可以去除噪聲點(diǎn)的干擾,但也丟失了物體一部分細(xì)節(jié)特征,導(dǎo)致重建后的模型出現(xiàn)了孔洞[13]。
針對(duì)以上問題,本文提出一種改進(jìn)的貪婪投影算法,期望解決重建后的物體表面粗糙和孔洞問題,并且減少物體重建的時(shí)間,提高重建的效率。
貪婪投影算法的基本思想是:首先計(jì)算輸入點(diǎn)云的法向量并在計(jì)算完成后投影到某一平面上,然后對(duì)投影后的點(diǎn)云作平面內(nèi)的三角化,從而得到各個(gè)點(diǎn)的連接關(guān)系。該三角化的過程是基于生長(zhǎng)法的曲面重建,該方法通過選取一個(gè)樣本三角片作為初始曲面,通過對(duì)該曲面邊界進(jìn)行延伸,直到形成一張完整的三角網(wǎng)格曲面后結(jié)束,然后通過某一平面上的投影點(diǎn)云的連接關(guān)系,并以此為基礎(chǔ)形成原始點(diǎn)云間的拓?fù)溥B接,最后得到重建后的曲面模型。但是貪婪投影算法在進(jìn)行重建的過程中,如果遇到的點(diǎn)云存在表面不夠光滑、密度不均勻的情況,使用該算法得到的重建模型達(dá)不到預(yù)期效果。貪婪投影算法流程:
1)針對(duì)輸入點(diǎn)云中的任一點(diǎn)q,采用KD樹的近鄰域搜索算法確定其含有k個(gè)近鄰點(diǎn)的鄰域。根據(jù)搜索的結(jié)果,點(diǎn)云會(huì)根據(jù)其狀態(tài)分為自由點(diǎn)、完成點(diǎn)、邊緣點(diǎn)及邊界點(diǎn)。
2)確定任一點(diǎn)q及其k個(gè)鄰域點(diǎn)的投影切平面,并將這k個(gè)鄰域點(diǎn)投影到該二維平面中。
①針對(duì)第一步中輸入的任一點(diǎn)q的鄰域,此鄰域內(nèi)的點(diǎn)與過q點(diǎn)的切平面投影存在一一對(duì)應(yīng)的關(guān)系。根據(jù)貪婪投影算法的PCA(Principal Component Analysis)法線估計(jì)方式計(jì)算每一點(diǎn)的近似法向量,通過平面方程式來(lái)解算出該點(diǎn)的切平面。假設(shè)點(diǎn)N0(x0,y0,z0)的法向量m=(A,B,C),點(diǎn)N(x,y,z)過N0的切平面可以表示為:
A(x-x0)+B(y-y0)+C(z-z0)=0
(1)
②為了將空間中的點(diǎn)投影到二維切平面∏中,一般采用投影矩陣的方法,通過平移和旋轉(zhuǎn)等一系列操作得到三維點(diǎn)在切平面上的投影(如圖1所示)。投影矩陣ΤM∏的公式如下:
圖1 三維k鄰近點(diǎn)的局部投影圖Fig.1 Local projection of three dimensional k-nearest points
ΤM∏=Tc·Rx·Ry
(2)
其中,Tc為平移變換矩陣:
Rx為圍繞x軸旋轉(zhuǎn)α度:
Ry為圍繞y軸旋轉(zhuǎn)θ度:
通過式(1)和式(2)可以求出任一點(diǎn)q(xi,yi,zi)在其切平面∏上的投影:
(3)
3)對(duì)該二維平面上的點(diǎn)使用貪婪投影算法進(jìn)行三角剖分,并且每次都選擇局部最優(yōu)點(diǎn)作為擴(kuò)展點(diǎn),再通過投影關(guān)系,將其擴(kuò)展的點(diǎn)映射回空間,不斷重復(fù)這一過程,最終完成物體的表面重構(gòu)。
步驟一:在點(diǎn)云數(shù)據(jù)中選擇任一點(diǎn)qi作為初始生長(zhǎng)點(diǎn),使用KD樹算法搜索其近鄰點(diǎn),在其鄰域內(nèi)找到距離qi最近的點(diǎn)qj并使用直線進(jìn)行連接,得到線段qiqj,并將其作為三角形的一條生長(zhǎng)邊。
步驟二:計(jì)算距離邊qiqj最近的點(diǎn)qk,然后構(gòu)造出第一個(gè)三角形Δqiqjqk。如圖2(a)所示。
圖2 貪婪投影三角化流程圖Fig.2 Greedy projection triangulation process
步驟三:在步驟二的基礎(chǔ)上,繼續(xù)尋找距離三角形Δqiqjqk任一邊最近的點(diǎn),構(gòu)成新的三角形。如圖2(c)所示。
步驟四:重復(fù)步驟三,直到所有點(diǎn)被選擇完畢并構(gòu)建出完整的拓?fù)浣Y(jié)構(gòu),則算法結(jié)束。如圖2(d)所示。
該算法的原理并不復(fù)雜,但是在實(shí)現(xiàn)過程中存在一些問題:①使用KD樹鄰域搜索算法需要耗費(fèi)大量的時(shí)間進(jìn)行回溯,延長(zhǎng)了重建的時(shí)間;②當(dāng)需要重建的物體表面點(diǎn)云密度不均勻時(shí),使用該算法會(huì)產(chǎn)生錯(cuò)誤的拓?fù)浣Y(jié)構(gòu),從而導(dǎo)致重建效果不理想;③當(dāng)重建物體表面過于復(fù)雜時(shí),該算法難以確定投影點(diǎn)與三維空間中的點(diǎn)對(duì)應(yīng)的位置關(guān)系,所以會(huì)丟失一部分物體信息,造成曲面重疊并使重構(gòu)后的模型出現(xiàn)孔洞。
體像素網(wǎng)格濾波的基本原理是:根據(jù)輸入的點(diǎn)云數(shù)據(jù)建立三維體素柵格,三維體素柵格是一種微小的空間三維立方體的集合,通過設(shè)定采樣距離的參數(shù)大小,可以將這些三維立方體等距劃分為a·b·c個(gè)立方體,并將輸入的點(diǎn)云數(shù)據(jù)劃分到立方體中,將這些包含點(diǎn)云的立方體看成是子包圍盒,剔除掉主體之外的所有立方體,最后計(jì)算這些主體中所有點(diǎn)的重心,并使用該重心近似代替這些點(diǎn)。該方法在思想上簡(jiǎn)單并且易于實(shí)現(xiàn),對(duì)于散亂無(wú)序的點(diǎn)云不需要再次建立點(diǎn)云間的拓?fù)潢P(guān)系,減少了計(jì)算量,加快了算法的重建速度。
八叉樹最初由Hunter博士提出,該方法被廣泛用來(lái)表示三維空間,是四叉樹在空間范圍內(nèi)的推廣[14]。八叉樹在對(duì)點(diǎn)云進(jìn)行管理時(shí)所采取的思想是:八叉樹根據(jù)全部點(diǎn)云的最小外接包圍盒建立根節(jié)點(diǎn)。然后根據(jù)等分原理將外接包圍盒等分為8個(gè)小立方體,也就是子節(jié)點(diǎn)。在對(duì)點(diǎn)云進(jìn)行歸類的過程中,根據(jù)位置關(guān)系將其劃分到對(duì)應(yīng)的子節(jié)點(diǎn)中。至此,三維點(diǎn)云數(shù)據(jù)已經(jīng)按照各自特性剖分完畢。八叉樹算法在搜索大規(guī)模點(diǎn)云時(shí),效率要高于KD樹,并且自動(dòng)化程度較高,可以對(duì)點(diǎn)云三維重建的時(shí)間進(jìn)行優(yōu)化。圖3為八叉樹的結(jié)構(gòu)示意圖。
圖3 八叉樹結(jié)構(gòu)圖Fig.3 Octree structure diagram
在擬合區(qū)域的局部子域上,擬合函數(shù)f(x)表示為:
=pT(x)a(x)f(x)
(4)
其中,a(x)=[a1(x),a2(x),…,am(x)]T為待求系數(shù);p(x)=[p1(x),p2(x),…,pm(x)]T為基函數(shù);它是一個(gè)k階完全多項(xiàng)式;m是基函數(shù)的項(xiàng)數(shù)。對(duì)于一維問題,它的基函數(shù)為p(x)=[1,x,x2,…,xm]T,對(duì)于二維問題,線性基為p(x)=[1,x,y]T,m=6,二次基通常為[1,x,y,x2,y2,xy]T,m=6,為了盡可能獲得更精確的局部逼近,有必要將f(xi)與節(jié)點(diǎn)值yi的局部逼近之差的平方權(quán)值最小化。因此,離散加權(quán)范式為:
(5)
其中,n是影響區(qū)域的節(jié)點(diǎn)數(shù);f(x)是擬合函數(shù);w(x-xi)是節(jié)點(diǎn)xi的權(quán)函數(shù)。為了確定系數(shù)a(x),式(2)中pT(xi)a(x)-yi應(yīng)取極小值,從而得:
a=(BWBT)-1BWy
(6)
通過式(6)可以計(jì)算出式(4)中的各項(xiàng)系數(shù),將未知點(diǎn)代入式(4)中,就能求得該未知點(diǎn)的擬合函數(shù)值。
權(quán)函數(shù)作為移動(dòng)最小二乘法中最重要的部分,權(quán)函數(shù)w(x-xi)在移動(dòng)最小二乘法中具有緊支性,即權(quán)函數(shù)在x的子域內(nèi)不為0,這個(gè)子域外全是0,這個(gè)子域?yàn)閤的影響域(即權(quán)函數(shù)的支持域),其半徑記為Smax。選擇權(quán)函數(shù)時(shí)應(yīng)遵循以下原則:
①權(quán)值函數(shù)的緊支決定了各節(jié)點(diǎn)在支持域中的權(quán)值大于0,在支撐區(qū)域外或邊界處的權(quán)值等于0。
②必須有單位分解。
③權(quán)函數(shù)要光滑連續(xù),可以推導(dǎo)出函數(shù)。
④在支撐域中,隨著‖x-xi‖的增加,權(quán)值減小。
(ⅰ)點(diǎn)云平滑處理
常用的權(quán)函數(shù)是三次樣條權(quán)函數(shù),其表達(dá)式為:
(7)
(ⅱ)點(diǎn)云重采樣
在空間點(diǎn)云數(shù)據(jù)重采樣中,重采樣點(diǎn)的位置會(huì)相對(duì)于起始采樣點(diǎn)發(fā)生變化,因此權(quán)因子w(x-xi)也應(yīng)隨著待求點(diǎn)位置的變化而變化,針對(duì)這種情況,本文使用如下權(quán)函數(shù):
(8)
式中,di(x)表示第i個(gè)原始采樣點(diǎn)pi與重采樣點(diǎn)p之間的距離;u表示影響區(qū)域中的特征與重采樣間的影響因子。
通過式(8)權(quán)函數(shù)對(duì)式(6)進(jìn)行計(jì)算,求得該擬合函數(shù)的系數(shù)矩陣。
α(x)=(BW(x)BT)-1BW(x)y
(9)
式中,W(x)為高斯權(quán)函數(shù)的對(duì)角矩陣。
傳統(tǒng)的貪婪投影算法在估計(jì)法向量時(shí)采用的是PCA算法,該算法在估計(jì)法向量時(shí)的正確率不高,造成重建時(shí)出現(xiàn)錯(cuò)誤的拓?fù)浣Y(jié)構(gòu);在處理大規(guī)模點(diǎn)云時(shí),KD樹的搜索效率要低于八叉樹。因此本文的改進(jìn)算法采用基于MLS法向量估計(jì)算法來(lái)進(jìn)行法向量計(jì)算并進(jìn)行重建,并且使用八叉樹來(lái)代替KD樹進(jìn)行近鄰域搜索(如圖4所示)。具體的步驟流程如下:
圖4 本文算法流程Fig.4 The Algorithm Flow of This Paper
步驟一:對(duì)原始點(diǎn)云采用體像素網(wǎng)格濾波算法進(jìn)行下采樣,實(shí)現(xiàn)點(diǎn)云的簡(jiǎn)化并保持密度均勻。
步驟二:針對(duì)步驟一中得到的點(diǎn)云表面粗糙,傳統(tǒng)貪婪投影算法不能很好地進(jìn)行平滑處理,所以采用MLS算法對(duì)點(diǎn)云進(jìn)行平滑及重采樣處理,得到表面更加平滑的點(diǎn)云數(shù)據(jù)。
步驟三:對(duì)步驟二生成的點(diǎn)云,采用基于MLS算法的點(diǎn)云法線估計(jì)的貪婪投影算法對(duì)點(diǎn)云進(jìn)行重建,并且使用八叉樹來(lái)代替KD樹進(jìn)行近鄰域搜索,最終得到效果較好的曲面模型。
為了驗(yàn)證本文算法的有效性和可行性,在本次實(shí)驗(yàn)中,實(shí)驗(yàn)平臺(tái)的軟件開發(fā)工具為Windows10操作系統(tǒng)、vs2019、pcl1.11.0,以及處理點(diǎn)云所需的CMAKE、VTK、boost庫(kù)等。實(shí)驗(yàn)數(shù)據(jù)選用兩種數(shù)據(jù)源:分別為斯坦福大學(xué)的標(biāo)準(zhǔn)數(shù)據(jù)集horse和通過Trimble TX8三維激光掃描儀獲取的雕塑數(shù)據(jù)。如圖5所示。
圖5 實(shí)驗(yàn)數(shù)據(jù)Fig.5 Experimental Data
為了體現(xiàn)出改進(jìn)算法的性能,對(duì)比了泊松算法、傳統(tǒng)貪婪投影算法和本文算法的重建時(shí)間和不同點(diǎn)云數(shù)據(jù)預(yù)處理前后的點(diǎn)云數(shù)量變化,如表1和表2所示。從表1可以看出泊松算法的重建時(shí)間要長(zhǎng)于傳統(tǒng)貪婪投影算法和改進(jìn)算法,由于泊松算法需要使用移動(dòng)立方體算法原理來(lái)提取等值面,所以耗時(shí)更長(zhǎng)。本文算法的重建時(shí)間比傳統(tǒng)貪婪投影算法減少了約30 %、比泊松算法減少了約45 %,效率提升明顯。
表1 三種算法耗時(shí)對(duì)比Tab.1 Time consuming comparison of three algorithms
表2 點(diǎn)云預(yù)處理前后的數(shù)量變化Tab.2 Comparison of the number of point clouds before and after pretreatment
圖6為預(yù)處理后的horse數(shù)據(jù)和雕塑數(shù)據(jù)分別進(jìn)行傳統(tǒng)貪婪投影算法的法線估計(jì)和MLS算法的法線估計(jì),由于傳統(tǒng)貪婪投影算法與泊松算法的法線估計(jì)方法一致,故不加入對(duì)比。分析圖6(a)和圖6(b)與圖6(c)和圖6(d)可以發(fā)現(xiàn),在模型的邊緣、角點(diǎn)、horse數(shù)據(jù)的腿部和雕塑數(shù)據(jù)的手臂處,傳統(tǒng)貪婪投影算法的法線方向估計(jì)一致性較差,MLS算法在這幾處地方的法線估計(jì)一致性要優(yōu)于傳統(tǒng)算法,所以使用MLS算法進(jìn)行法線估計(jì)可以為后期的重建提供一個(gè)更加準(zhǔn)確的法線輸入,提高重建的精度。
圖6 法線估計(jì)可視化Fig.6 Visualization of normal estimation
將兩組點(diǎn)云數(shù)據(jù)分別應(yīng)用泊松算法、傳統(tǒng)貪婪投影算法和本文算法進(jìn)行重建效果比對(duì)。重建結(jié)果如圖7、8所示。從圖7(a)和圖8(a)可以看出,泊松重建無(wú)論是在細(xì)節(jié)處,還是在模型的完整度上,都不如貪婪投影算法的重建效果好,并且在雕塑數(shù)據(jù)重建時(shí)出現(xiàn)了偽平面,這是由于泊松算法適用于具有封閉性的點(diǎn)云。分析圖7、圖8中的(b)、(c),對(duì)于標(biāo)準(zhǔn)horse數(shù)據(jù),由于其整體結(jié)構(gòu)簡(jiǎn)單,重建的效果差異不大;對(duì)于雕塑數(shù)據(jù),由于其結(jié)構(gòu)復(fù)雜,對(duì)點(diǎn)云進(jìn)行體像素網(wǎng)格濾波重建后,效果要明顯好于直接使用貪婪投影算法進(jìn)行重建,這是因?yàn)樵键c(diǎn)云中包含許多冗余點(diǎn),在進(jìn)行法線估計(jì)時(shí)會(huì)產(chǎn)生錯(cuò)誤的結(jié)果,從而導(dǎo)致孔洞的產(chǎn)生。分析圖7、圖8中的(c)、(d)可以看出,經(jīng)過體像素網(wǎng)格濾波和MLS算法的平滑與重采樣后,標(biāo)準(zhǔn)horse數(shù)據(jù)和雕塑數(shù)據(jù)生成的模型均在細(xì)節(jié)處表達(dá)出了更好的效果。最后使用本文改進(jìn)的算法和傳統(tǒng)貪婪投影算法進(jìn)行重建,對(duì)比圖7、圖8的(a)、(e)可以看出,在horse數(shù)據(jù)的頭部和腿部處保證了細(xì)節(jié)不丟失,并且孔洞有所減少;雕塑數(shù)據(jù)在保證手臂和大腿處的衣服褶皺不丟失的基礎(chǔ)上,提高了模型整體的平滑效果,并且有效的減少了孔洞的產(chǎn)生,而且在面部和衣服等位置處保持了較高的網(wǎng)格細(xì)節(jié)。通過以上分析可以得出本文改進(jìn)的算法重建出的模型孔洞少、表面更加光滑、細(xì)節(jié)表達(dá)效果也較好。
圖7 Horse重建效果Fig.7 The effect of horse reconstruction
圖8 雕塑重建效果Fig.8 The effect of sculpture reconstruction
采用4個(gè)定量分析精度評(píng)價(jià)指標(biāo),即利用Geomagic Studio軟件計(jì)算點(diǎn)云到模型實(shí)體的最大偏差距離、平均偏差距離、標(biāo)準(zhǔn)差和均方根誤差,并且使用該軟件顯示三種算法生成模型面片的數(shù)量,以此對(duì)三種算法生成模型的重建結(jié)果進(jìn)行精度評(píng)價(jià)。如表3、表4和表5所示。由于horse數(shù)據(jù)結(jié)構(gòu)較為簡(jiǎn)單,三種算法重建精度差異不大,在三角面片生成數(shù)量上,本文算法也要少于其他兩種算法。對(duì)于采集的雕塑數(shù)據(jù),由于其結(jié)構(gòu)復(fù)雜,本文算法在精度上相比于泊松算法要提升了1.13 mm,相較于傳統(tǒng)貪婪投影算法提升了0.53 mm,在生成三角面片的數(shù)量上本文算法也要優(yōu)于泊松算法和傳統(tǒng)貪婪投影算法,通過分析可以得出本文算法滿足大多數(shù)領(lǐng)域中建模的精度要求。
表3 Horse模型重建精度分析Tab.3 Accuracy analysis of horse model reconstruction
表4 雕塑模型重建精度分析Tab.4 Accuracy analysis of sculpture model reconstruction
表5 重建模型面片數(shù)量Tab.5 Number of reconstruction model patches
針對(duì)目前的點(diǎn)云三維重建的貪婪投影算法存在的重建耗時(shí)長(zhǎng),重構(gòu)的模型存在表面粗糙、孔洞等問題,提出首先采用體像素網(wǎng)格濾波對(duì)點(diǎn)云進(jìn)行下采樣,然后采用移動(dòng)最小二乘算法來(lái)對(duì)點(diǎn)云進(jìn)行平滑及重采樣,并且使用八叉樹代替KD樹進(jìn)行近鄰域搜索,最后使用基于移動(dòng)最小二乘算法的點(diǎn)云法線估計(jì)的貪婪投影算法對(duì)點(diǎn)云進(jìn)行重建,在保證重建效果的前提下,減少了重建的時(shí)間。通過實(shí)驗(yàn)驗(yàn)證,本文算法相較于泊松算法和傳統(tǒng)的貪婪投影算法,耗時(shí)短,在模型表面的光滑度和孔洞修復(fù)上顯示了更好的重建效果。但從實(shí)驗(yàn)結(jié)果可以看出,雖然改進(jìn)算法對(duì)孔洞修復(fù)有了一定的改善,但還存在一些細(xì)小的孔洞,未能達(dá)到孔洞的完全修復(fù),因此針對(duì)三維重建中孔洞完全修復(fù)有待進(jìn)一步深入研究。