ref:參考文檔:
VisualSFM和Meshlab實現三維重建過程:http://planckscale.info/tag/visualsfm/
三維重建數據集:http://vision.ia.ac.cn/zh/data/index.html
一、簡介
要想了解從照片如何一步步重建出三維模型,並能操控某些過程,可用的免費開源軟件也不少,較常用的是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文件。
完成。 筆芯
*補充:
1、下載VisualSFM。網址:http://ccwu.me/vsfm/
下載好的文件名稱叫VisualSFM_windows_cuda_64bit.zip,將其解壓便可得到exe文件,不需安裝。
2、對於要使用密集點雲,需下載PMVS/CMVS。網址:http://www.di.ens.fr/cmvs/
將下載好的文件解壓,把binariesWin-Linux中的Win64-VS2010下的文件全部拷貝到與VisualSFM.exe的相同根目錄下即可使用,VisualSFM在運算過程中會自動使用PMVS/CMVS。
3、meshlab生成線框帶紋理模型。下載網址:p://www.meshlab.net
---------------------