跳转至

工具

Open3d

  • o3d.io.read_point_cloud(filename, format='auto', ...) 读取点云文件

    • pcd = o3d.io.read_point_cloud("a.txt", format="xyz")
    • pcd = o3d.io.read_point_cloud("a.ply")
  • o3d.visualization.draw_geometries(geometry_list, window_name='Open3D', width=1920, height=1080, left=50, top=50) 可视化点云

    • o3d.visualization.draw_geometries([pcd])


Colmap

自动重建

colmap automatic_reconstructor `
    --database_path $PROJECT_PATH/database.db `
    --image_path $PROJECT_PATH/images


特征提取

colmap feature_extractor `
    --database_path $PROJECT_PATH/database.db `
    --image_path $PROJECT_PATH/images
  • --image_list_path /path/to/image-list.txt 给新增的图像提取特征,其中 image-list.txt 存放新增的图像的路径,格式为每行一个,且必须为相对于 images 的相对路径
  • --ImageReader.camera_model arg (=SIMPLE_RADIAL) 指定相机模型
    • SIMPLE_PINHOLE: f, cx, cy
    • PINHOLE: fx, fy, cx, cy
    • SIMPLE_RADIAL: f, cx, cy, k
    • RADIAL: f, cx, cy, k1, k2


特征匹配

colmap exhaustive_matcher `
    --database_path $PROJECT_PATH/database.db

针对少量图像进行穷举匹配,可以获得最好效果。此外,还有以下匹配方式:

  • vocab_tree_matcher 针对大量图像,通过 vocabulary tree 快速检索视觉上最相近的图像进行匹配
  • sequential_matcher 针对顺序采集的视频图像,匹配视频流中的相邻帧,帧之间的前后关系由图像文件名给定,与数据集中的存储顺序无关。同时,这种匹配方式能够基于 vocabulary tree 进行回环检测
  • spatial_matcher 通过图像采集时的 GPS 信息匹配空间位置上相近的图像。
  • transitive_matcher 基于传递规则使用已有的特征匹配关系确定更完全的匹配图,即 A 与 B 匹配,B 与 C 匹配,那将直接匹配 A 和 C
  • matcher_importer 通过 text 文件指定图像的匹配关系,如果是导入的特征可以进一步指定两张图像之间特征的匹配关系


稀疏重建

若是正常稀疏重建,则直接使用如下命令:

colmap mapper `
    --database_path $PROJECT_PATH/database.db `
    --image_path $PROJECT_PATH/images `
    --output_path $PROJECT_PATH/sparse

若是加入新的图像,则要添加参数 --input_path。这会改变原有 3D 点的位置。

colmap mapper `
    --database_path $PROJECT_PATH/database.db `
    --image_path $PROJECT_PATH/images `
    --input_path /path/to/existing-model `
    --output_path /path/to/model-with-new-images

若要从已知相机内外参重建,可以转而使用 point_triangulator

colmap point_triangulator `
    --database_path $PROJECT_PATH/database.db `
    --image_path $PROJECT_PATH/images `
    --input_path path/to/manually/created/sparse/model `
    --output_path path/to/triangulated/sparse/model


稠密重建

# 重新校准图片
mkdir $PROJECT_PATH/dense
colmap image_undistorter `
    --image_path $PROJECT_PATH/images `
    --input_path $PROJECT_PATH/sparse/0 `
    --output_path $PROJECT_PATH/dense `
    --output_type COLMAP `
    --max_image_size 2000

# Stero 算法 (PatchMatch)
colmap patch_match_stereo `
    --workspace_path $PROJECT_PATH/dense `
    --workspace_format COLMAP `
    --PatchMatchStereo.geom_consistency true

# Stereo Fusion 算法
colmap stereo_fusion `
    --workspace_path $PROJECT_PATH/dense `
    --workspace_format COLMAP `
    --input_type geometric `
    --output_path $PROJECT_PATH/dense/fused.ply

# 泊松重建
colmap poisson_mesher `
    --input_path $PROJECT_PATH/dense/fused.ply `
    --output_path $PROJECT_PATH/dense/meshed-poisson.ply

# 德劳内重建
colmap delaunay_mesher `
    --input_path $PROJECT_PATH/dense `
    --output_path $PROJECT_PATH/dense/meshed-delaunay.ply


转换格式

colmap model_converter `
    --input_path $PROJECT_PATH/sparse `
    --output_path $PROJECT_PATH/sparse `
    --output_type TXT


视觉定位

在稀疏重建之后,可以对新添加的图像进行定位

colmap feature_extractor `
    --database_path $PROJECT_PATH/database.db `
    --image_path $PROJECT_PATH/images `
    --image_list_path /path/to/image-list.txt

colmap vocab_tree_matcher `
    --database_path $PROJECT_PATH/database.db `
    --VocabTreeMatching.vocab_tree_path /path/to/vocab-tree.bin `
    --VocabTreeMatching.match_list_path /path/to/image-list.txt

colmap image_registrator `
    --database_path $PROJECT_PATH/database.db `
    --input_path $PROJECT_PATH/sparse `
    --output_path $PROJECT_PATH/model-with-new-images

colmap bundle_adjuster `
    --input_path $PROJECT_PATH/model-with-new-images
    --output_path $PROJECT_PATH/model-with-new-images

  • image-list.txt 存放新增图像的路径,每行一个,路径只能为相对于 images 的路径
  • vocab-tree.bin 为训练好的数据集,可从官网下载
  • vocab_tree_matcher 可以用 exhaustive_matcher 替换
  • image_registrator 向已存在的 3D 模型添加新图像,但新图像不会用于新增 3D 点
  • bundle_adjuster 是可选的


若想要产生更多的 3D 点,获得更准确的定位,可以使用 mapper 来代替 image_registrator,然后用 model_aligner 来使坐标系回归初始模型。

colmap mapper `
    --database_path $PROJECT_PATH/database.db `
    --image_path $PROJECT_PATH/images `
    --input_path $PROJECT_PATH/sparse `
    --output_path $PROJECT_PATH/model-with-new-images

colmap model_aligner `
    --input_path $PROJECT_PATH/model-with-new-images `
    --output_path $PROJECT_PATH/model-with-new-images `
    --ref_images_path /path/to/text-file `
    --ref_is_gps 1 `
    --alignment_type ecef `
    --robust_alignment 1 `
    --robust_alignment_max_error 3.0
  • text-file 存放已知的相机坐标,形式为每行一个 image_name.jpg X Y Z,可以仅有已注册图像的一部分