【colmap】基于colmap的多视图三维重建

《基于多视角图像的三维重建》👉https://github.com/XYZ-qiyh/multi-view-3d-reconstruction

本文将介绍COLMAP的安装与使用,重点介绍3D重建过程中每个步骤的输入输出。

一、安装

  • 安装依赖项:https://colmap.github.io/install.html#linux
  • 源码下载:https://github.com/colmap/colmap/tree/3.6

本文使用colmap-3.6版本,但同样适合新版本,下载完毕后进入colmap目录进行源码编译

cd ./colmap-3.6              # 进入colmap目录
mkdir build && cd ./build    # 创建build文件夹,并进入
cmake ..                     # cmake
make -j8                     # make多线程编译

二、基于colmap的三维重建

基于多视角图像的三维重建流程👇
首先通过运动恢复结构(Structure-from-Motion, SfM)为输入图像进行相机位姿估计,同时得到场景的稀疏点云信息。然后多视图立体匹配算法(Multi-view Stereo, MVS)用于稀疏重建的稠密化,重建结果为场景的稠密点云模型。如需获得三维场景的表面网格模型,则需要对重建得到的点云进行表面重建。

在这里插入图片描述

2.1 数据准备

基于colmap开源框架进行多视图三维重建,使用Sceaux Castle数据集提供的图片👇

图1. Sceaux Castle数据集

我们将图片组织为colmap的工程格式:

/path/to/project/...
+── images
│   +── image1.jpg
│   +── image2.jpg
│   +── ...
│   +── imageN.jpg
图2. colmap工程组织格式

工作目录中包含一个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_mapnormal_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 稀疏重建结果可视化
./colmap model_converter \
    --input_path $DATASET_PATH/dense/sparse \
    --output_path $DATASET_PATH/dense/sparse \
    --output_type TXT
图3. 稀疏重建结果 && 相机位姿可视化
3.3.2 深度图、法向图可视化

图4. 从左到右:100_7104原图,重建深度图,重建法向图
3.3.3 稠密重建结果可视化

图5. 稠密重建结果
4 相关资料
  • Castle场景的重建结果见百度网盘
    链接:https://pan.baidu.com/s/1l0JP2f5RqTzZiMaqhC-qGw 提取码:jgou

  • colmap三维重建的Shell脚本colmap_3d_recon.sh,修改其中的可执行文件路径EXE_PATH和数据路径DATASET_PATH即可对自己的数据进行三维重建。

  • 相机位姿可视化:https://github.com/demul/extrinsic2pyramid

  • SceauxCastle:https://en.wikipedia.org/wiki/Ch%C3%A2teau_de_Sceaux

  • 18
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 很高兴能够为您服务。Colmap和OpenMVS是两种三维重建技术,Colmap使用稠密图估计技术来提取图像的结构和视差图,而OpenMVS则使用深度估计技术,它使用更复杂的算法来处理图像,可以提高重建的准确度。 ### 回答2: COLMAP和OpenMVS是两种常用的三维重建软件工具,它们在图像处理、特征匹配、三维点云生成等方面有着各自的特点。 COLMAP是一个开源的三维重建软件,主要用于结构化重建。它能够使用大量的图像来构建三维场景,并生成高质量的点云和稠密地图。COLMAP使用视觉几何技术,包括特征提取、特征匹配和相机姿态估计等,以及三角测量和非线性优化等算法来进行三维重建COLMAP的特点是准确性高、稠密度好,但对于大规模场景处理速度较慢,对于计算资源有一定要求。 OpenMVS是一个用于多视图密集重建的开源软件。它基于图像处理和计算几何算法,能够从来自不同角度的图像中生成细致的三维模型。OpenMVS的特点是处理速度快、对于大规模数据处理也比较高效。它通过多视图稠密重建、稀疏点云三角化和纹理映射等算法来实现三维重建。OpenMVS适用于需要对大规模数据进行快速重建的情况。 综上所述,COLMAP和OpenMVS都是常用的三维重建软件工具,它们在特点和适用场景上有些区别。COLMAP适用于对结构化场景进行准确重建,而OpenMVS适用于对大规模数据进行快速重建。选择使用哪种软件工具应根据具体的需求和项目要求来决定。同时,COLMAP和OpenMVS都有各自的优点和局限性,可以根据具体情况选择使用或结合使用,以得到更好的三维重建结果。 ### 回答3: Colmap和OpenMVS是两种用于三维重建的计算机视觉工具。其中,Colmap是一个用于密集三维重建和相机定位的开源软件包,而OpenMVS是一个用于稠密三维重建的工具。 Colmap主要用于从一组相片生成稀疏重建结果,并且可以使用这些结果进行稠密三维重建。它使用SIFT或者其他特征提取算法来提取图像中的特征点,并通过这些特征点来计算相机的姿势。然后,Colmap通过对特征点进行三角化,重建相机姿势和特征点的3D位置来生成稀疏点云。接下来,可以使用这些点云来生成稠密三维重建结果。Colmap具有较高的精度和鲁棒性,适用于从大规模图像集合中进行三维重建。 OpenMVS是一个专门用于稠密三维重建的工具。它接受稀疏点云和图像作为输入,然后通过将图像投影到点云上来生成稠密点云。OpenMVS采用了特定的密集重建算法,可以精确地重建物体的表面形状和纹理信息。此外,OpenMVS还提供了更多的后处理和可视化工具,以优化和改进重建结果。 Colmap和OpenMVS具有各自的特点和优势。Colmap对于从大型图像集合中进行稀疏重建非常强大,而OpenMVS则更专注于产生高质量的稠密重建结果。两者可以搭配使用,通过先用Colmap生成稀疏点云,再输入给OpenMVS生成稠密点云,从而实现更全面和精细的三维重建
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值