Colmap算法pipeline

62F04787-5D3D-4638-AF5A-862CE30B48B4.png

Colmap安装

在Ubuntu Docker中安装Colmap


数据采集

多视角三维重建(MVS)的数据采集


Colmap GUI操作

稀疏重建

采用增量SfM技术

其中SfM技术出自GitHub - openMVG/openMVG: open Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.

1. 准备工作
  1. 创建工程目录TestScan
  2. 在其中创建images目录并存放原始图像
  3. 运行colmap gui,点击file - New Project弹出Project窗口
  4. 在Database行点击New,在TestScan目录中创建TestScan.db文件用于存储原始图片地址、特征匹配等数据
  5. Images行点击Select选择场景原始图片所在目录
  6. 最后点击save
    初始的目录结构为:
.
|-- TestScan.db
`-- images
    |-- 00000000.jpg
    |-- 00000001.jpg
    |-- ...
    `-- 00000048.jpg
2. 特征提取

此步骤进行对应点搜索,可以理解为全局特征匹配
点击processing - Feature Extraction

  • 选择相机模型为Pinhole
  • 选择Parameters from EXIF:从EXIF中提取相机内参(一般采集到的影响都携带EXIF文件)
  • 其他参数暂且默认
    然后点击Extract进行特征提取

2021-04-06_10-35.png

3. 特征匹配

点击processing - Feature Matching,参数全部选用默认,然后点击Run进行特征匹配

这个步骤结束之后会自动生成场景图匹配矩阵(以不同视图之间同名特征数为权重,以不同视图为图节点的图结构)

从右侧的Log中可以看到这两步的输出
2021-04-06_10-39.png

4. 增量式建模

点击reconstruction - start reconstruction进行一键式增量迭代重建

此步骤逐渐增加视角,并进行迭代优化重投影误差
目的是计算不同视图的相机参数、得到场景的稀疏点云和确定不同视图与点云间的可视关系
最后可以得到场景的稀疏点云和各个视角的相机姿态

2021-04-06_10-49.png

以第49张图像(39个视角)为例

  • 已有点云576个
  • 首先进行姿态估计(Pose Refinement Report)
  • 再进行BA优化:整体稀疏点云融合测量点149个,滤除测量点32个
  • 再进行三角测量(Retriangulation)
  • 最后再进行迭代全局的BA优化,优化已有相机的姿态和三维稀疏点云坐标
==============================================================================
Registering image #39 (49)
==============================================================================

  => Image sees 576 / 991 points

Pose refinement report
----------------------
    Residuals : 1132
   Parameters : 8
   Iterations : 7
         Time : 0.0134351 [s]
 Initial cost : 0.535158 [px]
   Final cost : 0.462099 [px]
  Termination : Convergence

  => Continued observations: 540
  => Added observations: 73

Bundle adjustment report
------------------------
    Residuals : 24684
   Parameters : 2030
   Iterations : 21
         Time : 0.501096 [s]
 Initial cost : 0.374389 [px]
   Final cost : 0.367663 [px]
  Termination : Convergence

  => Merged observations: 149
  => Completed observations: 27
  => Filtered observations: 32
  => Changed observations: 0.016853

Bundle adjustment report
------------------------
    Residuals : 24690
   Parameters : 2000
   Iterations : 3
         Time : 0.0764892 [s]
 Initial cost : 0.430376 [px]
   Final cost : 0.427614 [px]
  Termination : Convergence

  => Merged observations: 10
  => Completed observations: 1
  => Filtered observations: 0
  => Changed observations: 0.000891

==============================================================================
Retriangulation
==============================================================================

  => Completed observations: 9
  => Merged observations: 186
  => Retriangulated observations: 0

深度图估计与优化

Colmap中代价构造、累积、估计和优化是封装在一起的,利用GEM模型进行求解
主要分为四个步骤:匹配代价构造 -> 代价累积 -> 深度估计 -> 深度图估计

这里的原理暂时省略,多视图几何三维重建实战系列之COLMAP

1. 图像去畸变

点击reconstruction - dense reconstruction,在稠密重建窗口中点击select选择文件存放位置,然后点击undistortion即可去除图像畸变

⚠️注意:这里不要选择项目的根目录,拷贝图片的时候会报错路径已存在导致colmap gui闪退的;同时undistortion也只能点一次,第二次同样会因为路径已存在闪退

2021-04-09_10-40.png

带有畸变的图像会导致边缘有较大的时差估计误差,因此在深度图估计之前,使用光学一致性和几何一致性联合约束构造代价匹配

dtu数据集和之前配置成针孔模型已经隐含无畸变
如果使用自采集数据集需要更改相机模型为带畸变参数的相机模型

2. 深度估计

在稠密重建窗口中点击stereo进行场景深度估计
深度估计结束后可以得到photometricgeometric下的深度图和法向量图

这一步很慢而且资源消耗比较大

2021-04-09_11-15.png

之后点击红框里的这些就可以观察光学一致性photometric和几何一致性geometric后的depth map和normal map

1476DCB5-C004-4BB2-8700-CD79B42F135E.png

Colmap会利用光学一致性同时估计视角的深度值和法向量值,并利用几何一致性进行深度图优化


稠密重建

点击Fusion即可进行基于深度图融合的稠密重建

2021-04-06_17-18_1.png

重建后会在dense中生成ply模型文件

可视化显示

Meshlab

安装MeshLab进行显示

sudo snap install meshlab

【报错:meshlab无法打开ply文件】
2021-04-06_14-18.png

问题分析:用文本浏览器打开ply文件发现header之后全部问乱码
BFCA8075-4921-4811-99A0-2830B2F44D28.png

找了很多资料还是没有找到解决方案,最后找师兄要了一个显示ply的python脚本,主要是用的是open3d库就成功了😭,这个故事告诉我们 听老师和师兄的一句建议就可以节省一整个下午debug的时间
脚本放在github上,暂未开源,如果有需求可以留言哈~

!!解决方案:经过一个月的摸索,终于找到解决方案

sudo snap install --devmode meshlab

最近的meshlab安装采用了snap方式,snap是一种安全模型,该模型限制应用程序查看目录内容和打开文件,因此使用devmode安装meshlab,就会打破限制

Colmap GUI

或者采用Colmap GUI官方的可视化方法,点击File - Import model from...,选择生成的fused.ply即可打开查看融合后的点云效果;不过meshed-poisson.ply无法打开,还是要使用Meshlab
2021-04-06_17-18.png

中间数据分析 —— 匹配矩阵

点击Extras - Match Matrix可以导出当前场景的匹配矩阵

8278ADD8-0E5E-4C6F-8FC1-6E34825BEA12.png

从中可以看到改组图像中相机的运动规律。如果相机围绕物体圆周采样,则匹配矩阵则会出现条带,各个条带平行关系越强,相机的运动控制越严格

看了些其他人的比较图和结论,采集数据集的前期控制对重现效果有影响


Colmap命令行操作

准备好带有images图像目录的文件

  1. 特征提取
colmap feature_extractor \
   --database_path ./database.db \
   --image_path ./images

输出:database.db中保存特征点
2. 特征点匹配

colmap exhaustive_matcher \
   --database_path ./database.db
  1. 稀疏重建
mkdir sparse
colmap mapper \
    --database_path ./database.db \
    --image_path ./images \
    --output_path ./sparse

输出sparse文件夹,目录结构如下:

└── sparse
    └── 0
        ├── cameras.bin        # 相机内参
        ├── images.bin         # 相机位姿
        ├── points3D.bin       # 稀疏3D点
        └── project.ini
  1. 图像去畸变
mkdir dense
colmap image_undistorter \
    --image_path ./images \
    --input_path ./sparse/0 \
    --output_path ./dense \
    --output_type COLMAP \

输出dense文件夹,目录结构如下:

└── dense
    ├── images
    │   ├── 0.JPG
    │   ├── ...
    │   └── 48.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
  1. 稠密重建
colmap patch_match_stereo \
    --workspace_path ./dense \
    --workspace_format COLMAP \
    --PatchMatchStereo.geom_consistency true    

输出dense/stereo文件夹,为每张图像估计depth_mapnormal_map

└── dense
    ├── images
    │   ├── 0.JPG
    │   ├── ...
    │   └── 48.JPG
    ├── run-colmap-geometric.sh
    ├── run-colmap-photometric.sh
    ├── sparse
    │   ├── cameras.bin
    │   ├── images.bin
    │   └── points3D.bin
    └── stereo
        ├── consistency_graphs
        ├── depth_maps
        │   ├── 0.JPG.geometric.bin
        │   ├── 0.JPG.photometric.bin
        │   ├── ...
        │   ├── ...
        │   ├── 48.JPG.geometric.bin
        │   └── 48.JPG.photometric.bin
		├── fusion.cfg
        ├── normal_maps
        │   ├── 0.JPG.geometric.bin
        │   ├── 0.JPG.photometric.bin
        │   ├── ...
        │   ├── ...
        │   ├── 48.JPG.geometric.bin
        │   └── 48.JPG.photometric.bin
        └── patch-match.cfg
  1. 融合
./colmap stereo_fusion \
    --workspace_path ./dense \
    --workspace_format COLMAP \
    --input_type geometric \
    --output_path ./dense/result.ply

输出result.ply点云模型文件

Resources

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐