COLMAP 在 3DGS 中起到了數據預處理和三維重建的關鍵作用,其處理流程包括特征提取與匹配、稀疏重建、稠密重建和輸出文件生成。結合 3DGS 的高斯分布建模和優化算法,COLMAP 提供了場景的幾何和相機信息,為實時渲染和三維重建奠定了基礎。
一、COLMAP 的作用
稀疏重建 (Sparse Reconstruction):
- COLMAP 通過?運動結構恢復 (Structure-from-Motion, SfM)?技術,從多視角圖像中提取特征點,并計算相機的位姿(外參)和場景中點云的稀疏分布(內參)。
- 在 3DGS 中,稀疏重建提供了場景的基本幾何信息,如相機參數和稀疏點云數據,這些是后續稠密重建和高斯分布擬合的基礎。
稠密重建 (Dense Reconstruction):
- COLMAP 可以進一步生成稠密點云,通過多視角立體匹配 (Multi-View Stereo, MVS),對稀疏點云進行補充,生成更密集的三維點云數據。
- 稠密點云為 3DGS 提供了更豐富的幾何細節,用于構建更精確的高斯分布模型。
相機參數提取:
- COLMAP 提取每張圖像的內參(相機焦距、畸變參數等)和外參(相機位置和姿態),這些參數對于 3DGS 中高斯分布的光柵化和渲染至關重要。
數據預處理:
- COLMAP 輸出的稀疏或稠密點云、相機參數和圖像信息,經過處理后可以作為 3DGS 的輸入數據,用于構建高斯分布模型和進行實時渲染。
二、COLMAP 的處理流程
COLMAP 的處理流程主要包括以下步驟:
1.?特征提取與匹配
- 從輸入的多張圖像中提取特征點(如使用 SIFT、SURF 等算法),并計算特征描述子。
- 通過匹配不同圖像間的特征點,建立圖像間的對應關系,為后續的三角化和運動估計提供數據支持。
2.?稀疏重建
- 基于特征點匹配的結果,通過三角化計算場景中點云的稀疏分布。
- 同時估計每張圖像的相機位姿(旋轉和平移參數),生成稀疏三維點云和相機參數文件(如?
cameras.bin
?和?images.bin
)。
3.?稠密重建
- 使用稀疏點云和相機參數,通過 MVS 算法生成稠密點云。
- 稠密點云文件(如?
points3D.bin
)提供了更豐富的幾何細節,用于后續的高斯分布建模。
4.?輸出文件結構
- COLMAP 輸出的文件通常包括:
- cameras.bin / cameras.txt:相機內參文件,包括焦距、圖像分辨率、畸變參數等。
- images.bin / images.txt:相機外參文件,包括每張圖像的旋轉四元數、平移向量和相機 ID。
- points3D.bin / points3D.txt:稀疏或稠密點云文件,包括每個點的三維坐標和顏色信息。
三、在3DGS中的具體使用
1. 特征提取
feat_extracton_cmd = colmap_command + " feature_extractor " \"--database_path " + args.source_path + "/distorted/database.db \--image_path " + args.source_path + "/input \--ImageReader.single_camera 1 \--ImageReader.camera_model " + args.camera + " \--SiftExtraction.use_gpu " + str(use_gpu)
? feature_extractor
?參數功能是執行特征提取,提取每張圖像的特征點,從輸入的多張圖像中提取特征點(如使用 SIFT、SURF 等算法),并計算特征描述子,生成特征描述子數據庫database.db,使用GPU加速SIFT特征提取(--SiftExtraction.use_gpu 1)。
2. 特征匹配
feat_matching_cmd = colmap_command + " exhaustive_matcher \--database_path " + args.source_path + "/distorted/database.db \--SiftMatching.use_gpu " + str(use_gpu)
?exhaustive_matcher
參數功能是執行特征匹配,建立圖像間的兩兩對應關系。exhaustive_matcher
會讀取 database.db
中的特征點信息,并進行以下操作:
- 匹配圖像間的關鍵點:利用描述子計算不同圖像之間的特征相似性,找到對應的特征點對。
- 生成匹配關系:將匹配結果(對應點對)存儲在數據庫中,作為后續稀疏重建的輸入。
此外需注意,exhaustive_matcher
?是窮舉匹配,適合小規模數據集(如小于 100 張圖像),對于大規模數據集,可以使用更高效的匹配策略,如?sequential_matcher
?或?vocab_tree_matcher。
3.稀疏三維重建
mapper_cmd = (colmap_command + " mapper \--database_path " + args.source_path + "/distorted/database.db \--image_path " + args.source_path + "/input \--output_path " + args.source_path + "/distorted/sparse \--Mapper.ba_global_function_tolerance=0.000001")exit_code = os.system(mapper_cmd)if exit_code != 0:logging.error(f"Mapper failed with code {exit_code}. Exiting.")exit(exit_code)
mapper
參數負責稀疏三維重建,即通過多視角圖像生成場景的稀疏點云和相機位姿。該命令完成的任務有:
稀疏點云重建:
- 基于特征匹配結果(存儲在?
database.db
?中),通過?運動恢復結構(Structure-from-Motion, SfM)?算法,計算場景的稀疏三維點云。 - 同時估計每張圖像的?相機位姿(外參:旋轉矩陣?
R
?和平移向量?t
)和?相機內參(焦距?fx, fy
、主點?cx, cy
?等)。
- 基于特征匹配結果(存儲在?
輸出關鍵數據:
- 生成的文件(如?
points3D.bin
、images.bin
、cameras.bin
)是 3DGS 的輸入,用于初始化高斯分布模型。其中cameras.bin
:相機內參(焦距、畸變等);images.bin
:相機外參(位姿)及關聯的特征點;points3D.bin
:稀疏點云的三維坐標和顏色。
- 生成的文件(如?
全局優化(Bundle Adjustment, BA):
- 通過參數?
--Mapper.ba_global_function_tolerance=0.000001
?控制優化精度,確保重建結果的幾何一致性。當優化殘差的變化小于?0.000001
?時,停止迭代。此值越小,優化越精細,但計算時間越長。
- 通過參數?
mapper生成的稀疏點云和相機參數是3DGS的唯一輸入,決定了高斯分布的初始位置和場景幾何結構。若稀疏點云不完整(如匹配失敗或 BA 優化不足),會導致 3DGS 的高斯模型出現空洞或扭曲。
4. 去畸變
img_undist_cmd = (colmap_command + " image_undistorter \--image_path " + args.source_path + "/input \--input_path " + args.source_path + "/distorted/sparse/0 \--output_path " + args.source_path + "\--output_type COLMAP")
image_undistorter
參數用于校正圖像畸變并重構稀疏重建的輸出結構,使其適配后續3DGS的輸入要求。該命令完成的任務有:
圖像去畸變(Undistortion):根據相機標定參數(內參和畸變系數),去除原始圖像因鏡頭畸變(如徑向畸變、切向畸變)導致的形變,生成無畸變的圖像。3DGS 需要幾何準確的圖像數據,避免畸變影響高斯分布的光柵化精度。
重構稀疏重建輸出
- 將?
sparse/0
?中的稀疏重建結果(相機參數、點云)與去畸變后的圖像重新關聯,生成標準化目錄結構(sparse/
、images/
)。 - 適配 3DGS:3DGS 默認要求輸入無畸變的圖像和對應的相機參數。
- 將?
輸出格式標準化:?通過?
--output_type COLMAP
?確保輸出文件格式與 COLMAP 標準一致。
四、總結
命令 | 輸入 | 輸出 | 3DGS 依賴環節 |
---|---|---|---|
feature_extractor | 原始圖像 | database.db | 特征匹配 |
exhaustive_matcher | database.db | 更新的?database.db | 稀疏重建 |
mapper | database.db | sparse/0/ | 初始化點云和相機 |
image_undistorter | sparse/0/ ?+ 原始圖像 | images/ ?+?sparse/ | 最終輸入數據 |
歡迎關注公眾號AutoSIM,新技術分享搶先一步查看