如何使用python代码运行colmap

import os
import subprocess


def run_cmd(cmd):
"""运行命令并打印,出错时抛异常"""
print("\n[COLMAP]", " ".join(cmd))
subprocess.run(cmd, check=True)


def run_colmap(image_folder, output_folder, database_path):
colmap_path = r"D:/3dgs/gaussian-splatting/3dgs_tools/COLMAP-3.8-windows-cuda/bin/colmap.exe"

# 确保输出目录存在
os.makedirs(output_folder, exist_ok=True)

# sparse 输出目录(mapper 的 output_path 应该是 sparse 目录)
sparse_dir = os.path.join(output_folder, "sparse")
os.makedirs(sparse_dir, exist_ok=True)

# dense workspace(patch_match_stereo 需要)
dense_dir = os.path.join(output_folder, "dense")
os.makedirs(dense_dir, exist_ok=True)

# fused.ply 输出到 output_folder 里
fused_ply = os.path.join(output_folder, "fused.ply")

# mapper 默认会写 sparse/0
sparse_model_dir = os.path.join(sparse_dir, "0")

try:
# 0) 如果 db 已存在,建议删除避免冲突
if os.path.exists(database_path):
os.remove(database_path)

# 1) 创建数据库
run_cmd([colmap_path, "database_creator",
"--database_path", database_path])

# 2) 特征提取
run_cmd([colmap_path, "feature_extractor",
"--database_path", database_path,
"--image_path", image_folder])

# 3) 特征匹配
run_cmd([colmap_path, "exhaustive_matcher",
"--database_path", database_path])

# 4) 稀疏重建(写入 sparse_dir)
run_cmd([colmap_path, "mapper",
"--database_path", database_path,
"--image_path", image_folder,
"--output_path", sparse_dir])

# ✅ 5) 生成 dense workspace(关键!没有这步 patch_match 很容易崩/报错)
# 输出 dense_dir,里面会有 images/ sparse/ stereo/ 等目录
run_cmd([colmap_path, "image_undistorter",
"--image_path", image_folder,
"--input_path", sparse_model_dir,
"--output_path", dense_dir,
"--output_type", "COLMAP"])

# ✅ 6) 密集匹配(对 dense_dir 跑)
run_cmd([colmap_path, "patch_match_stereo",
"--workspace_path", dense_dir,
"--workspace_format", "COLMAP",
"--PatchMatchStereo.geom_consistency", "true"])

# ✅ 7) 融合点云
run_cmd([colmap_path, "stereo_fusion",
"--workspace_path", dense_dir,
"--workspace_format", "COLMAP",
"--input_type", "geometric",
"--output_path", fused_ply])

print("\n✅ COLMAP 全流程完成!")
print("输出点云:", fused_ply)

except subprocess.CalledProcessError as e:
print(f"\n❌ COLMAP 执行失败: {e}")


if __name__ == "__main__":
image_folder = r"D:/3DReconstructionSystem/static/frame/1767928445.6182756/train_and_test"
output_folder = r"D:/3DReconstructionSystem/static/frame/1767928445.6182756/output"
database_path = r"D:/3DReconstructionSystem/static/frame/1767928445.6182756/output/database.db"

run_colmap(image_folder, output_folder, database_path)

如果是用命令行来运行(通过环境变量:只用加入bin所在的文件夹而不是可执行文件所在的文件夹)

文件结构如下

image

 bin文件夹中只需要放置可执行文件,其他dll文件放置lib中

如果用上面的python代码,需要将lib中的文件复制到bin文件夹中

posted @ 2026-01-10 10:28  蘑菇味的花魂  阅读(3)  评论(0)    收藏  举报