Colmap中重三角化方法總結

2021-10-04 23:01:48 字數 3803 閱讀 3254

**colmap中兩種重三角化是如何實現的?**
colmap作為現在最先進,最完整的乙個sfm+mvs系統,其中有很多地方值得學習和借鑑。對於其中的sfm模組,採用了大量的tricks來提高sfm重建的準確性和完整性,本文試**釋是其中之一:重三角化

本文只討論重三角化,其在全域性ba前後完成,目的是為了提高重建的完整性和準確性。主要參考資料,來自colmap工程**和**《structure from motion revisited》。

目錄總結

在原**中,有一段文字提到重三角化,其大致翻譯如下:

重三角化 和visualsfm類似,本文也使用了在全域性ba前重三角化來減小漂移效應。但是,ba總是可以很好的優化相機和點的引數。因此,本文提出拓展有效的pre-ba 重三角化,增加post-ba 重三角化。目的在於提高重建的完整性,通過繼續先前由於不準確的相機位姿導致三角化失敗的點的追蹤。我們只繼續追蹤哪些誤差在濾波閾值下的觀察點。此外,我們嘗試合併追蹤,因此提高下一步ba的完整性

**中提到,重三角化可以提高重建三維點的完整性,並且減小累積誤差帶來的漂移。colmap擴充套件了重三角化到全域性ba之後,所以使用了兩次重三角化。

這裡聽起來似乎,兩種ba似乎使用同樣的計算流程去計算,但是事實上並非如此。那麼兩種重三角化是如何實現的呢?這就需要看**細節了。

void iterativeglobalrefinement(

printheading1("retriangulation");

std::cout << " => retriangulated observations: "

/*..全域性ba優化**..*/

}

可以總結這個重三角化的大致計算流程如下:

設定最大三角化誤差為5.0

對於每個影象對,只在under-reconstructed 影象對之間使用重三角化:

已有三維點/匹配特徵點匹配數量<0.2

2.1 檢測是否是under-reconstructed 影象?否則跳過

2.2 影象是否在已經在重建中使用?否則跳過

2.3 影象相機引數是否有問題?否則跳過

2.4 對於每個影象對中的每個特徵點匹配對

​ 2.4.1 **都有對應三維點?**是則跳過(無論是同一三維點/不同三維點,這裡不處理後一種情況)。

​ 2.4.2 如果兩個特徵點都沒有三維點,使用estimatetriangulation (estimators/triangulate.cc),這是在**中介紹過的取樣三角化方法,在這裡不解釋,理解為普通三角化就好。如果誤差滿足(注意此處閾值為5.0),則新增該3d點和觀測關係到重建中。

​ 2.4.3 如果其中乙個特徵點有對應重建三維點,設定另外乙個特徵點的3d點為該點,新增觀測關係到重建中。

ba後的重三角化不是很好理解,並且在**中也沒有直接找到這樣的實現。基於colmap.cc的提示,和github上issue#414作者本人回答,post-ba重三角化在這個函式中實現:

/

// retriangulation

/printheading1("retriangulation");

回去看iterativeglobalba函式:

printheading1("retriangulation");

//重三角化

std::cout << " => retriangulated observations: "

<< std::endl;

for (int i = 0; i < options.ba_global_max_refinements; ++i)

}}可以看到,這個函式中ba使用前後確實各使用了rt,並且每次迭代前後都使用post-ba rt,濾去外點,個人認為這是很工程化的做法,有助於提高重建模型的精度和完整性。

下面來看一下post-ba rt的具體實現方法:

completetracks:

對於一些追蹤成功的特徵點,在某些影象中沒有被三角化,如果誤差滿足要求,則這些特徵點新增為對應三維的觀察值,具體程式步驟如下:

設定最大三角化誤差為4.0,pre-ba rt為5.0(issue中作者回答:rt with tighter threshold

對於3d點的追蹤元素(理解為3d點對應某影象某個特徵點在其它影象中特徵點的對應關係)

2.1 對於每個影象對中的每個特徵點匹配對

​ 2.1.1 影象是否在已經在重建中使用?影象相機引數是否有問題?否則跳過

​ 2.1.2 有對應三維點?是則跳過

​ 2.1.3 計算重投影誤差是否在閾值範圍內?否則跳過

是則繼續,新增該影象特徵點為3d點的觀測(增加約束,增加完整性)

mergetracks:

合併不同影象中同一特徵點的不同觀察,用乙個基於追蹤長度權重的公式計算,如果所有追蹤點誤差都滿足,則合併。具體程式步驟如下:

設定最大三角化誤差為4.0,pre-ba rt為5.0

對於3d點的追蹤元素(理解為3d點對應某影象某個特徵點在其它影象中特徵點的對應關係)

2.1 對於每個影象對中的每個特徵點匹配對

​ 2.1.1 影象是否在已經在重建中使用?影象相機引數是否有問題?否則跳過

​ 2.1.2 有對應三維點?是則跳過

​ 2.1.3 2d特徵點是否存在對應三維點?否則跳過該三維點是否已經合併過?是則跳過

如果繼續:

​ a. 基於追蹤長度合併三維點,即兩個三維點各自對應觀測點個數,合併公式為:

m er

gedx

yz=(

poin

t3d∗

leng

th1+

corr

poin

t3d∗

leng

th2)

/(le

ngth

1+le

ngth

2)

mergedxyz=(point3d*length1+corrpoint3d*length2)/(length1+length2)

merged

xyz=

(poi

nt3d

∗len

gth1

+cor

rpoi

nt3d

∗len

gth2

)/(l

engt

h1+l

engt

h2)​ b. 計算合併值,和每個追蹤2d點在影象上重投影誤差。

全部滿足閾值要求,則合併成功

​ c. 合併成功,刪除初始點。

回到兩種重三角化方法,全域性ba前的重三角化重構了一些地圖點;ba後的rt沒有增加新的地圖點,而是給地圖點增加了更多的觀測(2d影象點),甚至更高的閾值可能還會減少地圖點。colmap中兩種方法的結合,我認為其實就是乙個coarse to fine的過程,先增加地圖點,然後增加約束數量,濾去外點,再做ba優化,從而獲得更好的重建結果。這些想法都是作者不斷除錯所獲得方法,具體應用重三角化到自己的場景中,也需要更多的除錯來獲得更適合的處理方法。

以上colmap中兩種重三角化方法,是visualsfm中rt的延伸,具體visualsfm如何實現,我們無從得知。但是重三角化作為一種減小增量式sfm減小誤差的方法,還是很值得借鑑,潛在的用法是,我們可以將其用於特徵點法slam全域性地圖的構建時,減小累積誤差。

酉三角化和實正交三角化

介紹乙個非常有用的定理 任何復方陣 a 與以 a 的特徵值作為對角元素的乙個三角矩陣酉相似,以及總可以通過實正交相似將矩陣化為乙個實的擬三角型並作了相應的推廣.證明 設 u 1 x quad u 2 quad cdots quad u n 是任意乙個第一列為 x 的酉矩陣,比方說利用 qr 分解 中...

Delaunay三角化演算法

1 首先了解一下什麼是delaunay三角網 delaunay三角剖分是前蘇聯數學家 delaunay在 1934年提出的 對於任意給定的平面點集 只存在著唯一的一種三角剖分方法 滿足所謂的 最大 最小角 優化準則 即所有最小內角之和最大 這就是 delaunay三角剖分。這種剖分方法遵循 最小角最...

貪婪投影三角化演算法對有向點雲進行三角化

貪婪投影法 先將有向點雲投影到某一區域性座標平面內,再在座標平面內進行平面內的三角化,根據平面內三位點的拓撲關係獲得乙個三角網格曲面模型。include include include include include include include include include void main...