Image-based 3D Reconstruction from Scratch (using COLMAP)
本文將介紹COLMAP的安裝與使用,重點介紹3D重建過程中每個步驟的輸入輸出。
一、安裝
在GitHub上下載COLMAP源代碼(我用的是3.5版本),下載后進入colmap目錄編譯
cd ./colmap-3.5 # 進入colmap目錄
mkdir build && cd ./build # 創建build文件夾,並進入
cmake .. # cmake
make -j8 # make多線程編譯
二、運行colmap(命令行)
2.1 數據准備
我們做的是:基於多視圖圖像的三維重建,因此我們需要一些待重建的圖片。
這里我們用的是Sceaux Castle數據集👇👇👇 Sceaux Castle數據集的百度雲鏈接,提取碼mkzm
我們將圖片組織為colmap的工程格式:
/path/to/project/...
+── images
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
│ +── imageN.jpg
工作目錄中包含一個images
文件夾,images
中即為待重建的圖片。
2.2 開始重建
以下所有命令均可在COLMAP官方說明文檔中查閱。
colmap提供了自動重建的命令,我們這里還是逐步進行重建,以觀察每一步的輸入輸出結果。
2.2.1 特征提取(feature_extractor)
./colmap feature_extractor \
--database_path $DATASET_PATH/database.db \ # 輸出:特征點保存至數據庫database.db
--image_path $DATASET_PATH/images # 輸入:多視圖圖像
2.2.2 特征點匹配(exhaustive_matcher)
./colmap exhaustive_matcher \
--database_path $DATASET_PATH/database.db # 輸入輸出:數據庫文件database.db
2.2.3 稀疏重建(SfM, Structure-from-Motion)(mapper)
mkdir $DATASET_PATH/sparse # 新建sparse文件夾
./colmap mapper \
--database_path $DATASET_PATH/database.db \ # 輸入:數據庫文件database.db
--image_path $DATASET_PATH/images \ # 輸入:多視圖圖像
--output_path $DATASET_PATH/sparse # 輸出:`sparse`文件夾
輸出結果sparse
文件夾如下所示👇
└── sparse # 稀疏重建結果
└── 0
├── cameras.bin # 相機內參
├── images.bin # 相機位姿
├── points3D.bin # 稀疏3D點
└── project.ini
2.2.4 圖像去畸變(image_undistorter)
mkdir $DATASET_PATH/dense # 新建dense文件夾
./colmap image_undistorter \
--image_path $DATASET_PATH/images \ # 輸入:多視圖圖像
--input_path $DATASET_PATH/sparse/0 \ # 輸入:sparse文件夾
--output_path $DATASET_PATH/dense \ # 輸出:dense文件夾
--output_type COLMAP \ # 參數:輸出格式
--max_image_size 2000 # 參數:最大圖像尺寸
輸出結果dense
文件夾如下所示👇
└── dense
├── images
│ ├── 100_7100.JPG
│ ├── 100_7101.JPG
│ ├── ...
│ └── 100_7110.JPG
├── run-colmap-geometric.sh
├── run-colmap-photometric.sh
├── sparse
│ ├── cameras.bin
│ ├── images.bin
│ └── points3D.bin
└── stereo
├── consistency_graphs
├── depth_maps
├── fusion.cfg
├── normal_maps
└── patch-match.cfg
2.2.5 稠密重建
./colmap patch_match_stereo \
--workspace_path $DATASET_PATH/dense \ # 輸入輸出:dense文件夾
--workspace_format COLMAP \ # 參數:工作區格式
--PatchMatchStereo.geom_consistency true
稠密重建的結果:為每張圖像估計depth_map
和normal_map
└── dense
├── images # resize之后的圖像
│ ├── 100_7100.JPG
│ ├── 100_7101.JPG
│ ├── ...
│ └── 100_7110.JPG
├── run-colmap-geometric.sh
├── run-colmap-photometric.sh
├── sparse
│ ├── cameras.bin
│ ├── images.bin
│ └── points3D.bin
└── stereo
├── consistency_graphs
├── depth_maps
│ ├── 100_7100.JPG.geometric.bin
│ ├── 100_7100.JPG.photometric.bin
│ ├── ...
│ ├── ...
│ ├── 100_7110.JPG.geometric.bin
│ └── 100_7110.JPG.photometric.bin
├── fusion.cfg
├── normal_maps
│ ├── 100_7100.JPG.geometric.bin
│ ├── 100_7100.JPG.photometric.bin
│ ├── ...
│ ├── ...
│ ├── 100_7110.JPG.geometric.bin
│ └── 100_7110.JPG.photometric.bin
└── patch-match.cfg
2.2.6 融合
./colmap stereo_fusion \
--workspace_path $DATASET_PATH/dense \ # 輸入:dense文件夾
--workspace_format COLMAP \ # 參數:工作區格式
--input_type geometric \ # 參數:輸入類型
--output_path $DATASET_PATH/dense/fused.ply # 輸出:fused.ply文件
3.3 重建結果可視化
3.3.1 稀疏重建結果可視化
使用model_converter
將sparse
文件夾中的bin文件轉為txt文件。使用COLMAP GUI對稀疏重建結果進行可視化
3.3.2 深度圖、法向圖可視化
3.3.3 稠密重建結果可視化
Bug Reporter
也許在編譯過程中會出現一些問題,不要慌,我們去colmap的Github-Issues中去找一下。
問題匯總
- CMake時提示
Anaconda
相關問題
參考
文中圖4 將三張圖拼接為一張圖👉GitHub
Questions
- colmap重建不用相機內參嗎?如果相機內參已知的話,是否會提高重建精度呢?
- SfM失敗!!!
Click Here: 點擊查看詳細內容
Pipes場景SfM失敗
