使用Colmap+OpenMVS進行物體的三維重建

一、準備工作
?????? 1.1 ?下載Colmap:https://demuc.de/colmap/#download
????????????? ?選擇cuda版本的進行下載。
?????? 1.2 ?下載OpenMVS,可以選擇下載源碼自行編譯也可以選擇封裝好的可執(zhí)行程序。
?????? ?? ??Github源碼:https://github.com/cdcseacave/openMVS
????????????? ?可執(zhí)行程序:https://github.com/cdcseacave/openMVS_sample
????????1.3 ?在終端中輸入nvidia-smi根據(jù)顯卡驅(qū)動的信息下載對應(yīng)版本的cuda

二、使用Colmap生成稠密點云
??????? 2.1 ?新建文件夾并在該文件夾中創(chuàng)建一個images文件夾,將需要重建的圖片放入images中,注意文件路徑中不能出現(xiàn)中文和空格。我使用51張由C4D生成的衛(wèi)星模型圖進行三維重建。


使用自建數(shù)據(jù)集時注意:
①盡量使用單反相機或?qū)I(yè)數(shù)碼相機進行數(shù)據(jù)采集,如果要用手機進行采集,請使用單攝像頭的手機進行數(shù)據(jù)采集。
②盡量選擇紋理豐富的外界環(huán)境進行數(shù)據(jù)采集,避免玻璃圍墻、瓷磚和打蠟地板等強反光材料環(huán)境以及完全沒有紋理的場景。
③盡量選擇光照明亮,且光照條件變化不劇烈的環(huán)境,最好選擇室內(nèi)環(huán)境。如室內(nèi)客廳,開啟客廳大燈進行燈光補償。
④盡量圍繞重建物體或環(huán)境采集較多的影像,且在采集過程中控制快門速度,避免模糊。
??????
?????? 2.2? 打開1.1中下載的Colmap文件夾,啟動COLMAP.bat,點擊File→New Project創(chuàng)建一個新項目,在Database欄中點擊New并進入2.1創(chuàng)建的文件夾目錄中,使用colmap自帶的sqlite工具創(chuàng)建一個.db文件,輸入名字并保存;在Images欄中選擇剛剛創(chuàng)建的images文件夾,最后save。




????????2.3? 點擊Processing → Feature Extraction,相機模型選擇PINHOLE,點擊Extract獲取圖片特征。


????????2.4? 點擊Processing → Feature matching → Run,對獲取到的特征點進行匹配,使用默認參數(shù)既可。


????????2.5? 點擊Reconstruction → Start reconstruction,開始重建,colmap會生成對應(yīng)的稀疏點云和各個視角的相機姿態(tài),等待執(zhí)行完畢。


????????2.6? 在之前image的同級目錄下創(chuàng)建一個dense文件夾,點擊Reconstruction → Dense reconstruction,點擊select,選擇剛剛創(chuàng)建的dense文件夾用來保存稠密重建的結(jié)果。點擊Undistorion對圖像進行去畸變,點擊Stereo對每張圖片生成深度圖(此過程需要較長時間),等待深度圖生成后點擊fusion進行基于深度圖融合的稠密重建。


?
三、使用OpenMVS重建模型
?????? 使用編譯好的openmvs_sample進行重建工作。
?????? 3.1? 首先將生成的稠密點云以及圖片信息轉(zhuǎn)換成openmvs支持的.mvs文件。在openmvs_sample中的bin文件內(nèi)打開終端,執(zhí)行命令:.\interfaceCOLMAP.exe -i D:\Reconstruction\academy\dense -o D:\Reconstruction\academy\dense\scene.mvs --image-folder D:\Reconstruction\academy\dense\images

在dense文件夾下生成了scene.mvs文件。
?
?????? 3.2? 進行重建操作,執(zhí)行命令:
?????? .\ReconstructMesh.exe -i D:\Reconstruction\academy\dense\scene.mvs -o D:\Reconstruction\academy\dense\mesh.mvs

生成mesh.mvs文件
?????? 注意,執(zhí)行此步驟時可能會報錯無法找到某路徑下的圖片,根據(jù)報錯的路徑提示將2.1中的image文件夾復(fù)制過去即可。
??????
?????? 3.3? 對3.2中生成的模型添加紋理,執(zhí)行命令:
?????? .\TextureMesh.exe -i D:\Reconstruction\academy\dense\mesh.mvs

????????3.4? 對mesh.mvs文件使用OpenMVS的可視化工具Viewer.exe進行可視化:
?????? .\Viewer.exe -i D:\Reconstruction\academy\dense\mesh_texture.mvs


????????和原模型相比,建模出現(xiàn)空洞可能的原因是表面有反光、使用C4D生成的圖片分辨率不高(每張圖僅有100k不到)可用特征過少,導(dǎo)致深度圖生成精度不高,后續(xù)在獲取圖片的時候可以選擇其他角度,同時提高生成圖像的質(zhì)量。
?
原理:
?????? Colmap使用SIFT算法對特征點進行提取,利用特征描述向量找到有場景重疊的景象,即特征匹配;然后根據(jù)采集到的信息,使用SfM的方法進行稀疏重建,輸出目標的稀疏點云和場景中全部的相機參數(shù)。對圖像進行去畸變操作后,使用MVS(Mutli-View Stereo)來計算圖像中每個像素的深度和法向信息,利用深度圖的配準原理融合多個圖像的深度圖,最終產(chǎn)生稠密點云。
?????? 之后使用OpenMVS對稠密點云進行網(wǎng)格重建,重建后可以對mesh文件進行網(wǎng)格細化操作;最后輸入網(wǎng)格文件、相機位姿、照片,對網(wǎng)格文件進行紋理貼圖操作,輸出帶有紋理貼圖的網(wǎng)格模型。
?
總結(jié):
?????? COLMAP可以用于快速三維重建,代碼封裝良好,使用方便。但深度圖估計速度過慢,切在深度圖估計的精度上略低于深度學(xué)習(xí)方法。同時為了增加泛用性和魯棒性以及保證重建速度,使用了Colmap中的默認參數(shù)進行三維重建,所以對于特定場景或物體的重建效果可能不理想,后續(xù)可以詳細學(xué)習(xí)源碼來對其中參數(shù)進行調(diào)整,或者在源碼的基礎(chǔ)上對算法進行優(yōu)化,使其更符合我們需要的場景。
?
參考文章:
Colmap官方文檔:https://colmap.github.io/database.html
https://zhuanlan.zhihu.com/p/566828254
https://zhuanlan.zhihu.com/p/183673331
https://blog.csdn.net/weixin_44543463/article/details/125628410
自學(xué)習(xí)用,侵刪