Date:2020-8-15
作者:浩南
原文链接:多视图几何三维重建实战系列之COLMAP
欢迎加入国内最大的3D视觉交流社区,1700+的领域从业者正在一起学习~

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

因为三维重建原理复杂,且各种软件或代码之间接口变化多样,无法一言蔽之,因此作者打算分为四篇文章介绍四种经典的三维重建技术Pipeline。分别为:

1)传统方法(COLMAP)

2)深度学习方法(COLMAP + MVSNet)

3)传统方法(COLMAP + OpenMVS)

4)深度学习方法(COLMAP + R-MVSNet)

多视图几何三维重建实战系列之COLMAP

1.概述

作为计算机视觉的核心问题,基于多视图立体(以下简称为”MVS”)的三维重建技术已经广泛应用于3D打印、离线地图重建和文物修复等行业应用中。本文先整体介绍三维重建流程(第二节),在介绍传统方法COLMAP的实际操作流程(第三节),最后根据输出结果对COLMAP的重建效果进行分析(第四节)。(注意,这个系列选用的三维重建方式均为基于深度图融合的方法。)

2.三维重建流程

基于MVS的三维重建技术流程包括以下步骤:数据采集,稀疏重建,深度图估计和稠密重建(图1)。

图1 基于MVS的三维重建技术流程

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

图2 增量式SfM结构图

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

图3 深度图估计框架

对于稠密重建,目的是恢复场景的稠密点云。利用深度图配准原理融合深度图,恢复稠密点云。

3.COLMAP实际操作

以传统方法COLMAP为例,介绍的三维重建的实际操作,行文结构按照数据采集、稀疏重建、深度图估计、稠密重建等四个步骤,希望读者可以参考本节,利用开源数据集或者自采数据,跑通基于传统方法(COLMAP)的三维重建技术。

3.1数据集

3.1.1数据采集

1)DTU数据集

DTU数据集[1]是针对于MVS而专门拍摄并处理的室内数据集(图4)。利用一个搭载可调节亮度灯的工业机器臂对一个物体进行多视角的拍摄,每个物体所拍的视角都经过严格控制,所以可以获取每个视角的相机内、外参数。

图4 DTU原始数据集

整个数据集由124个不同的物体或场景组成,每个物体共拍摄49个视角,每个视角共有7中不同的亮度,因此,每个物体或场景文件夹内部共有343个图片。每张影像的分辨率为1600×1200。(该数据集还包含带有深度图真值的训练影像集,我们将在之后文章中介绍如何利用该数据集训练神经网络。)

2)Tanks and Temples数据集

不同于DTU数据集,Tanks and Temples数据集[2]采集的是室外场景。这个数据集主要用于验证我们使用的网型和开源软件泛化能力,验证其是否对光照变化大、存在动态目标的场景仍具备较为精确地重建能力(图5)。

图5 Tank and Temples 数据集

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

图6 目标目录

百度云盘链接:https://pan.baidu.com/s/1Wb9E6BWCJu4wZfwxm_t4TQ#list/path=%2F密码:s2v2

4) 自采数据采集要求

经过笔者多次实验,自采数据主要有以下几点要求:

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

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

图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

图8 COLMAP图形界面

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

图9 COLMAP

保存结束后,数据库将会显示.db文件,内部保存原始图片地址、之后特征提取匹配等数据(图9)。

2)特征提取

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

图10 特征提取

3)特征匹配

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

图11 特征匹配

COLMAP封装的比较好,在特征匹配结束后,会自动生成场景图和匹配矩阵,即以不同视图之间同名特征数为权值,以不同视图为图节点的图结构。对于匹配矩阵等中间过程的分析见第四节。

4)增量式重建

增量式重建是个逐渐增加视角,并进行迭代优化重投影误差的过程[4]。目的是计算不同视图的相机参数、得到场景的稀疏点云和确定不同视图与点云之间的可视关系。在COLMAP中操作比较简单,点击“reconstruction”中的“start reconstruction”进行一键式重建,整个过程将会自动进行增量式重建,我们可以从旁边的log框内查询当前状态。

图12 增量式重建过程

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

图13 SfM统计结果

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

图14 稀疏重建结果

3.4深度图估计与优化

1)深度估计与优化原理

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

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

2)操作1 - 影像去畸变

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

图15 稠密重建窗口——去除图像畸变

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

图16 深度估计与优化结果
图17 从左到右:Scan1原图,初始深度图,优化后深度图

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

3.5稠密重建

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

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

图18 稠密重建结果

4.结果分析

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

4.1匹配矩阵分析

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

图19 匹配矩阵

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

图20 相机分布示意图

4.2深度估计时间

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

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

4.3 深度图估计结果

图21 其他场景深度图估计结果

4.4稠密重建结果

图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算法(视觉里程计、后端优化、回环检测)

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

汇总 | 相机标定算法

汇总 | 事件相机原理

汇总 | 结构光经典算法

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

三维匹配_多视图几何三维重建实战系列之COLMAP相关推荐

  1. 多视图几何三维重建实战系列之MVSNet

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1. 概述 MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术,传统方法利用几何.光学 ...

  2. 视图几何三维重建实战系列之MVSNet

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 1. 概述 MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术,传统方法利用几何.光学 ...

  3. 多视图几何三维重建实战系列- Cascade-MVSNet

    MVSNet在2018年提出后,在估计深度图的应用中取得了非常好的结果.应用CNN于立体匹配的技术也使得传统的匹配效率整体提高.但是因为使用3D卷积神经网络进行深度正则化处理,所以即便在比较低的分辨率 ...

  4. 多视图几何三维重建实战系列之R-MVSNet

    上期文章介绍了用于三维重建的深度学习框架MVSNet[1],这也是如今比较主流的深度估计的神经网络框架.框架的原理按照双目立体匹配框架步骤:匹配代价构造.匹配代价累积.深度估计和深度图优化四个步骤.使 ...

  5. 【算法】多视图几何三维重建+增量式SfM

    多视图几何三维重建的基本原理: 从两个或者多个视点观察同一景物,已获得在多个不同的视角下对景物的多张感知图像,运用三角测量的基本原理计算图像像素间位置偏差,获得景物的三维深度信息,这一个过程与人类观察 ...

  6. 三维匹配_基于三维模型的目标识别和分割在杂乱的场景中的应用

    作者:仲夏夜之星 来源:3D视觉工坊公众号 链接: 基于三维模型的目标识别和分割在杂乱的场景中的应用 在杂波和遮挡情况下,对自由形式物体的识别及分割是一项具有挑战性的任务.本文提出了一种新的基于三维模 ...

  7. 三维匹配_机器视觉——双目视觉的基础知识(视差深度、标定、立体匹配)

    1 1.双目视觉的视差与深度 人类具有一双眼睛,对同一目标可以形成视差,因而能清晰地感知到三维世界.因此,计算机的一双眼睛通常用双目视觉来实现,双目视觉就是通过两个摄像头获得图像信息,计算出视差,从而 ...

  8. 三维匹配_倾斜影像和近景影像空地融合精细化实景三维建模

    摘要:无人机倾斜摄影测量弥补了航空摄影测量无法获取地物侧面纹理信息的缺陷,而且可以快速.自动获取大面积城市建筑物三维模型.但是,基于倾斜摄影建立的三维模型也存在一些问题,比如模型变形.纹理缺失等,导致 ...

  9. 三维匹配_三维GIS数据融合的基本方法与进展

    点击图片上方蓝色字体"慧天地"即可订阅 文章转载自微信公众号地理信息世界GeomaticsWorld,版权归原作者及刊载媒体所有. 作者信息 华 巍1,2,胡云岗1,2,侯妙乐1, ...

  10. 多视图几何中的三维重建

    1. 简介 资料来源为: 1)B站多视图几何三维重建视频讲解:https://www.bilibili.com/video/BV1Sj411f73e 2)武汉大学摄影测量与遥感专业博士李迎松的CSDN ...

最新文章

  1. git原理及常见使用方法
  2. WCF系列(三) -- WCF配置文件注释 【转】
  3. 使用.reg文件删除暴风影视库图标和注册信息
  4. cr3格式怎么转换成jpg_怎么把JPG格式转换为PDF?
  5. 数组按时间(字符串-Date)排序
  6. Linux调试分析诊断利器----strace
  7. 如何使用 EF Core 按周 对数据分组?
  8. 2020双十一实时大屏_2020拼多多双十一,拼多多双十一活动
  9. equal_range
  10. codeforces-984D——XOR-pyramid(DP)
  11. cmd代码玩贪吃蛇_关于N行贪吃蛇回答的补充
  12. javaw.exe与java.exe_java.exe和javaw.exe的区别及使用方法
  13. Ubuntu安装腾讯软件
  14. 用c++做文本加密与解密程序(源码)
  15. 分解质因数FZU - 1075
  16. nodejs安装时遇到的问题及解决方案
  17. WPS加载项系列(3)WPS项目部署
  18. JavaScript 各声明var、let、const方式区别『详解』
  19. 什么是马尔可夫决策过程
  20. hdu 2222 AC 自动机 模版(数组实现)

热门文章

  1. 计算机屏桌面翻页,Fliqlo翻页时钟 v1.51 - 个性化您的电脑桌面
  2. css挪动背景块位置的属性,CSS 背景位置 background-position属性
  3. RK3399PRO 硬件H264编码,RTSP推流笔记
  4. (转)Qt添加windows开机自启动
  5. python中def main是什么意思_python - 为什么要使用def main()?
  6. [HAOI2009]毛毛虫 树形DP
  7. 格力支持鸿蒙吗,董明珠万没想到,格力终将被美的超越,华为鸿蒙“功不可没”...
  8. word中插入分割线
  9. 关于最近阿里内部员工抢月饼事件引发的js程序扩展
  10. Mac 锁屏防止断网、睡眠、注销登录