1. 程式人生 > >三維重建: 點雲三角化(二流型的)要點 很詳細 —— 乾貨

三維重建: 點雲三角化(二流型的)要點 很詳細 —— 乾貨

按照以下三維重建要點,你完全可以按步驟程式碼實現:

 

O.   初始化引數

一. 初始化一個三角面片:

  1. 計算所有點的重心;

  2. 找到離重心最近的一個點,設為ptn0;

  3. 在ptn0的領域內,計算出最遠的距離,找到距離它1/3len(但還是大於最小距離)的一個點作為ptn1;

   4. 在領域中找到一個點ptn2,使得它們構成的外接圓的半徑最小;

由這三個點構成一個三角面片,並且標記為邊界點。

二. 構建Mesh:

1. 首先 從Mesh當中找到所有的邊界半邊;

2. 對於其中的每一條邊界半邊:如果端點還可以擴充套件,則進行如下操作,否則下一條:

       1) 首先從這條邊的上下兩條鄰邊進行擴充套件,如果擴充套件成功則對新增加的那條邊也進行三角重建;並且將重建構成的新的半邊加入到半邊集合當中。

      2) 如果不能在上下兩條邊中進行擴充套件,則找出這兩個端點的所有未使用的鄰近點;

      3) 對上面的每一個鄰近點,構成三角形的第三個端點,但是要符合幾個要求:

              A. 新加入的兩條邊長度要小於閾值;

              B. 三角形的內角都在一定的範圍內: (20~100°)

              C. 形成的二面角要大於閾值。

  D. 形成的三角面片的外接圓半徑最小。

  E. 形成的新的面裡面不能有邊界點或者不能再擴充套件的點

 4)找到符合重建的點以後,重建一個三角面片,同時重建新加入的兩條邊(只在前後兩條邊當中去重建),最後重建新加入的兩條邊放入到半邊隊列當中。

5) 如果某條半邊的兩個點都不能重建,則刪除,直到半邊隊列當中沒有邊為止。

 

三.刪除重建有重疊的三角片:

  1. 首先找到邊界點但非孤立點;

 2. 對於每一個這樣的點找到它的領域的邊介面;如果邊介面的個數小於2則沒有重疊;如果有面與面之間的角度< 30° 則表示有重疊。

 3. 如果出現重疊,將這些面刪掉。

四、更新各個點的使用情況

 遍歷Mesh當中的每一個點, 對相應的點賦值上相應的標誌位: 邊界點: PT_BOUND 孤立的點:PT_NOT_USED 在面裡面的點PT_IN_MESH 其餘的點  PT_TRI_USED

五、對孔洞進行填補

  1. 找到各個孔洞:

        A。找到所有的邊界邊放在一個隊列當中;

      B. 從其中的一條半邊開始,找到那條以這條邊的起點為終點的半邊,依次去找,直到找到以第一條的終點為起點的邊為止;就找到一個孔洞,其餘的類似;

        C. 判斷孔洞的有效性:1. 如果只有三條邊,則可能是一個孤立的面

2.如果是4條邊可能是兩個孤立的面。。

3.如果邊數載2--8 之間的時候,有共同的頂點也不行

        遇到上述3種情況都需要把面刪除掉。

 

2. 對孔洞進行填補: 

   1).* 如果邊的數目小於20 刪掉它周圍的面,重新來,;如果是一般的孔洞則進行填補,否則不填補。

   2). 進行以上操作以後,再進行兩次 提取孔洞。進行填補的工作。

3. 再次更新點的使用資訊,和上面一樣

轉:https://blog.csdn.net/zkl99999/article/details/56511727