完整的 multi view stereo pipeline 會有以下步驟
-
structure from motion(SfM)==> camera parameters, sparse point cloud
-
multi view stereo(MVS)==>depth map, dense point cloud
-
surface reconstruction(SR)==>poisson or delauny reconstruction, mesh
-
texture mapping(TM)==>get mesh with texture
COLMAP整體流程如下圖所示
COLMAP重建過程主要步驟
COLMAP 相容好幾種不同的相機模型,我們在使用時可以對相機模型進行限制以獲得最好的效果。
如果提前不知道相機內參,最好使用包含畸變係數的模型,預設為 SIMPLE_RAIDIAL 。
如果已知相機沒有畸變或畸變影響很小,建議使用 SIMPLE_PINHOLE 模型。
可供選擇的模型分別為
SIMPLE_PINHOLE, PINHOLE, SIMPLE_RADIAL, RADIAL, OPENCV, FULL_OPENCV,
SIMPLE_RADIAL_FISHEYE, RADIAL_FISHEYE, OPENCV_FISHEYE, FOV, THIN_PRISM_FISHEYE
不同模型含義及引數如下表所示,詳見 Camera Models
Camera Models
camera_calibration_and_3d_reconstruction
Structure from Motion
運動恢復結構流程如下圖所示
運動恢復結構主要步驟
運動恢復結構的目的是求解相機引數,需要把所有輸入圖片放到一個資料夾下。按如下步驟依次進行。
影像特徵提取
相機內參已知的情況下我們可以直接通過命令列引數 ImageReader.camera_params 傳給 COLMAP。
a. 相機內參已知
$ colmap feature_extractor \
--database_path ./database.db \
--image_path images \
--ImageReader.camera_model SIMPLE_PINHOLE \
--ImageReader.camera_params "1813.3334,1920,1080" \
--SiftExtraction.max_image_size 3840
其中 camera_params 為 std::string 型別,不同的模型有對應的表示方式。引數及含義參考上面表格中的各種相機模型。
b. 相機內參未知
$ colmap feature_extractor \
--database_path ./database.db \
--image_path images \
--ImageReader.camera_model SIMPLE_PINHOLE \
--SiftExtraction.max_image_size 3840
其中 database_path 設定工程資料檔案的儲存路徑
image_path 設定輸入影像所在資料夾路徑
camera_model 設定相機模型
max_image_size 設定為大於影像最大邊所對應的解析度的值
影像特徵匹配
$ colmap exhaustive_matcher --database_path $DATASET_PATH/database.db
其中 database_path 設定為特徵點檢測時工程資料檔案儲存的路徑。
相機位姿求解與優化
$ mkdir $DATASET_PATH/sparse
$ colmap mapper \
--database_path $DATASET_PATH/database.db \
--image_path $DATASET_PATH/images \
--output_path $DATASET_PATH/sparse \
--Mapper.ba_refine_principal_point true
模型轉換與引數讀取
在進行稀疏重建之後,model 預設會被匯出到 bin 檔案中,因為這樣比較緊湊,節省空間,可以使用 COLMAP 的模型轉換功能將其轉換成 txt 檔案。
注意下面的指令中 input_path 和 output_path 是檔案所在資料夾的路徑,而不是單個檔案路徑。
$ colmap model_converter \
--input_path $DATASET_PATH/sparse/0 \
--output_path $DATASET_PATH/sparse \
--output_type TXT
a. 相機內參 cameras.txt 格式如下
# Camera list with one line of data per camera:
# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 3
1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
2 PINHOLE 3072 2304 2560.56 2560.56 1536 1152
3 SIMPLE_RADIAL 3072 2304 2559.69 1536 1152 -0.0218531
b. 相機外參,包含旋轉和平移,以及每張圖片中特徵點在影像中的二維座標及其對應的三維稀疏點索引images.txt 格式如下,注意這裡的旋轉儲存為單位四元數形式,與 Eigen::Quaterniond 格式相同
# Image list with two lines of data per image:
# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
# POINTS2D[] as (X, Y, POINT3D_ID)
# Number of images: 2, mean observations per image: 2
1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
2 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180142.JPG
1190.83 663.957 23056 1258.77 640.354 59070
c. 稀疏三維點雲中三維空間點的資訊 points3D.txt 格式如下
# 3D point list with one line of data per point:
# POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
# Number of points: 3, mean track length: 3.3334
63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227
63376 2.01848 0.108877 -0.0260841 102 209 250 1.73449 16 6519 15 7322 14 7212 8 3991
63371 1.71102 0.28566 0.53475 245 251 249 0.612829 118 4140 117 4473
如果需要進一步 rectify, 可以把引數輸入到 OpenCV 的 stereoRectify() 函式中,之後 initUndistortRectifyMap() , 最後使用 remap() 函式進行重對映 從而得到矯正的結果。
Dense Reconstruction
利用前面的步驟求得的相機引數進行稠密重建,由 PatchMatch 求解單視角對應的深度圖和法向圖,同時根據需要對深度圖和法相圖進行濾波。
影像畸變矯正
$ mkdir $DATASET_PATH/dense
$ colmap image_undistorter \
--image_path $DATASET_PATH/images \
--input_path $DATASET_PATH/sparse/0 \
--output_path $DATASET_PATH/dense \
--output_type COLMAP \
--max_image_size 3840
立體塊匹配
$ colmap patch_match_stereo \
--workspace_path $DATASET_PATH/dense \
--workspace_format COLMAP \
--PatchMatchStereo.max_image_size 3840 \
--PatchMatchStereo.window_radius 9 \
--PatchMatchStereo.geom_consistency true \
--PatchMatchStereo.filter_min_ncc 0.07
對於紋理不是特別豐富的場景,建議增加 windows_radius 以及降低 filter_min_ncc 來提升深度值求解的準確度。
Mesh and Texutre Map
點雲融合
$ colmap stereo_fusion \
--workspace_path $DATASET_PATH/dense \
--workspace_format COLMAP \
--input_type geometric \
--output_path $DATASET_PATH/dense/fused.ply
表面網格重建
$ colmap poisson_mesher \
--input_path $DATASET_PATH/dense/fused.ply \
--output_path $DATASET_PATH/dense/meshed-poisson.ply
$ colmap delaunay_mesher \
--input_path $DATASET_PATH/dense \
--output_path $DATASET_PATH/dense/meshed-delaunay.ply
—————— END ——————
本文作者 :phillee
發表日期 :2021年1月27日
本文連結 :https://www.cnblogs.com/phillee/p/14335034.html
版權宣告 :自由轉載-非商用-非衍生-保持署名(創意共享3.0許可協議/CC BY-NC-SA 3.0)。轉載請註明出處!
限於本人水平,如果文章和程式碼有表述不當之處,還請不吝賜教。