專利名稱:三維掃描系統(tǒng)中的圖形重構(gòu)方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種三維掃描系統(tǒng)中的圖形重構(gòu)方法。
本發(fā)明主要是涉及到逆向工程(圖1)中,用三維掃描系統(tǒng)(圖2)獲取產(chǎn)品海量數(shù)據(jù)點(diǎn)(點(diǎn)云),經(jīng)過對(duì)這些點(diǎn)云數(shù)據(jù)的過濾處理和無縫拼接,然后對(duì)拼接后的點(diǎn)云塊進(jìn)行切割處理得到線,再在點(diǎn)或線的基礎(chǔ)上構(gòu)造面,進(jìn)而構(gòu)造出產(chǎn)品幾何模型。利用本發(fā)明,可以作為三維掃描儀器和三維CAD軟件的接口模塊,搭起二者之間的橋梁,并在此基礎(chǔ)上研究直接由點(diǎn)云數(shù)據(jù)做面的處理方法。
背景技術(shù):
逆向工程在實(shí)踐中有著廣泛的應(yīng)用前景。主要是由于不少產(chǎn)品外形復(fù)雜,如汽車和飛機(jī)的覆蓋件、人造假肢、陶瓷產(chǎn)品、藝術(shù)雕塑品及各種復(fù)雜零部件等,其自由曲面的設(shè)計(jì)表達(dá)或數(shù)學(xué)模型的建立都十分困難,現(xiàn)有的CAD系統(tǒng)尚難以進(jìn)行嚴(yán)格的幾何描述。
在逆向工程中,如何將實(shí)物零件經(jīng)過三維測(cè)量和處理,實(shí)現(xiàn)三維模型重構(gòu)和交互設(shè)計(jì)、修改,以便于通過快速成型或數(shù)控加工快速制作產(chǎn)品投放市場(chǎng),是逆向工程研究的關(guān)鍵。
在逆向工程中,我們一般是通過三坐標(biāo)測(cè)量機(jī)(CMM)、激光測(cè)量機(jī)、光柵掃描儀或工業(yè)CT等先進(jìn)的快速測(cè)量系統(tǒng)獲取海量數(shù)據(jù)點(diǎn)(點(diǎn)云),對(duì)這些點(diǎn)云數(shù)據(jù)進(jìn)行過濾處理和無縫拼接后,對(duì)拼接后的點(diǎn)云塊進(jìn)行切割得到線,再在點(diǎn)或線的基礎(chǔ)上構(gòu)造面。一般情況下,由測(cè)量得到的點(diǎn)云由于產(chǎn)品尺寸、拓?fù)涞雀鞣N原因都是經(jīng)過多次測(cè)量拼接后得到的,因此點(diǎn)云數(shù)據(jù)具有數(shù)據(jù)量大(海量)、數(shù)據(jù)雜亂無序等特點(diǎn),一般情形下這些點(diǎn)云數(shù)據(jù)無法被現(xiàn)在廣泛使用的商業(yè)CAD軟件如CATIA、Pro/ENGINEER、UG等直接進(jìn)行處理,因此需要有能對(duì)雜亂海量數(shù)據(jù)點(diǎn)云的進(jìn)行預(yù)處理有序的點(diǎn)并實(shí)現(xiàn)取線等基本功能的中間模塊,這也是逆向工程中的一個(gè)瓶頸問題,對(duì)于逆向工程的應(yīng)用和推廣都有十分重要的意義。
發(fā)明內(nèi)容本發(fā)明提供一種能夠提高圖形重構(gòu)速度的三維掃描系統(tǒng)中圖形重構(gòu)方法。
本發(fā)明采用如下技術(shù)方案一種三維掃描系統(tǒng)中的圖形重構(gòu)方法第一步對(duì)預(yù)處理后的點(diǎn)云進(jìn)行平行切割,得到N個(gè)平行截面,再在每個(gè)平行截面的上方和下方分別對(duì)點(diǎn)云實(shí)施平行切割,得到N個(gè)含有平行截面的截體,將各個(gè)截體內(nèi)的點(diǎn)云上的點(diǎn)向該截體內(nèi)的平行截面進(jìn)行垂直投影,并將該截體內(nèi)平行截面點(diǎn)的垂直投影視為截體內(nèi)平行截面與點(diǎn)云的截點(diǎn),由各個(gè)截體內(nèi)平行截面與點(diǎn)云的截點(diǎn)分別構(gòu)成N條鏈表Li(i=1,2,...,N),在各個(gè)截體內(nèi)的截點(diǎn)中分別選出一組處理點(diǎn),該處理點(diǎn)是滿足以下條件的截點(diǎn),該條件為兩處理點(diǎn)間的距離為點(diǎn)云內(nèi)相鄰兩點(diǎn)之間的間距或其整數(shù)倍。
第二步分別對(duì)每條鏈表中的處理點(diǎn)進(jìn)行排序,該排序方法為在每條鏈表中找出X坐標(biāo)最小的點(diǎn)A(xa,ya,za)和最大的點(diǎn)B(xb,yb,zb),采用經(jīng)過直線AB垂直平行截面的所在面的平面把每條鏈表中的處理點(diǎn)剖開成兩部分,并分別將該兩部分處理點(diǎn)的X坐標(biāo)值按照由小到大順序,分別置于列表list1及列表1ist2中,再將列表list2中的處理點(diǎn)排在列表list1中的處理點(diǎn)之后,置于剛處理的原鏈表中。
第三步取相鄰的兩條鏈表Li和Li+1,分別取出Li和Li+1中的第一個(gè)點(diǎn)和第二個(gè)點(diǎn),將取出的4個(gè)點(diǎn)連接成一個(gè)四邊形;然后再分別取出Li和Li+1兩條鏈表中第二個(gè)點(diǎn)和第三個(gè)點(diǎn),將取出的4各點(diǎn)連接成一個(gè)四邊形,以此類推,直至兩條鏈表Li和Li+1中的所有處理點(diǎn)都處理完畢;最后將兩條鏈表Li和Li+1中的處理點(diǎn)形成的四邊形沿任意一條對(duì)角線進(jìn)行三角剖分。
按以上操作對(duì)剩余的相鄰鏈表所形成的截體表面進(jìn)行三角剖分,形成由三角形構(gòu)成的三角網(wǎng)格,第四步將由上述三角剖分所得到的各個(gè)三角形的三個(gè)頂點(diǎn)的參數(shù)值帶入OpenGL中提供的API函數(shù),就可在顯示器上再現(xiàn)真實(shí)的原始物體。
與現(xiàn)有技術(shù)相比,本發(fā)明具有如下優(yōu)點(diǎn)本發(fā)明主要用于三維掃描系統(tǒng)中的海量無序數(shù)據(jù)點(diǎn)(點(diǎn)云)的處理,經(jīng)過對(duì)這些點(diǎn)云數(shù)據(jù)的過濾處理和無縫拼接,由拼接后的點(diǎn)云塊進(jìn)行切割得到線,再在點(diǎn)或線的基礎(chǔ)上構(gòu)造面。該方法主要有以下優(yōu)點(diǎn)(1)處理數(shù)據(jù)量極大,可達(dá)幾百萬乃至上千萬個(gè)點(diǎn),而對(duì)硬件無太高要求,最低配置內(nèi)存僅為64M,任何一臺(tái)能運(yùn)行三維設(shè)計(jì)軟件的機(jī)器上都能運(yùn)行本軟件。
(2)建面算法對(duì)點(diǎn)云不要求任何附加幾何和拓?fù)湫畔?包括測(cè)點(diǎn)法矢,曲面邊界信息),可以散亂點(diǎn)集為處理對(duì)象,在點(diǎn)處理的適應(yīng)性上比一般的三維設(shè)計(jì)軟件強(qiáng)得多。
(3)建面時(shí)通過優(yōu)化算法先對(duì)海量數(shù)據(jù)進(jìn)行劃分,然后排序,最后由相鄰點(diǎn)列構(gòu)造三角形,極大的加快了點(diǎn)云的三角化的速度。簡(jiǎn)單、實(shí)效,較其它的CAD軟件構(gòu)造面的速度更快。
(4)操作簡(jiǎn)單易行,不需一般的三維CAD軟件那樣需要使用者有較深的專業(yè)設(shè)計(jì)背景知識(shí)。
(5)本算法充分利用VC++6.0這種開發(fā)工具中MFC的豐富資源,能夠方便地實(shí)現(xiàn)數(shù)據(jù)的連接。充分利用了MFC中CObList類和CObArray類,可以直接調(diào)用其成員函數(shù)來管理和處理數(shù)據(jù),簡(jiǎn)化了程序的復(fù)雜性,加快了計(jì)算速度,實(shí)現(xiàn)了數(shù)據(jù)管理的高效性,可以極大的縮短編程時(shí)間,減少錯(cuò)誤,提高網(wǎng)格生成效率。
(6)本發(fā)明充分利用了OpenGL中提供的API函數(shù)顯示三角形,再賦予材質(zhì)屬性并打上光照渲染,則就可在顯示器上再現(xiàn)真實(shí)的原始物體。
(7)仿真結(jié)果表明本發(fā)明提供的構(gòu)建曲面的思路是可行的,其三角網(wǎng)格化的速度很快并且質(zhì)量很好,曲面重建的效果良好。
圖1是逆向工程流程圖。
圖2光柵式三維掃描系統(tǒng)組成圖。
圖3圖形重構(gòu)方法算法整體流程圖。
圖4獲取截線云算法的流程圖。
圖5是經(jīng)過預(yù)處理的小熊模型點(diǎn)云數(shù)據(jù)圖形。
圖6是給定平行面間距d=4.0情況下求得的截線云數(shù)據(jù)圖形。
圖7是從圖6中的截線云數(shù)據(jù)抽取出的一段數(shù)據(jù)鏈條圖形。
圖8封閉環(huán)式的截線云示意圖。
圖9跨距。
圖10對(duì)應(yīng)于曲面重構(gòu)問題的有向圖搜索問題。
圖11啟發(fā)式搜索方法。
圖12原始點(diǎn)云。
圖13三角化點(diǎn)云。
圖14三角化曲面。
圖15曲率均值化后三角化曲面。
具體實(shí)施方式一種三維掃描系統(tǒng)中的圖形重構(gòu)方法第一步對(duì)預(yù)處理后的點(diǎn)云進(jìn)行平行切割,得到N個(gè)平行截面,再在每個(gè)平行截面的上方和下方分別對(duì)點(diǎn)云實(shí)施平行切割,得到N個(gè)含有平行截面的截體,將各個(gè)截體內(nèi)的點(diǎn)云上的點(diǎn)向該截體內(nèi)的平行截面進(jìn)行垂直投影,并將該截體內(nèi)平行截面點(diǎn)的垂直投影視為截體內(nèi)平行截面與點(diǎn)云的截點(diǎn),由各個(gè)截體內(nèi)平行截面與點(diǎn)云的截點(diǎn)分別構(gòu)成N條鏈表Li(i=1,2,...,N),在各個(gè)截體內(nèi)的截點(diǎn)中分別選出一組處理點(diǎn),該處理點(diǎn)是滿足以下條件的截點(diǎn),該條件為兩處理點(diǎn)間的距離為點(diǎn)云內(nèi)相鄰兩點(diǎn)之間的間距或其整數(shù)倍。
第二步分別對(duì)每條鏈表中的處理點(diǎn)進(jìn)行排序,該排序方法為在每條鏈表中找出X坐標(biāo)最小的點(diǎn)A(xa,ya,za)和最大的點(diǎn)B(xb,yb,zb),采用經(jīng)過直線AB垂直平行截面的所在面的平面把每條鏈表中的處理點(diǎn)剖開成兩部分,并分別將該兩部分處理點(diǎn)的X坐標(biāo)值按照由小到大順序,分別置于列表list1及列表list2中,再將列表list2中的處理點(diǎn)排在列表list1中的處理點(diǎn)之后,置于剛處理的原鏈表中。
第三步取相鄰的兩條鏈表Li和Li+1,分別取出Li和Li+1中的第一個(gè)點(diǎn)和第二個(gè)點(diǎn),將取出的4個(gè)點(diǎn)連接成一個(gè)四邊形;然后再分別取出Li和Li+1兩條鏈表中第二個(gè)點(diǎn)和第三個(gè)點(diǎn),將取出的4各點(diǎn)連接成一個(gè)四邊形,以此類推,直至兩條鏈表Li和Li+1中的所有處理點(diǎn)都處理完畢;最后將兩條鏈表Li和Li+1中的處理點(diǎn)形成的四邊形沿任意一條對(duì)角線進(jìn)行三角剖分。
按以上操作對(duì)剩余的相鄰鏈表所形成的截體表面進(jìn)行三角剖分,形成由三角形構(gòu)成的三角網(wǎng)格,第四步將由上述三角剖分所得到的各個(gè)三角形的三個(gè)頂點(diǎn)的參數(shù)值帶入OpenGL中提供的API函數(shù),就可在顯示器上再現(xiàn)真實(shí)的原始物體。
本發(fā)明提供對(duì)雜亂海量數(shù)據(jù)進(jìn)行點(diǎn)的先期處理、得到有序的點(diǎn)、實(shí)現(xiàn)取線功能、直至構(gòu)造曲面的功能,其中具體需要的對(duì)點(diǎn)云操作的主要功能如下2.1讀數(shù)據(jù)顯示點(diǎn)云由于逆向工程中由掃描系統(tǒng)得到的數(shù)據(jù)量極大,經(jīng)常達(dá)到上百萬個(gè)點(diǎn),這樣海量數(shù)據(jù)的讀取與顯示極其費(fèi)時(shí),為了把數(shù)據(jù)圖形快速顯示,對(duì)程序的算法執(zhí)行效率要求極高。本程序算法運(yùn)用VC和OpenGL中的一些函數(shù)功能進(jìn)行優(yōu)化組合,使數(shù)據(jù)的讀取與顯示速度比常規(guī)情況下有了極大的提高。
2.2平移、旋轉(zhuǎn)、放縮點(diǎn)云三維圖形比之二維圖形的優(yōu)勢(shì)之一在于,我們能夠從不同的角度對(duì)之進(jìn)行觀察和研究,然而計(jì)算機(jī)的顯示屏幕卻只是二維的,我們可以通過設(shè)置景深的灰度來來展現(xiàn)整個(gè)畫面的縱深感,但要想觀測(cè)到三維對(duì)象的不同側(cè)面,這還是不夠的。既然觀察者的位置是固定的,我們就想辦法讓圖形對(duì)象動(dòng)起來。所以在這個(gè)軟件中,我們?cè)O(shè)置了平移、旋轉(zhuǎn)操作,而很多時(shí)候,要想知道畫面細(xì)節(jié),需要對(duì)畫面的局部地方進(jìn)行很清楚的觀察、操作。故而在這個(gè)軟件中我們也加入了相應(yīng)放縮功能。
平移、旋轉(zhuǎn)、放縮由于都是對(duì)整個(gè)對(duì)象的海量數(shù)據(jù)操作,計(jì)算量十分巨大,對(duì)時(shí)間的要求很高。
2.3稀釋點(diǎn)云輸入數(shù)據(jù)的數(shù)據(jù)量如果太大,會(huì)使平移、旋轉(zhuǎn)、放縮的運(yùn)算量太大,從而反應(yīng)時(shí)間也會(huì)相應(yīng)的增加。因此,本軟件提供稀釋功能,這樣平移、旋轉(zhuǎn)、放縮的運(yùn)算量可以僅為原先的幾十分之一。用戶可以先對(duì)圖形進(jìn)行稀釋,當(dāng)把圖形轉(zhuǎn)換到想要觀察的部分,再對(duì)它進(jìn)行復(fù)原操作。有時(shí)候,用戶不需要太高的精度,數(shù)據(jù)量太大,給出很多用戶覺得是冗余的信息,也可對(duì)點(diǎn)云塊進(jìn)行稀釋,再以稀釋后的點(diǎn)云為基礎(chǔ)進(jìn)行操作。從而大大減少運(yùn)算量。
2.4刪除點(diǎn)云雖然現(xiàn)在的測(cè)量系統(tǒng)的研究已經(jīng)取得了長(zhǎng)足進(jìn)步,測(cè)量得到的數(shù)據(jù)也已基本滿足要求,特別是精度可達(dá)0.1mm,然而其還未能達(dá)到智能化的水平,因此無法自行分辨出測(cè)量物體與背景物。雖然背景可以用反射性能很差的黑色,但大多數(shù)情況還是不可避免地帶入很多無用的雜點(diǎn),如果不把這些雜點(diǎn)去掉,將會(huì)影響后期取線和做面的效果,使其無法精確的復(fù)現(xiàn)測(cè)量物的原貌。而有些時(shí)候,我們雖然測(cè)量到整個(gè)物體的點(diǎn)云數(shù)據(jù),但我們只對(duì)其中的一部分感興趣,這時(shí),也需要?jiǎng)h去其它我們不需要的部分以減少點(diǎn)云處理的工作量,從而大大加快處理時(shí)間。
2.5點(diǎn)云拼接在產(chǎn)品外形的測(cè)量過程中,通常不能在同一坐標(biāo)系下將產(chǎn)品的幾何數(shù)據(jù)一次測(cè)出,其原因之一是產(chǎn)品的尺寸超出了測(cè)量的行程,二是在部分區(qū)域測(cè)量探頭受被測(cè)實(shí)物的幾何形狀的干涉阻礙,不能觸及產(chǎn)品的反面,而應(yīng)將這些不同坐標(biāo)系下的重定位數(shù)據(jù)變換到同一坐標(biāo)系中,這個(gè)過程稱之為測(cè)量數(shù)據(jù)(多視角數(shù)據(jù))的重定位,也即拼接。本發(fā)明的特征是針對(duì)經(jīng)過過濾處理和無縫拼接的點(diǎn)云數(shù)據(jù),進(jìn)行切割處理得到線,再在點(diǎn)或線的基礎(chǔ)上構(gòu)造面,進(jìn)而構(gòu)造出產(chǎn)品幾何模型。
下面結(jié)合附圖示例對(duì)本發(fā)明的具體實(shí)施方式
作進(jìn)一步描述。根據(jù)上述方法,對(duì)測(cè)量得到的海量點(diǎn)云數(shù)據(jù)進(jìn)行曲面重構(gòu)。本軟件以PC上的Windows NT為開發(fā)平臺(tái),以Visual C++6.0為開發(fā)環(huán)境,利用集成在Visual C++中的三維圖形軟件接口的新一代標(biāo)準(zhǔn)OpenGL進(jìn)行編程。圖形重構(gòu)方法算法整體流程圖如圖3所示。對(duì)經(jīng)過過濾處理和無縫拼接的點(diǎn)云數(shù)據(jù)進(jìn)行曲面重構(gòu),主要包括以下步驟(一)切割點(diǎn)云線在點(diǎn)云預(yù)處理之后,通過旋轉(zhuǎn)平移選好角度后,給定一系列平行面,求得物體(實(shí)際上是物體表面上的海量點(diǎn))在這一截面上的數(shù)據(jù)點(diǎn)。但海量數(shù)據(jù)是離散的,給定某一任意平面,可能沒有(或者只有極個(gè)別點(diǎn))在截面上,為此,我們只能在精度許可范圍內(nèi),盡可能地去接近真實(shí)世界,這樣也就產(chǎn)生了如下的算法(算法流程圖如圖4所示)首先由海量數(shù)據(jù)中任意相鄰的一對(duì)點(diǎn)得到一個(gè)距離,而由這樣的M(M>100)個(gè)距離得到的平均值為d。
(1)對(duì)點(diǎn)云進(jìn)行預(yù)處理,去除雜點(diǎn)之后,通過旋轉(zhuǎn)平移選好切割角度后,給定一系列垂直于特征線的等間距的平行面(間距默認(rèn)為d的三倍)。
(2)在給定平行面上下各作一個(gè)平行于給定平行面的平行面(其間距均為d),這樣就由派生出來的兩個(gè)平行面構(gòu)成一個(gè)截體,而我們則把落入這個(gè)截體內(nèi)的點(diǎn)在給定平行面上的垂直投影近似作為真實(shí)物體上的點(diǎn)落在給定平行面上的點(diǎn),這樣就得到給定平面與真實(shí)物體的交點(diǎn)(截點(diǎn))。同理,我們也就得到物體在一組平行面上的截點(diǎn)。
(3)對(duì)這一組平面中的每一個(gè)平行面,其上的截點(diǎn)構(gòu)成一條鏈條。設(shè)這組平行面共有N個(gè),則得到N個(gè)鏈條。
(4)對(duì)每一個(gè)鏈條進(jìn)行處理由這些截點(diǎn)得到一組處理點(diǎn),這些處理點(diǎn)滿足條件A)兩點(diǎn)間的距離為d或者d的整數(shù)倍。
B)該點(diǎn)在給定截面(給定截體范圍內(nèi))上下都有臨近的離散點(diǎn)。
(5)對(duì)這N個(gè)鏈條處理就可以得到N個(gè)鏈條的處理點(diǎn)。即得到截線云。
根據(jù)上述方法,通過VC++6.0平臺(tái)用C++編程實(shí)現(xiàn)了對(duì)點(diǎn)云平行切割獲取截線云。圖5是經(jīng)過預(yù)處理的小熊模型點(diǎn)云數(shù)據(jù)。圖6是默認(rèn)給定平行面間距為相鄰點(diǎn)間距的三倍情況下求得的截線云數(shù)據(jù)。圖7是從圖6中的截線云數(shù)據(jù)抽取出的一段數(shù)據(jù)鏈條。
(二)截線云排序切割得到的截線云是無序的,即無法根據(jù)它們的存儲(chǔ)順序來推測(cè)拓?fù)漤樞?,為了使兩條截線云之間的三角網(wǎng)格化簡(jiǎn)單、直觀,需要對(duì)點(diǎn)云線進(jìn)行排序,以有序的兩條截線云構(gòu)造三角網(wǎng)格將大大降低復(fù)雜性,減少計(jì)算量。
排序就是將一組雜亂無章的數(shù)據(jù)按一定的規(guī)律順次排列起來。一般而言,排序首先要具有數(shù)據(jù)表,即通常指的排序?qū)ο?,排序?qū)ο笥卸鄠€(gè)屬性域,也就是多個(gè)數(shù)據(jù)成員組成,其中有一個(gè)屬性域可用來區(qū)分對(duì)象,作為排序的依據(jù),該域叫做關(guān)鍵碼。如果在數(shù)據(jù)表中各個(gè)對(duì)象的關(guān)鍵碼互不相同,這種關(guān)鍵碼稱為主關(guān)鍵碼。利用某一種排序方法按照主關(guān)鍵碼進(jìn)行排序,排序的結(jié)果是唯一的。但是數(shù)據(jù)表中有些對(duì)象的關(guān)鍵碼相同,這種情況下,可慮用某種方法進(jìn)行轉(zhuǎn)換限制,轉(zhuǎn)化為限制條件下的主關(guān)鍵碼進(jìn)行排序。
如圖8所示,截線云環(huán)是一個(gè)和Z軸垂直的平面(截線云存儲(chǔ)在鏈表ListM中),橫軸為X方向,豎軸為Y方向。如果截線云環(huán)是封閉環(huán),采用關(guān)鍵碼為點(diǎn)X軸方向坐標(biāo)值排序,除端點(diǎn)外,一個(gè)X值對(duì)應(yīng)兩個(gè)點(diǎn),即其關(guān)鍵碼不是單值性質(zhì)的。我們先找到截線云的X坐標(biāo)最小和最大的點(diǎn)A(xa,ya,za),B(xb,yb,zb)。采用經(jīng)過直線AB垂直截線云所在面的平面把截線云剖開成兩部分,判斷截線云上的每一個(gè)點(diǎn)在這個(gè)平面的哪個(gè)方向從而把這些點(diǎn)分成兩組,則每一組中關(guān)鍵碼是唯一的(在此例中關(guān)鍵碼是x)。兩組點(diǎn)分別排序,排好之后合并起來就能得到有序的截線云。由于圖8中截線云所在的面與Z軸垂直,因此可利用坐標(biāo)值y作為判斷標(biāo)準(zhǔn)對(duì)點(diǎn)分組。具體算法如下(1)得到直線AB的方程y=yb-yaxb-xa(x-xa)+ya.]]>(2)從截線云鏈表ListM中得到一點(diǎn)P(xi,yi,zi),把x=xi代入上面的方程得到y(tǒng)=y(tǒng)k。
(3)比較yk和yi,如果yk>=y(tǒng)i,點(diǎn)P歸入第一組點(diǎn)集list1,反之歸入第二組點(diǎn)集list2。
(4)LIstM中如果沒有點(diǎn)了,則分組結(jié)束;否則,返回到(2)。
list1從小到大排序,list2從大到小插入,各自插入完成之后,把鏈表list2的表第一個(gè)元素的指針插在鏈表list1的末尾。
排序的方法有插入排序、冒泡排序、選擇排序、希爾排序、堆排序、快速排序等,由于點(diǎn)云得到的點(diǎn)經(jīng)過拼合和后續(xù)的一些處理已變得毫無規(guī)律可循,成為雜亂點(diǎn),且用鏈表結(jié)構(gòu)存儲(chǔ),因此這里適合采用鏈表直接插入排序。
(三)截線云三角化經(jīng)過以上切割和排序處理的截線云可稱為輪廓線,現(xiàn)在從輪廓線就可以開始三維重建的工作了。本發(fā)明采用基于相鄰點(diǎn)列構(gòu)造三角形的重構(gòu)曲面算法。
(1)基本準(zhǔn)則假設(shè)兩相鄰平行平面上各有一輪廓線,如圖9示。上輪廓線的采樣點(diǎn)列為Q={Q0,Q1...,Qn-1},下輪廓線上的采樣點(diǎn)列為P={P0,P1...,Pm-1}。各輪廓線上采樣點(diǎn)列均按逆時(shí)針方向排列。如果用直線把上下輪廓線上的采樣點(diǎn)依次連接起來形成一個(gè)封閉的三角形帶,我們就得到一個(gè)過輪廓線的曲面的近似多邊形表示。
連接上輪廓線上的一點(diǎn)與下輪廓線上的一采樣點(diǎn)的線段稱為跨距。相鄰的兩跨距(共享一個(gè)采樣點(diǎn))構(gòu)成一個(gè)三角面片,稱為為基本三角面片。這兩個(gè)跨距稱為左跨距和右跨距。
采用三角片在P和Q之間構(gòu)造一個(gè)圓柱表面,三角片的頂點(diǎn)均來自P和Q。但是并非所有的組合方式都是可接受的,只有滿足以下條件的三角片集合才是可接受的1)每一個(gè)輪廓線段必須在而且只能在一個(gè)基本三角面片中出現(xiàn)。如果上下輪廓線各有m和n個(gè)輪廓線段,則合理的三角面模型含有m+n個(gè)基本三角面片。
2)如果一個(gè)跨距在某一基本三角面中為左跨距,則該跨距是且僅是另一個(gè)三角面片的右跨距。
將該問題歸結(jié)為對(duì)有向圖的搜索。如圖10所示,可以用一個(gè)有m行,n列的有向圖G(V,A)來表示點(diǎn)列及其連接關(guān)系。圖中每一個(gè)結(jié)點(diǎn)表示上輪廓線和下輪廓線的之間的一個(gè)跨距,Vij表示點(diǎn)Pi到Qj之間的跨距,有向弧[Vij,Vi,j+1]稱為水平弧,對(duì)應(yīng)了一個(gè)基本三角面片,其左跨距為Vij,右跨距為Vi,j+1。稱[Vij,Vi+1,j]為垂直弧,它同樣對(duì)應(yīng)了一個(gè)基本三角面片。G(V,A)由跨距節(jié)點(diǎn)和水平弧和垂直弧構(gòu)成。
因此,一個(gè)可接受的三角面模型對(duì)應(yīng)從V00到Vm-1,n-1的路徑。
(2)啟發(fā)式優(yōu)化逼近方法三角曲面重構(gòu)可以歸結(jié)為一個(gè)搜索問題。在圖10中,水平弧和垂直弧可以賦以不同的值,于是,基于輪廓線的三角曲面重構(gòu)問題歸結(jié)為以某個(gè)目標(biāo)函數(shù)極小或極大為目標(biāo),搜索一條從V00到Vm-1,n-1的路徑。本發(fā)明采用啟發(fā)式優(yōu)化逼近方法,用有向圖的啟發(fā)式搜索模型和相關(guān)性模型方法,其結(jié)果是在有向圖中尋找一條可接受的路徑而非最優(yōu)解,本算法是基于輪廓線相關(guān)性的一種啟發(fā)式算法,如圖11。
首先將上下輪廓線段的長(zhǎng)度正規(guī)化,使每條輪廓線的總長(zhǎng)度都為1。記w(Pi,Pi+k)為Pi到Pi+k之間的規(guī)范化距離,可以采用以下啟發(fā)式規(guī)則之一1)如果|w(P0,Pi)+w(Pi,Pi+1)-w(Q0,Qj)|<|w(Q0,Qj)+w(Qj,Qj+1)-w(P0,Pj)|,則選擇三角片PiPi+1Qj,否則選擇三角片PiQjQj+1。
2)如果w(P0,Pi)+w(Pi,Pi+1)<w(Q0,Qj)+w(Qj,Qj+1),則選擇三角片PiPi+1Qj,否則選擇三角片PiQjQj+1。
規(guī)則1)要求加入的三角片應(yīng)滿足上下邊之差保持最小,強(qiáng)調(diào)了上下層輪廓線之間的平衡。規(guī)則2)則要求加入的三角片是基于訪問過的累加周長(zhǎng)。
值得注意的事,啟發(fā)式搜索方法需要一對(duì)起始的匹配點(diǎn)對(duì)。
按照前面(1)、(2)所述方法即可完成排序截線云的三角網(wǎng)格化,形成點(diǎn)云的三角網(wǎng)格。其結(jié)果如圖13所示。由于在點(diǎn)云三角化之前已經(jīng)對(duì)點(diǎn)云進(jìn)行有效的優(yōu)化和排序處理,所以其三角網(wǎng)化的速度很快,且由實(shí)例可知其三角網(wǎng)格質(zhì)量也很高。
(四)圖形曲面顯示三角網(wǎng)格化后,為了更直觀的觀察曲面的光滑情況,本發(fā)明充分利用了OpenGL中提供的API函數(shù)顯示三角形,再賦予材質(zhì)屬性并打上光照渲染,則就可在顯示器上再現(xiàn)真實(shí)的原始物體。由于在構(gòu)面之前已先對(duì)線進(jìn)行有效的優(yōu)化和排序,因此,構(gòu)面的算法就不再繁冗復(fù)雜,而是簡(jiǎn)單高效,生成面的速度大大提高。這是本軟件的極大優(yōu)勢(shì)。
圖形曲面實(shí)例如圖14,15所示。由仿真例子可知,本發(fā)明提供的構(gòu)建曲面的思路是可行的,曲面重建的效果良好。
權(quán)利要求
1.一種三維掃描系統(tǒng)中的圖形重構(gòu)方法,其特征在于第一步對(duì)預(yù)處理后的點(diǎn)云進(jìn)行平行切割,得到N個(gè)平行截面,再在每個(gè)平行截面的上方和下方分別對(duì)點(diǎn)云實(shí)施平行切割,得到N個(gè)含有平行截面的截體,將各個(gè)截體內(nèi)的點(diǎn)云上的點(diǎn)向該截體內(nèi)的平行截面進(jìn)行垂直投影,并將該截體內(nèi)平行截面點(diǎn)的垂直投影視為截體內(nèi)平行截面與點(diǎn)云的截點(diǎn),由各個(gè)截體內(nèi)平行截面與點(diǎn)云的截點(diǎn)分別構(gòu)成N條鏈表Li(i=1,2,...,N),在各個(gè)截體內(nèi)的截點(diǎn)中分別選出一組處理點(diǎn),該處理點(diǎn)是滿足以下條件的截點(diǎn),該條件為兩處理點(diǎn)間的距離為點(diǎn)云內(nèi)相鄰兩點(diǎn)之間的間距或其整數(shù)倍。第二步分別對(duì)每條鏈表中的處理點(diǎn)進(jìn)行排序,該排序方法為在每條鏈表中找出X坐標(biāo)最小的點(diǎn)A(xa,ya,za)和最大的點(diǎn)B(xb,yb,zb),采用經(jīng)過直線AB垂直平行截面的所在面的平面把每條鏈表中的處理點(diǎn)剖開成兩部分,并分別將該兩部分處理點(diǎn)的X坐標(biāo)值按照由小到大順序,分別置于列表list1及列表list2中,再將列表list2中的處理點(diǎn)排在列表list1中的處理點(diǎn)之后,置于剛處理的原鏈表中。第三步取相鄰的兩條鏈表Li和Li+1,分別取出Li和Li+1中的第一個(gè)點(diǎn)和第二個(gè)點(diǎn),將取出的4個(gè)點(diǎn)連接成一個(gè)四邊形;然后再分別取出Li和Li+1兩條鏈表中第二個(gè)點(diǎn)和第三個(gè)點(diǎn),將取出的4各點(diǎn)連接成一個(gè)四邊形,以此類推,直至兩條鏈表Li和Li+1中的所有處理點(diǎn)都處理完畢;最后將兩條鏈表Li和Li+1中的處理點(diǎn)形成的四邊形沿任意一條對(duì)角線進(jìn)行三角剖分。按以上操作對(duì)剩余的相鄰鏈表所形成的截體表面進(jìn)行三角剖分,形成由三角形構(gòu)成的三角網(wǎng)格,第四步將由上述三角剖分所得到的各個(gè)三角形的三個(gè)頂點(diǎn)的參數(shù)值帶入OpenGL中提供的API函數(shù),就可在顯示器上再現(xiàn)真實(shí)的原始物體。
專利摘要
本發(fā)明提出了一種三維掃描系統(tǒng)中的圖形重構(gòu)方法,針對(duì)快速測(cè)量系統(tǒng)獲取海量數(shù)據(jù)點(diǎn)云,對(duì)經(jīng)過過慮處理和拼接后的點(diǎn)云進(jìn)行三角剖分,在此基礎(chǔ)上構(gòu)面,步驟如下對(duì)預(yù)處理后的點(diǎn)云進(jìn)行平行切割,由各個(gè)平面所得的截點(diǎn)分別構(gòu)成N條鏈表L
文檔編號(hào)G01B11/00GK1996392SQ200610041320
公開日2007年7月11日 申請(qǐng)日期2006年8月14日
發(fā)明者達(dá)飛鵬, 唐琦 申請(qǐng)人:東南大學(xué)導(dǎo)出引文BiBTeX, EndNote, RefMan