点击上方“计算机视觉工坊”,选择“星标”

干货第一时间送达

为了方便大家了解基于多视图立体的三维重建技术,更重要的是能亲手利用开源数据集或者自己采集的影像跑一遍流程,进而对整个流程更为熟悉,本文整理了近年来几种经典的基于传统方法和基于深度学习方法的三维重建技术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.

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

下载1

在「计算机视觉工坊」公众号后台回复:深度学习,即可下载深度学习算法、3D深度学习、深度学习框架、目标检测、GAN等相关内容近30本pdf书籍。

下载2

在「计算机视觉工坊」公众号后台回复:计算机视觉,即可下载计算机视觉相关17本pdf书籍,包含计算机视觉算法、Python视觉实战、Opencv3.0学习等。

下载3

在「计算机视觉工坊」公众号后台回复:SLAM,即可下载独家SLAM相关视频课程,包含视觉SLAM、激光SLAM精品课程。

重磅!计算机视觉工坊-学习交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群,请扫描下面微信号加群,备注:”研究方向+学校/公司+昵称“,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进去相关微信群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

觉得有用,麻烦给个赞和在看~  

多视图几何三维重建实战系列之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. 基于多视图几何的三维重建

    前言 三维重建是计算机视觉研究的重要内容之一,是根据单视图或者多视图的图像重建三维信息的过程.        早期的三维重建更多的是通过在相机进行预标定.或相机按照特定轨迹运动的情况下进行重建,这样的 ...

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

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

  8. 国内首个三维重建系列视频课程,涉及SFM、立体匹配、多视图几何、结构光、单目深度估计等...

    原文链接:国内首个三维重建系列视频课程,涉及SFM.立体匹配.多视图几何.结构光.单目深度估计等... 三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数据获取.预处理.点云配准 ...

  9. 重磅!国内首个三维重建系列视频课程,涉及SFM、立体匹配、多视图几何、结构光、单目深度估计等(最新版)...

    写在前面 感谢大家的一路陪伴与支持,这里赠送一张「3D视觉从入门到精通」知识星球优惠券,有效期两天,有需要的可以使用. 三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数据获取. ...

  10. 终于来了,国内首个三维重建系列视频课程,涉及SFM、多视图几何、结构光、单目深度估计等...

    三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数据获取.预处理.点云配准与融合.生成物体表面等过程,把真实场景刻画成符合计算机逻辑表达的数学模型. 由于三维重建对图像.光学.成 ...

最新文章

  1. c语言函数库哪里keyk,[精品]C语言库函数(字母G-K)-教案.doc
  2. 【JavaScript】JavaScript基础-变量、运算符与控制语句
  3. python pdf处理 图片_python PDF文件合并、图片处理
  4. C++知识点14——类与static
  5. python医学科研中能做什么-一个博士生接受怎样的训练是完整、全面的科研训练?...
  6. Redis可视化工具 Redis Desktop Manager
  7. 【杂谈】AI工业界都有哪些值得参加的比赛?
  8. 使用事件和消息队列实现分布式事务
  9. 编译原理:正规式转变成DFA算法
  10. 【转】Android之apk文件签名——keytool 和 jarsigner
  11. MATLAB读取和写入Excel文件
  12. SqlServer2008修改编辑前200行
  13. jquery.easyui.tabs 中的首个tabs被最后tabs覆盖的问题解决方法
  14. 电子/硬件工程师手册
  15. python需要在linux上运行,在linux上运行python的方法
  16. r软件官方下载 linux,r语言下载安装
  17. Flash Builder 4 正式版破解注册方法(flex4)
  18. Docker 运行stress
  19. JavaScript模式(1):字面量和构造函数
  20. 微信小程序 开发运营接入指南 设计规则

热门文章

  1. 多张eps合并成一张
  2. 松柏先生:从《功守道》看电商品牌最后的机会!
  3. c语言求圆锥的表面积和体积_有关C语言:求圆锥体的体积和表面积,急!!!!!!1...
  4. javamail 邮件发送、带格式、已保存
  5. HotSpot虚拟机的垃圾收集算法实现
  6. java gc 命令_Java 查看系统GC命令介绍
  7. 开源H5盲盒商城源码系统4.0-vue+TP5php框架开发开源网站
  8. Flutter IOS 提交AppStore 审核失败
  9. MOS管自举电容工作原理电路设计及其分析
  10. openCV 简单实现身高测量(未考虑相机标定,windows)