1. 程式人生 > >Windows下使用VisualSFM + CMVS/PMVS + MeshLab進行三維重建

Windows下使用VisualSFM + CMVS/PMVS + MeshLab進行三維重建

Windows下使用VisualSFM + CMVS/PMVS +MeshLab進行三維重建

參考文件:

資料集:

一、簡介

要想了解從照片如何一步步重建出三維模型,並能操控某些過程,可用的免費開源軟體也不少,較常用的是VisualSFM和Meshlab:

第一步:VisualSFM

VisualSFM軟體允許我們上傳一系列影象,它從這些影象中找到每一個影象的特定特徵,利用這些特徵資訊重建出3D模型的稀疏點雲,而後還可進行稠密點雲重建。

輸入: 圍著要重建物件拍攝的一系列照片;

輸出: 一個.out檔案,儲存著每個相機的位置及重建出的稀疏點雲;

一個.ply檔案,儲存著由稀疏點雲重建出的稠密點雲

第二步:Meshlab

可用Meshlab對3D網格/點雲做各種操作。輸入VisualSFM的生成檔案,Meshlab通過一系列操作可創建出包含紋理的、乾淨的、高解析度的網格,並自動計算UV對映及建立紋理影象。

輸入: VisualSFM的生成檔案,.out檔案和list.txt檔案(儲存照片序列); 以及.ply檔案;

輸出: 一個.obj檔案,3D模型的網格;

一個.png檔案,任意大小的紋理圖;

二、原始碼下載

一共用到三個軟體包,我將這三個軟體包都放在了一起,可以用這個,就不用每個都單獨下了。連結:http://pan.baidu.com/s/1kVDtWhD密碼:tngq

配置方法是:將下載好的檔案解壓,把toolkit\PMVS2\binariesWin-Linux\Win64-VS2010下的所有檔案,全部拷貝到與VisualSFM.exe的相同根目錄(toolkit\VisualSFM_windows_cuda_64bit)下即可使用,VisualSFM在運算過程中會自動使用PMVS/CMVS。

我這裡還有已經配置好的windows 64位的visualSFM檔案,如果是64位的win使用者可以直接拿來用,不用再配。連結:http://pan.baidu.com/s/1nvsXdEh

密碼:zs7w

另外VisualSFM.exe可直接執行,無需安裝。

至於每個軟體單獨下載的網址,我放在最後的補充上了。

三、開始三維重建

第一步:執行VisualSFM

(1)按圖中1所示,首先開啟使用的影象,輸入一系列圖片。

(2)按圖中2所示,進行SIFT特徵點檢測和匹配。

(3)按圖中3所示,利用SFM進行相機引數的確定以及稀疏點雲的重建。

(4)按圖中4所示,利用CMVS/PMVS進行稠密點雲的生成。

下面是具體流程以及截圖:

1、輸入一系列圖片

按圖中1所示,首先開啟使用的影象,輸入一系列圖片。注意要以待重建的物件為中心,圍著它每轉10-20度拍一張,這樣轉一圈,有不同高度資訊更好。VisualSFM沒有照片數量限制,照片越多,重建出的細節越豐富,但重建過程花費時間越長。


2、特徵檢測及匹配

按圖中2所示,進行SIFT特徵點檢測和匹配。因照片可能存在旋轉、縮放或亮度變化,此過程利用SIFT演算法提取、描述特徵,用 RANSAC演算法過濾掉誤匹配。此過程亦可利用GPU加速。工作狀態實時顯示在側邊的log視窗。


3、利用SFM進行稀疏3D重建

利用 SFM 方法,通過迭代求解出相機引數和三維點座標。即重建出3D模型的稀疏點雲。若有“bad”相機(位置錯誤或朝向錯誤),結合工具欄上的“3+”按鈕和手型按鈕即可刪除之,使結果更準確。


4、利用CMVS/PMVS進行稠密3D重建

通過 CMVS 對照片進行聚類,以減少稠密重建資料量,而後利用PMVS從3D模型的稀疏點雲開始,在區域性光度一致性和全域性可見性約束下,經過匹配、擴散、過濾生成帶真實顏色的稠密點雲。(下圖為用Meshlab檢視效果圖)


至此,VisualSFM的工作就完成了,結果都已存檔。若因圖片匹配失敗或圖片較少導致某區域重建失敗或重建出的某區域細節不足,可以返回新增一些這個區域的照片,重新來過。但因特徵檢測和匹配的結果已存檔(每張影象對應的.sift 和 .mat檔案都已經生成),所以已經匹配好的影象不必再次匹配,會更快完成。

第二步:執行Meshlab


(1)按鈕1,開啟VisualSFM的生成檔案(.out檔案和list.txt檔案)。

(2)按鈕2,開啟顯示層目錄,檢測相機載入是否正確。

(3)按鈕3,隱藏可視的稀疏點雲。

(4)按鈕4,選中雜點區(選中的雜點變為紅色)。

(5)按鈕5,刪除選中的雜點區。

下面是具體流程以及截圖:

1. 開啟bundle.rd.out 檔案

(1)點選按鈕1,開啟由VisualSFM生成的儲存在xx.nvm.cmvs資料夾下的bundle.rd.out 檔案。隨後會詢問是否選擇照片列表檔案,選擇同文件夾下的 “list.txt”即可。這一步會把相機及對應的照片匯入進來,對後續的紋理處理至關重要。


(2)點選按鈕2,開啟顯示層目錄,檢測相機載入是否正確,Render –> Show Camera,因視覺化相機的尺寸比網格尺寸大得多,所以需調整相機的縮放因子,scale factor可以從0.0001開始調小,直到相機位置清晰可見。


2. 稠密點雲代替稀疏點雲

(1)點選按鈕3,隱藏可視的稀疏點雲;

(2)File –>Import Mesh載入稠密點雲(xx/00/models/option-0000.ply);VisualSFM生成多個.ply檔案時,需合併成一個mesh。在載入的任何一個.ply上右鍵選“Flatter Visible Layers”。


3. 清除雜點

點選按鈕4選中雜點區,按鈕5刪除之。大致清了周圍的一些雜點後:


4. 網格化

Filter –> Point Set–> Surface Reconstruction: Poisson.

利用Poisson Surface Reconstruction演算法由稠密點雲生成多邊形網格表面。引數可調, Octree Depth:控制著網格的細節,此值越大細節越豐富但佔記憶體越大執行起來慢,一般設10,可慢慢調大。


Poisson表面重建演算法會生成一個“不漏水”氣泡,把所有場景物件包裹在其中。即模型是封閉的。可以移除多餘的面Filters –> Selection –> Select faces with edges longer than,而後利用按鈕5刪除之。


儲存(整個project和mesh)。

5. 修復流形邊緣

後續的紋理處理要求網格化的模型必須是流形(MANIFOLD)的,因此需刪除非流形邊(簡單講就是任何由多面共享的邊)。Filters–> Selection –> Select Non-Manifold edges,而後刪除之。


6. 引數化(Parameterization)

Filter–> Texture –> Parameterization from registered rasters。

根據相機投影關係建立UV對映。


儲存 (整個project和mesh)。

7. 投影紋理

Filter–> Texture –> Project active rasters color to current mesh, filling thetexture。

可設定任意解析度(512的2的二次方倍:512 /1024 / 2048 / 4096 / 8192…)的紋理圖。


**:6和7其實可以合為一步:

Filter –> Texturing –>Parameterization + texturing from registered rasters.


8. 完成、匯出

當你調整滿意了之後,File –> Export mesh as… a .obj檔案。可以生成一個包含你選定解析度紋理的obj檔案。


完成。 筆芯

*補充:

下載好的檔名稱叫VisualSFM_windows_cuda_64bit.zip,將其解壓便可得到exe檔案,不需安裝。

3、meshlab生成線框帶紋理模型。下載網址:p://www.meshlab.net