Colmap算法pipeline:
在Ubuntu Docker中安装Colmap
多视角三维重建(MVS)的数据采集
采用增量SfM技术
其中SfM技术出自GitHub - openMVG/openMVG: open Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.
TestScan
images
目录并存放原始图像colmap gui
,点击file - New Project
弹出Project窗口在Database
行点击New
,在TestScan
目录中创建TestScan.db
文件用于存储原始图片地址、特征匹配等数据Images
行点击Select
选择场景原始图片所在目录save
.
|-- TestScan.db
`-- images
|-- 00000000.jpg
|-- 00000001.jpg
|-- ...
`-- 00000048.jpg
此步骤进行对应点搜索,可以理解为全局特征匹配
点击processing - Feature Extraction
Pinhole
Parameters from EXIF
:从EXIF中提取相机内参(一般采集到的影响都携带EXIF文件)Extract
进行特征提取点击processing - Feature Matching
,参数全部选用默认,然后点击Run
进行特征匹配
这个步骤结束之后会自动生成场景图和匹配矩阵(以不同视图之间同名特征数为权重,以不同视图为图节点的图结构)
点击reconstruction - start reconstruction
进行一键式增量迭代重建
此步骤逐渐增加视角,并进行迭代优化重投影误差
目的是计算不同视图的相机参数、得到场景的稀疏点云和确定不同视图与点云间的可视关系
最后可以得到场景的稀疏点云和各个视角的相机姿态
以第49张图像(39个视角)为例
==============================================================================
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
点击reconstruction - dense reconstruction
,在稠密重建窗口中点击select
选择文件存放位置,然后点击undistortion
即可去除图像畸变
⚠️注意:这里不要选择项目的根目录,拷贝图片的时候会报错路径已存在导致colmap gui闪退的;同时undistortion也只能点一次,第二次同样会因为路径已存在闪退
带有畸变的图像会导致边缘有较大的时差估计误差,因此在深度图估计之前,使用光学一致性和几何一致性联合约束构造代价匹配
dtu数据集和之前配置成针孔模型已经隐含无畸变
如果使用自采集数据集需要更改相机模型为带畸变参数的相机模型
在稠密重建窗口中点击stereo
进行场景深度估计
深度估计结束后可以得到photometric
和geometric
下的深度图和法向量图
这一步很慢而且资源消耗比较大
之后点击红框里的这些就可以观察光学一致性photometric和几何一致性geometric后的depth map和normal map
Colmap会利用光学一致性同时估计视角的深度值和法向量值,并利用几何一致性进行深度图优化
点击Fusion
即可进行基于深度图融合的稠密重建
重建后会在dense
中生成ply
模型文件
安装MeshLab进行显示
sudo snap install meshlab
问题分析:用文本浏览器打开ply文件发现header之后全部问乱码
找了很多资料还是没有找到解决方案,最后找师兄要了一个显示ply的python脚本,主要是用的是open3d库就成功了,这个故事告诉我们 听老师和师兄的一句建议就可以节省一整个下午debug的时间
脚本放在github上,暂未开源,如果有需求可以留言哈~
!!解决方案:经过一个月的摸索,终于找到解决方案
sudo snap install --devmode meshlab
最近的meshlab安装采用了snap方式,snap是一种安全模型,该模型限制应用程序查看目录内容和打开文件,因此使用devmode安装meshlab,就会打破限制
或者采用Colmap GUI官方的可视化方法,点击File - Import model from...
,选择生成的fused.ply
即可打开查看融合后的点云效果;不过meshed-poisson.ply
无法打开,还是要使用Meshlab
点击Extras - Match Matrix
可以导出当前场景的匹配矩阵
从中可以看到改组图像中相机的运动规律。如果相机围绕物体圆周采样,则匹配矩阵则会出现条带,各个条带平行关系越强,相机的运动控制越严格
看了些其他人的比较图和结论,采集数据集的前期控制对重现效果有影响
准备好带有images
图像目录的文件
colmap feature_extractor \
--database_path ./database.db \
--image_path ./images
输出:database.db中保存特征点
2. 特征点匹配
colmap exhaustive_matcher \
--database_path ./database.db
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
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
colmap patch_match_stereo \
--workspace_path ./dense \
--workspace_format COLMAP \
--PatchMatchStereo.geom_consistency true
输出:dense/stereo
文件夹,为每张图像估计depth_map
和normal_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
./colmap stereo_fusion \
--workspace_path ./dense \
--workspace_format COLMAP \
--input_type geometric \
--output_path ./dense/result.ply
输出:result.ply
点云模型文件