Colmap安装
流程概述
基于图像的三维重建传统上首先使用**运动结构(Structure-from-Motion)恢复场景的稀疏表示和输入图像的姿态。这个输出然后作为多视图立体几何(Multi-View Stereo)**的输入,以恢复场景的密集表示。
SFM是通过一系列有重叠的且不同视角的图片重建出物体的三维结构(稀疏点云),并且输出相机的内外参数,内参指的是将真实空间的三维点通过内参矩阵转换为相机图片上的二维点,外参包含相机在切换不同视角时的平移和旋转信息。
通常情况下,运动结构系统将这一过程分为三个阶段:
1 特征检测与提取
2 特征匹配和几何验证
3 结构与运动重建
多视图立体几何(MVS) 采用SfM的输出来计算图像中每个像素的深度和法向信息。在3D点云中融合多幅图像的深度图和法向图,然后生成场景的密集点云。利用融合点云的深度和法向信息,泊松曲面(Poisson),三角剖分(delaunay)重建等算法可以恢复场景的三维曲面几何。
数据采集
参考:多视角三维重建(MVS)数据采集
在本次试验中我们共使用了113张照片,分别拍摄于早中晚不同的时间,使用设备为移动手机。
Colmap GUI操作
1. 准备工作
- 创建工程目录
Project1
- 在其中创建
images
目录并存放原始图像 - 运行
colmap gui
,点击file - New Project
弹出Project窗口 在Database
行点击New
,在Project1
目录中创建database-pj1.db
文件用于存储原始图片地址、特征匹配等数据- 在
Images
行点击Select
选择场景原始图片所在目录 - 最后点击
save
初始的目录结构为:
2. 特征提取
此步骤进行对应点搜索,可以理解为全局特征匹配 点击processing - Feature Extraction
- 选择
Parameters from EXIF
:从EXIF中提取相机内参(一般采集到的影响都携带EXIF文件) - 其他参数暂且默认 然后点击
Extract
进行特征提取
特征检测/提取在图像中找到稀疏的特征点,并使用数值描述符(128维向量)描述特征点。主要使用SIFT特征提取方法。
jpge图像的头部保存了EXIF信息 里面包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等,COLMAP可以从嵌入式EXIF信息中自动提取焦距信息。
提取到的特征信息如下:
NUM\_FEATURES
代表一张图像提取到多少个特征点。
x
,y
代表特征点的坐标。
scale
代表尺度(即相机距离物体远近的比例)。
ORIENTATION
代表特征点的梯度方向。
D\_1
…D\_128
代表特征描述符的128维向量,所有提取的数据都将存储在数据库文件中。
其中X, Y, SCALE, ORIENTATION
为浮点数,D\_1
…D\_128
为0
…255
范围内的值。
例如,一张图片有4个特征:
3. 特征匹配
点击processing - Feature Matching
,参数全部选用默认,然后点击Run
进行特征匹配
这个步骤结束之后会自动生成场景图和匹配矩阵(以不同视图之间同名特征数为权重,以不同视图为图节点的图结构)
从右侧的
Log
中可以看到这两步的输出
特征匹配首先匹配图像对,下面列出图像匹配的几种策略。其次再将匹配后的图像上的特征点进行匹配,利用特征点的128维描述符向量的相似性度量进行特征点匹配。
图像对匹配算法:
穷尽匹配(Exhaustive Matching):如果数据集中的图像数量相对较低(最多数百个),那么这种匹配模式应该足够快,并能获得最佳的重构结果。在这里,每个图像都与其他图像进行匹配,而块大小决定同时从磁盘加载到内存中的图像数量。
序列匹配(Sequential Matching):由一个摄像机。在这种情况下,连续的帧具有视觉重叠,不需要用尽全力地匹配所有的图像对。而是将连续捕获的图像相互匹配。
空间匹配(Spatial Matching):这种匹配模式将每个图像与它的空间近邻进行匹配。COLMAP还会从EXIF中提取GPS信息,并使用它进行空间最近邻居搜索。
传递性匹配(Transitive Matching):这种匹配模式利用已有特征匹配的传递关系,生成更完整的匹配图。如果一个图像A匹配到一个图像B,而B匹配到C,那么这个匹配器会尝试直接将A匹配到C。
建立图像对之后,在参考图像中的一个特征点,如何从目标图像中的所有特征点中找出与之相对应的特征点。如果使用暴力计算法,计算每一对特征点的相似距离,如果特征的描述符向量的维度和特征点的数量较多的话,暴力法是不可取的。需要使用 KD树 算法建立一个搜索树,基于KD树最邻近查找算法方便特征点进行快速匹配。
由于sift提取的特征点和描述子在匹配过程中可能会存在误匹配的情况,所以需要将错误的匹配点对剔除。几何校验是筛除一些误匹配的特征点。几何校验是指利用对极几何进行约束。
对极几何:空间中的一点与两张图片相机的光心,三者围成一个极平面,极平面与两张图片相交形成两条极线,对极几何约束是指,空间点X在摄像机1的成像平面中的像素点x,与之相匹配的摄像机2的成像平面中的像素点 x’ 一定落在极线上。
公式约束为: x’的转置 × F × x =0 ;F为基础矩阵,F可以通过8对匹配的特征点联立方程组求得 分解F矩阵可以求得相机的内参矩阵。
几何约束方法:随机选取图像对的8对匹配点,使用归一化八点算法求解基础矩阵F,然后统计满足对极几何关系的点对数量,在设定的次数内重复上述步骤,选取满足条件的点对数量最多的匹配为精化匹配结果。
4. 增量式建模
点击reconstruction - start reconstruction
进行一键式增量迭代重建
此步骤逐渐增加视角,并进行迭代优化重投影误差 目的是计算不同视图的相机参数、得到场景的稀疏点云和确定不同视图与点云间的可视关系 最后可以得到场景的稀疏点云和各个视角的相机姿态:
1 获取下一最佳匹配图像(匹配点对数量最多)
2 利用匹配的特征点估计出E矩阵(本质矩阵),估计图像位姿
3 进行三角化生成三维空间点,三角化是利用两个匹配的图像坐标和图像位姿以及相机的内参矩阵,求得匹配点的三维点坐标。
4 对所有已生成的三维点和已估计出的位姿,使用ceres库进行ba(bundle adjustment)优化。通过最小化重投影误差实现剔除误差过大的点
5 最后对所有数据进行ba优化 即全局优化
以第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
稠密重建
在重建场景的稀疏表示和输入图像的相机姿势后,MVS现在可以恢复更密集的场景几何。COLMAP有一个集成的密集重建管道,可以为所有的配准图像生成深度和法向图,将深度和法向图融合到一个将稀疏点云融合成密集点云,最后使用泊松(Poisson)或三角剖分(Delaunay)重建方法从融合的点云中估计出一个密集曲面。
稠密重建分为:
1 是还原图像,去除图像的畸变
2 是计算深度图和法向图
3 将深度和法向图融合成到点云里
4 点云网格划分形成曲面
1. 图像去畸变
点击reconstruction - dense reconstruction
,在稠密重建窗口中点击select
选择文件存放位置,然后点击undistortion
即可去除图像畸变
带有畸变的图像会导致边缘有较大的时差估计误差,因此在深度图估计之前,使用光学一致性和几何一致性联合约束构造代价匹配
dtu数据集和之前配置成针孔模型已经隐含无畸变 如果使用自采集数据集需要更改相机模型为带畸变参数的相机模型
2. 深度估计
在稠密重建窗口中点击stereo
进行场景深度估计 深度估计结束后可以得到photometric
和geometric
下的深度图和法向量图
这一步很慢而且资源消耗比较大
之后点击红框里的这些就可以观察光学一致性photometric和几何一致性geometric后的depth map和normal map
Colmap会利用光学一致性同时估计视角的深度值和法向量值,并利用几何一致性进行深度图优化
3.稠密重建
点击Fusion
即可进行基于深度图融合的稠密重建
重建后会在dense
中生成ply
模型文件
可视化显示
Meshlab
安装MeshLab进行显示
Colmap GUI
或者采用Colmap GUI官方的可视化方法,点击File - Import model from...
,选择生成的fused.ply
即可打开查看融合后的点云效果;不过meshed-poisson.ply
无法打开,还是要使用Meshlab