sfm三维重建源码_多视图几何三维重建实战系列之COLMAP

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第1张图片
作者:浩南
来源:公众号 @3D视觉工坊
链接:多视图几何三维重建实战系列之COLMAP

为了方便大家了解基于多视图立体的三维重建技术,更重要的是能亲手利用开源数据集或者自己采集的影像跑一遍流程,进而对整个流程更为熟悉,本文整理了近年来几种经典的基于传统方法和基于深度学习方法的三维重建技术Pipeline,并详细介绍从多视图影像到深度图估计,再到恢复三维点云的整个过程。

因为三维重建原理复杂,且各种软件或代码之间接口变化多样,无法一言蔽之,因此作者打算分为四篇文章介绍四种经典的三维重建技术Pipeline。分别为:1)传统方法(COLMAP)2)深度学习方法(COLMAP + MVSNet)3)传统方法(COLMAP + OpenMVS)4)深度学习方法(COLMAP + R-MVSNet)多视图几何三维重建实战系列之COLMAP1.概述作为计算机视觉的核心问题,基于多视图立体(以下简称为”MVS”)的三维重建技术已经广泛应用于3D打印、离线地图重建和文物修复等行业应用中。本文先整体介绍三维重建流程(第二节),在介绍传统方法COLMAP的实际操作流程(第三节),最后根据输出结果对COLMAP的重建效果进行分析(第四节)。(注意,这个系列选用的三维重建方式均为基于深度图融合的方法。)2.三维重建流程基于MVS的三维重建技术流程包括以下步骤:数据采集,稀疏重建,深度图估计和稠密重建(图1)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第2张图片
图1 基于MVS的三维重建技术流程

对于数据采集。多视角数据来源广泛,我们主要使用的是开源数据集和自采数据进行试验。对于稀疏重建。我们主要利用SfM进行稀疏重建。SfM,(Structure From Motion,从运动中恢复结构),是一种从一组不同视角下拍摄的无序或有序影像中,同时恢复场景三维结构和相机姿态的技术。本文主要以增量式SfM为主,目的是得到场景中的相机姿态和表示场景结构的稀疏点云(图2)。增量式SfM选择无序影像进行特征匹配,并进行几何纠正、三角测量恢复稀疏点云结构,通过已有点云重新估计相对姿态,再进行局部和全局的BA优化。之后逐步向已有的结构中增加视角或影像,进行三角测量和姿态估计,再进行BA优化修正结构数据,最后输出全部的相机参数和稀疏三维点云。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第3张图片
图2 增量式SfM结构图

对于深度图估计,目的是恢复参考影像的深度信息。基于MVS的深度图估计,主流传统方法的流程(图3)是:首先,对一个参考影像,筛选用于和参考影像配对计算视差的原始影像(以下,被选中的影像被称为代表。整个代表集合用候选集表示)。其次,参考视差计算的经典框架,计算参考影像上第个特征对应的匹配代价,在通过代价聚合,计算深度值,最后进行深度过滤,优化初始深度图。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第4张图片
图2 增量式SfM结构图

对于稠密重建,目的是恢复场景的稠密点云。利用深度图配准原理融合深度图,恢复稠密点云。3.COLMAP实际操作以传统方法COLMAP为例,介绍的三维重建的实际操作,行文结构按照数据采集、稀疏重建、深度图估计、稠密重建等四个步骤,希望读者可以参考本节,利用开源数据集或者自采数据,跑通基于传统方法(COLMAP)的三维重建技术。3.1数据集3.1.1数据采集1)DTU数据集DTU数据集[1]是针对于MVS而专门拍摄并处理的室内数据集(图4)。利用一个搭载可调节亮度灯的工业机器臂对一个物体进行多视角的拍摄,每个物体所拍的视角都经过严格控制,所以可以获取每个视角的相机内、外参数。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第5张图片
图4 DTU原始数据集

整个数据集由124个不同的物体或场景组成,每个物体共拍摄49个视角,每个视角共有7中不同的亮度,因此,每个物体或场景文件夹内部共有343个图片。每张影像的分辨率为1600×1200。(该数据集还包含带有深度图真值的训练影像集,我们将在之后文章中介绍如何利用该数据集训练神经网络。)2)Tanks and Temples数据集不同于DTU数据集,Tanks and Temples数据集[2]采集的是室外场景。这个数据集主要用于验证我们使用的网型和开源软件泛化能力,验证其是否对光照变化大、存在动态目标的场景仍具备较为精确地重建能力(图5)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第6张图片
图5 Tank and Temples 数据集

3)开源数据集下载链接:(感谢香港科技大学 姚遥开源的数据集链接)我们需要下载的是用于测试的数据集,所以打开百度云链接时,点击 “mvsnet”,再点击“preprocessed_inputs”,下载其中“dtu.zip”和“tankandtemples.zip”即可(图6)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第7张图片
图6 目标目录

百度云盘链接:https://pan.baidu.com/s/1Wb9E6BWCJu4wZfwxm_t4TQ#list/path=%2F密码:s2v24) 自采数据采集要求经过笔者多次实验,自采数据主要有以下几点要求:

  • 尽量使用单反相机或专业数码相机进行数据采集,如果要用手机进行采集,请使用单摄像头的手机进行数据采集。
  • 尽量选择纹理丰富的外界环境进行数据采集,避免玻璃围墙、瓷砖和打蜡地板等强反光材料环境
  • 尽量选择光照明亮,且光照条件变化不剧烈的环境,最好选择室内环境。如室内客厅,开启客厅大灯进行灯光补偿。
  • 尽量围绕重建物体或环境采集较多的影像,且在采集过程中控制快门速度,避免模糊。

接下来介绍COLMAP,笔者推荐大家使用Linux(Ubuntu)系统进行以下代码的编译与运行。以下所有程序的下载和编译都将基于Linux系统(Ubuntu)。传统方法暂时不需要GPU的加持,但之后的深度学习方法还是需要我们使用GPU,所以这里笔者建议各位读者,如果时间充裕,可先自行配置NVIDIA驱动,并安装CUDA9.0以上版本。笔者环境配置为:驱动版本 418.56, CUDA版本10.1, GTX960M,显存4GB(图7)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第8张图片
图7 NVIDIA驱动版本

3.2 COLMAP

1)软件介绍COLMAP是一款结合SfM(Structure-from-Motion)和MVS(Multi-View Stereo)的三维重建Pipeline,编译成功后我们能获取带有图形界面的软件(Graphic Interface)和不需要图形界面的二进制可执行文件(Command-Line Interface),可进行稀疏重建和稠密重建。源码链接及教程为:https://github.com/colmap/colmap。2)代码编译代码的编译和使用我们就直接使用别人造好的轮子,大家可以自行百度或谷歌搜索相关编译教程,本文中引用一些笔者认为具有参考意义的教程。如果大家需要,笔者后期再重新整理相关教程分享给大家。

  • 官方Github:https://github.com/colmap/colmap
  • COLMAP的安装和简单使用:

https://blog.csdn.net/X_kh_2001/article/details/82591978(感谢以上博客作者整理的安装帮助)

3.3 稀疏重建

我们将使用COLMAP中的增量式SfM技术进行稀疏重建。大家也可以使用OpenMVG增强对SfM的理解。1)准备工作首先,我们需要准备几个目录,第一个是包含原始图像的目录,第二个则是COLMAP工程的目录,各位读者可以自行管理自己的目录为了举例,以Scan1 表示COLMAP工程的目录,命名为当前场景的代号,内部包含该重建场景的原始图片,文件夹名称为images.在终端输入一下命令,打开COLMAP的图形界面(图8)。Linux : ~$ colmap gui

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第9张图片
图8 COLMAP图形界面

之后,新建项目:点击”file”,再点击“New Project”,弹出“project”窗口,点击“New”新建工程文件,将该工程文件保存在Scan1目录下,并点击“Select”选择场景原始图片所在的目录。最后点击“save”保存。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第10张图片
图9 COLMAP

保存结束后,数据库将会显示.db文件,内部保存原始图片地址、之后特征提取匹配等数据(图9)。2)特征提取按照稀疏重建的步骤,需要我们进行对应点搜索,可以理解为全局的特征匹配。首先进行特征提取,点击“processing”中的“Feature Extraction”, 弹出选择窗体,这里面,只需要将相机模型选择为“Pinhole”模型即可,其他参数默认可以不变。读者感兴趣的话,可以自行修正。一般我们采集的影像是携带有EXIF文件的,所以这里,需要选上“Parameters from EXIF”,意思是从EXIF中提取相机内参数。之后点击“Extract”即可进行特征提取(图10)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第11张图片
图10 特征提取

3)特征匹配其次进行特征匹配,操作也十分简单,点击“processing”中的“Feature Matching”, 弹出选择窗体。同样,这里面的参数都可以选择默认的参数,然后点击“Run”,即可进行特征匹配(图11)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第12张图片

图11 特征匹配COLMAP封装的比较好,在特征匹配结束后,会自动生成场景图和匹配矩阵,即以不同视图之间同名特征数为权值,以不同视图为图节点的图结构。对于匹配矩阵等中间过程的分析见第四节。4)增量式重建增量式重建是个逐渐增加视角,并进行迭代优化重投影误差的过程[4]。目的是计算不同视图的相机参数、得到场景的稀疏点云和确定不同视图与点云之间的可视关系。在COLMAP中操作比较简单,点击“reconstruction”中的“start reconstruction”进行一键式重建,整个过程将会自动进行增量式重建,我们可以从旁边的log框内查询当前状态。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第13张图片
图12 增量式重建过程

如图13,当前正在新增第39个视角,当前影像可以看到已有点云的337个,进行姿态估计(Pose Refinement Report),再进行BA优化,整体稀疏点云融合测量点110个,滤除测量点41个,最后进行三角测量(Retriangulation)新增观测点111个。上述过程结束后,进行迭代全局的BA优化,优化已有相机的姿态和三维稀疏点云坐标。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第14张图片
图13 SfM统计结果

结束后,就可以获得目标场景稀疏点云和各个视角的相机姿态(图14)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第15张图片
图14 稀疏重建结果

3.4深度图估计与优化

1)深度估计与优化原理在COLMAP中,匹配代价构造、累计、估计和优化是封装在一起的,利用GEM模型进行求解。与视差估计框架一样,深度估计框架也分为如下四个步骤:匹配代价构造,代价累积,深度估计,深度图优化[5]。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第16张图片

代价累积。COLMAP也采用Patch Match的信息传递策略[3]。经过视角平滑后,在候选集子集中进行同名特征采样,所以式1)被修改为:

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第17张图片

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第18张图片

2)操作1 - 影像去畸变在进行深度图估计前的第一步为影像去畸变,在COLMAP中,使用光学一致性和几何一致性联合约束构造匹配代价,带有畸变的影像会导致边缘有较大的视差估计误差。但实际上为了简化,我们使用的数据集已经经过及畸变纠正,且在之前的那一步使用了针孔模型中隐含约定无畸变。倘若我们自己采集的数据没有经过畸变纠正,需要更改相机模型为带有畸变参数的相机模型,或者先使用畸变较小的数码相机进行数据采集,保证测试的结果是正确的。具体操作十分简单,点击“reconstruction”中的“dense reconstruction”,弹出稠密重建窗口,并点击“select”选择生成文件存放的目录,这里存放在 ./Scan1/ (即工程目录下)中即可。然后点击“undistortion”即可去除图像畸变(图15)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第19张图片
图15 稠密重建窗口——去除图像畸变

3)操作2 - 深度估计点击“stereo”,即可进行场景深度估计。(这里会有视觉上的卡顿,属于正常现象,一般来说,这里电脑是无法再进行其他事情的(至少笔者的电脑是这样),所以大家可以选择休息一下。)深度估计结束后,可以得到“photometric”和“geometric”下的深度图和法向量图。由之前提及的原理,COLMAP会利用光学一致性(photometric)同时估计视角的深度值和法向量值,并利用几何一致性(geometric)进行深度图优化,我们可以点击“Depth Map”和“Normal Map”,即可得到我们对应视角的深度图和法向量图(图16)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第20张图片
图16 深度估计与优化结果

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第21张图片
图17 从左到右:Scan1原图,初始深度图,优化后深度图

通过观察结果(图17)发现,COLMAP可以获得较为精确的深度估计值,但在深度图完整度和深度连续性方面仍存在一些问题,深度图存在较多漏洞。

3.5稠密重建

先说操作,同样在该界面下,点击“Fusion”即可进行基于深度图融合的稠密重建。而该原理就是对估计出来的深度图,首先通过配准进行深度图融合,然后通过式3),按照投影方法进行点云恢复。

c7c0d8920e55a68f05b2ec5ab1c4c8ab.png

稠密重建结束后,我们利用meshlab打开生成的.ply文件,即可看到稠密重建结果(图18)。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第22张图片
图18 稠密重建结果

4.结果分析

COLMAP中可以导出丰富的中间数据,便于我们理解三维重建流程和各个模块的状态。

4.1匹配矩阵分析

通过点击“Extras”中的“Match Matrix”可以导出当前场景的匹配矩阵。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第23张图片
图19 匹配矩阵

从匹配矩阵中看出数据集之间相机运动规律,若相机围绕物体呈圆周采样,匹配矩阵将有条带出现(图19-b),且若途中各个条带的平行关系越紧致,则说明相机的运动控制越严格。例如Scan10中的上三角区中有平行排布的红色线条(图19-a),这是因为该数据集[1]在采样过程相机运动间隔受到严格规定(图20-a),而对于Tank and Tample[2]数据集,匹配矩阵的平行关系不紧致(图19-b),说明相机运动未受到严格限制(图20-b),只是简单的圆周运动。通过对比发现,Scan10 可以通过较少的视图得到相同完整度和精度的重建结果,说明采集相片集过程中的前期控制对重见效果有影响。

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第24张图片
图20 相机分布示意图

4.2深度估计时间

1 深度图估计运行时间对比(单位:分钟)

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第25张图片

结果表明,COLMAP深度估计的时间会随相片数量增多而增加。效率低于OpenMVS和深度学习方法。(不同机器上运行的时间不同)

4.3 深度图估计结果

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第26张图片
图21 其他场景深度图估计结果

4.4稠密重建结果

sfm三维重建源码_多视图几何三维重建实战系列之COLMAP_第27张图片
图22 稠密重建结果

5.结论

COLMAP可以用于快速三维重建,代码封装良好。但缺点为深度图估计速度过慢,且在深度图估计精度上略低于深度学习的方法,我们将在之后带来基于深度学习方法的三维重建技术的实操以及相应原理、结果分析。敬请期待。

参考文献

[1] Aan H , Jensen R R , Vogiatzis G , et al. Large-Scale Data for Multiple-View Stereopsis[J]. International Journal of Computer Vision, 2016, 120(2):153-168.

[2] Snavely N , Seitz S M , Szeliski R . Modeling the World from Internet Photo Collections[J]. International Journal of Computer Vision, 2008, 80(2):189-210.

[3] Barnes C , Shechtman E , Finkelstein A , et al. Patch Match: A Randomized Correspondence Algorithm for Structural Image Editing[J]. Acm Transactions on Graphics, 2009, 28(3, article 24).

[4] Schnberger J L , Zheng E , Pollefeys M. Structure-From-Motion Revisited.[5] Schnberger J L , Zheng E , Pollefeys M , et al. Pixelwise View Selection for Unstructured Multi-View Stereo[C] European Conference on Computer Vision (ECCV). Springer, Cham, 2016.

本文仅做学术分享,如有侵权,请联系删文。

往期干货资源:

汇总 | 国内最全的3D视觉学习资源,涉及计算机视觉、SLAM、三维重建、点云处理、姿态估计、深度估计、3D检测、自动驾驶、深度学习(3D+2D)、图像处理、立体视觉、结构光等方向!

汇总 | 3D目标检测(基于点云、双目、单目)

汇总 | 6D姿态估计算法(基于点云、单目、投票方式)

汇总 | 三维重建算法实战(单目重建、立体视觉、多视图几何)

汇总 | 3D点云后处理算法(匹配、检索、滤波、识别)

汇总 | SLAM算法(视觉里程计、后端优化、回环检测)

汇总 | 深度学习&自动驾驶前沿算法研究(检测、分割、多传感器融合)

汇总 | 相机标定算法

汇总 | 事件相机原理

汇总 | 结构光经典算法

汇总 | 缺陷检测常用算法与实战技巧

你可能感兴趣的:(sfm三维重建源码)