精华内容
下载资源
问答
  • 作者:浩南来源:公众号 @3D视觉工坊链接:多视图几何三维重建实战系列之COLMAP 为了方便大家了解基于视图立体的三维重建技术,更重要的是能亲手利用开源数据集或者自己采集的影像跑一遍流程,进而对整个流程更为...

    f91ebb49c018c757412cb516365bc14c.png
    作者:浩南
    来源:公众号 @3D视觉工坊
    链接:多视图几何三维重建实战系列之COLMAP

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

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

    416c402b411f06fb6d43f1666663dafc.png
    图1 基于MVS的三维重建技术流程

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

    22c79edb4c2fb1437cb684ab701b1c6c.png
    图2 增量式SfM结构图

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

    a206ebe35da8ad5c566278a9b92e41fb.png
    图2 增量式SfM结构图

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

    35c99581c6f549b288c5b890a237e3d0.png
    图4 DTU原始数据集

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

    81025418627b6d530ad8614106f73e59.png
    图5 Tank and Temples 数据集

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

    14875a30cfdcae0a3dd799e898cbd4fa.png
    图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)。

    986bffcb2fda268021b2746185d44583.png
    图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

    0483bed44079d179539da414723ed02e.png
    图8 COLMAP图形界面

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

    c6eae1098474928a407101e1ab85ea50.png
    图9 COLMAP

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

    ccf91131b472b9e9e9b8b323ba4392e2.png
    图10 特征提取

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

    5ad04c4dd8fd62d77612b3cae2cb63a5.png

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

    8fb7125ac363f19d702ea65bc8519eb6.png
    图12 增量式重建过程

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

    fa47b6c47d71036e1e26bb4bf8ea4a35.png
    图13 SfM统计结果

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

    258018335167ca76160e36fd38f39018.png
    图14 稀疏重建结果

    3.4深度图估计与优化

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

    0e8ac642079c57a3aaf954ae73d8e607.png

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

    f69ff5df2de506f9fe15b55d8401534b.png

    a393b4b767af036078a2183f15803c64.png

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

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

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

    17413e9ea8a924fb99183fd10c6ecb95.png
    图16 深度估计与优化结果

    f2be80c4463024ddabc713c8d0287535.png
    图17 从左到右:Scan1原图,初始深度图,优化后深度图

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

    3.5稠密重建

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

    c7c0d8920e55a68f05b2ec5ab1c4c8ab.png

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

    0770ca8428ed0dd33d5aaf5fae9692a9.png
    图18 稠密重建结果

    4.结果分析

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

    4.1匹配矩阵分析

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

    d6cf5a4fd509acc6df2cd14cd78e215c.png
    图19 匹配矩阵

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

    788ab4b6318859d447b52fa6f5891a80.png
    图20 相机分布示意图

    4.2深度估计时间

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

    1dbb4e08c32ac3ec54842a2ba6322120.png

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

    4.3 深度图估计结果

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

    4.4稠密重建结果

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

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

    汇总 | 相机标定算法

    汇总 | 事件相机原理

    汇总 | 结构光经典算法

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

    展开全文
  • 作者:浩南来源:公众号 @3D视觉工坊链接:多视图几何三维重建实战系列之COLMAP 为了方便大家了解基于视图立体的三维重建技术,更重要的是能亲手利用开源数据集或者自己采集的影像跑一遍流程,进而对整个流程更为...

    b774296a192b12a3e7ef8eb3fe9eba41.png
    作者:浩南
    来源:公众号 @3D视觉工坊
    链接:多视图几何三维重建实战系列之COLMAP

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

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

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

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

    e170c0df2d4bb879d349e6784c822b2a.png
    图2 增量式SfM结构图

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

    056e8276afe7a8a26056f3b3171d2c4d.png
    图2 增量式SfM结构图

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

    31657d45e082af6d7a492e2de0e3205d.png
    图4 DTU原始数据集

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

    5a20b750a780b719f73a70168b7ea48b.png
    图5 Tank and Temples 数据集

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

    2caef2d24f7a8e680a5d1702f92657c5.png
    图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)。

    10f0045df5f3f006a1221a59d82ca3f0.png
    图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

    fb63e99d84e14fbc35a5b165474b848e.png
    图8 COLMAP图形界面

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

    49972082091c3d2ce84aa4e43f18e620.png
    图9 COLMAP

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

    8aeba1c16865b7451d72dc0187ccc3ff.png
    图10 特征提取

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

    df0764a494561738b82c5c96e1c752fd.png

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

    4a5524fb1b0793860d9b6a4bbe824026.png
    图12 增量式重建过程

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

    1e0e746d87fd060a252e3443d24157f3.png
    图13 SfM统计结果

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

    7cba861ad89672319365b006a53fa9a6.png
    图14 稀疏重建结果

    3.4深度图估计与优化

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

    8c7d0731b146bf24644d6347314c8e73.png

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

    e1350a05650afc2aca5433b40da59794.png

    652af4912975de64481ff3c8a2a950d6.png

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

    58ce522a6b3e6fbee414fd60935eb93a.png
    图15 稠密重建窗口——去除图像畸变

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

    832fd6e1423a0b102d2553a41ad1f207.png
    图16 深度估计与优化结果

    fc09f61c1bbaad143de0c8a27a72e4a3.png
    图17 从左到右:Scan1原图,初始深度图,优化后深度图

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

    3.5稠密重建

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

    a0c1f1cab4fb2a1df7f1c76623034781.png

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

    9c7a8c1a9be9d1db26e922b15fc13f1a.png
    图18 稠密重建结果

    4.结果分析

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

    4.1匹配矩阵分析

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

    277173be760370bbe0ea579d65a63ead.png
    图19 匹配矩阵

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

    17c6fd670492f4d994defa8b41b50a80.png
    图20 相机分布示意图

    4.2深度估计时间

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

    7bdf5b4ac50f5d3b1fdfd34ca248b4e8.png

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

    4.3 深度图估计结果

    0fce57a8c65d48258d7a5ab23156b5f6.png
    图21 其他场景深度图估计结果

    4.4稠密重建结果

    2f3ccb183a260cca8bc9a354e54ee7b1.png
    图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

    千次阅读 热门讨论 2020-08-14 07:00:00
    点击上方“3D视觉工坊”,选择“星标”干货第一时间送达为了方便大家了解基于多视图立体的三维重建技术,更重要的是能亲手利用开源数据集或者自己采集的影像跑一遍流程,进而对整个流程更为熟悉,本...

    点击上方“3D视觉工坊”,选择“星标”

    干货第一时间送达

    为了方便大家了解基于多视图立体的三维重建技术,更重要的是能亲手利用开源数据集或者自己采集的影像跑一遍流程,进而对整个流程更为熟悉,本文整理了近年来几种经典的基于传统方法和基于深度学习方法的三维重建技术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视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

    下载2

    在「3D视觉工坊」公众号后台回复:3D视觉优质源码即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。

    下载3

    在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

    重磅!3DCVer-学术论文写作投稿 交流群已成立

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

    同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群。

    一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

    ▲长按加微信群或投稿

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

     圈里有高质量教程资料、可答疑解惑、助你高效解决问题

    整理不易,请给工坊点赞和在看

    展开全文
  • 点击上方“3D视觉工坊”,选择“星标”干货第一时间送达1. 概述MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术,传统方法利用几何、光学一致性构造匹配代价,进行匹配代价...

    点击上方“3D视觉工坊”,选择“星标”

    干货第一时间送达

    1. 概述

    MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术,传统方法利用几何、光学一致性构造匹配代价,进行匹配代价累积,再估计深度值。虽然传统方法有较高的深度估计精度,但由于存在在缺少纹理或者光照条件剧烈变化的场景中的错误匹配,传统方法的深度估计完整度还有很大的提升空间。

    近年来卷积神经网络已经成功被应用在特征匹配上,提升了立体匹配的精度。在这样的背景下,香港科技大学Yaoyao等人,在2018年提出了一种基于深度学习的端到端深度估计框架——MVSNet[1]。

    虽然这两年已经有更多的框架在精度和完整度上面超过了MVSNet,但笔者发现,无论是基于监督学习的R-MVSNet 、Cascade – MVSNet等网络,还是基于自监督学习的M3VSNet,核心网型设计都是在借鉴MVSNet而完成的,而且MVSNet也是比较早期且较为完整的三维重建深度学习框架,了解该框架的原理、数据IO与实际操作能加深对2020年以来各种新方法的理解。

    本篇的主要内容为MVSNet的深度估计框架介绍、深度估计原理及如何利用MVSNet进行三维重建的具体操作。

    (注意:本方法需要11GB以上的GPU,推荐使用至少NVIDIA 1080Ti,且同样建议使用Linux进行操作。驱动建议安装CUDA9.0以上版本。)

    2. MVSNet框架

    图1 MVSNet网络形状

    由上图所示,MVSNet是一种监督学习的方法,以一个参考影像和多张原始影像为输入,而得到参考影像深度图的一种端到端的深度学习框架。网络首先提取图像的深度特征,然后通过可微分投影变换构造3D的代价体,再通过正则化输出一个3D的概率体,再通过soft argMin层,沿深度方向求取深度期望,获得参考影像的深度图。

    3. 基于深度学习的深度估计原理

    按照立体匹配框架[2],基于M VSNet的深度图估计步骤如下:深度特征提取,构造匹配代价,代价累计,深度估计,深度图优化。

    深度特征提取。深度特征指通过神经网络提取的影像特征,相比传统SIFT、SURF的特征有更好的匹配精度和效率[3]。经过视角选择之后,输入已经配对的N张影像,即参考影像和候选集。首先利用一个八层的二维卷积神经网络(图2)提取立体像对的深度特征Fi,输出32通道的特征图.

    图2 特征采样的神经网络

    为防止输入的像片被降采样后语义信息的丢失,像素的临近像素之间的语义信息已经被编码到这个32通道的特征中,并且各个图像提取过程的网络是权值共享的。

    考虑到对亚像素的深度估计,以保证深度图平滑,该单应性矩阵是完全可以微分的。通过投影变换,N张影像可形成N个特征体(图3-b),这个特征体就是匹配代价的表示。

    代价累积。MVSNet的代价累积通过构造代价体实现的。代价体是一个由长、宽与参考影像长宽一样的代价图在深度方向连接而成的三维结构(图4-a),在深度维度,每一个单位表示一个深度值。其中,某一深度的代价图上面的像素表示参考影像同样的像素在相同深度处,与候选集影像的匹配代价。

    图4  代价累计结果

    当已知概率体时,最简单的方法可以获取参考影像的所有像素在不同深度的概率图,按照赢者通吃原则[6]直接估计深度图。

    然而,赢者通吃原则无法在亚像素级别估计深度,造成深度突变、不平滑情况。所以需要沿着概率体的深度方向,以深度期望值作为该像素的深度估计值,使得整个深度图中的不同部分内部较为平滑。

    深度图优化。原始代价体往往是含有噪声污染的,因此,为防止噪声使得网络过度拟合,MVSNet中使用基于多尺度的三维卷积神经网络进行代价体正则化,利用U-Net网络[7],对代价体进行降采样,并提取不同尺度中的上下文信息和临近像素信息,对代价体进行过滤(图5)。

    图5  MVSNet代价体正则化

    4. MVSNet实战操作

    首先感谢Yaoyao(香港科技大学)给出的开源代码和已经预处理好的模型和数据。其次,本节首先介绍MVSNet利用开源数据集中的数据进行深度估计和点云恢复,之后,回顾该网络数据IO相关的要求和数据文件夹结构,最后,介绍如何利用自己采集的数据进行深度估计和点云恢复。

    4.1 利用开源数据集进行深度估计

    1) 环境配置

    参考Yaoyao的github主页中installation即可完成环境配置。

    https://github.com/YoYo000/MVSNet

    2) 数据整理

    在文末分享的百度云盘中下载数据集preprocessed_inputs/dtu.zip和预训练好的网络models/tf_model_19307.zip。将tf_model解压,在其中的3DCNNs/中获得训练好的模型 model.ckpt-100000.data-00000-of-00001。

    将test.py 中的pretrained_model 地址改为tf_model中3DCNNs的地址。

    图7 更改预训练模型的地址

    解压下载好的dtu.zip,到用于深度估计的数据集。以scan10为例,该文件夹的结构如下图。

    图8 scan10文件夹结构

    3) 深度估计

    运行代码:

    python test.py --dense_folder TEST_DATA_FOLDER --regularization '3DCNNs' --max_w 1152 --max_h 864 --max_d 192 --interval_scale 1.06
    

    注意:

    • flag --dense_folder 要设定为scan10的地址。

    • flag –regularization表示正则化代价体的方式,MVSNet中使用的是3D卷积神经网络。

    • 图片的大小可以按照GPU的大小变更参数,但是需要时32的整数倍(特征提取时2D神经网络要求图像是32的整数倍)

    • Max_d 和interval_scale 建议先按照默认的要求,在使用自己的数据时,我们会给出调整的方式

    4) 查看深度估计结果

    深度估计结束后,会在dense_folder文件夹中生成文件夹depths_mvsnet/。利用visualize.py 即查看相关的深度图和概率图(图9),输入代码:

    python visualized.py XXXXXXX.pfm

    图9 MVSNet深度图估计结果

    5) 点云生成

    MVSNet只能生成深度图,需要借助其他点云融合方法。这里Yaoyao给出了一种方法——fusible.可以直接利用生成的深度图和RGB图片,生成稠密点云。

    • 安装fusible

    git clone https://github.com/YoYo000/fusibile

    cd fusible

    mkdir build && cmake .

    make .

    • 运行代码

    python depthfusion.py --dense_folder TEST_DATA_FOLDER --fusibile_exe_path FUSIBILE_EXE_PATH --prob_threshold 0.3
    

    注意:每一个深度图在估计的时候,都有一个对应的概率图,及表示该像素沿深度方向不同的概率,所以flag –prob_threhold 表示用于过滤深度的概率阈值,即如果当前深度图的某个像素的深度对应的概率低于该阈值,则在点云融合的时候,该像素的深度不被使用,即该像素不会被投影到三维空间点。这样可以对稠密点云进行过滤优化。

    在dense_folder中,之后会生成新的文件夹points_mvsnet。在该文件夹下,找到consisitency_Check-time/final3d_model.ply. 即为融合之后的三维点云,利用meshlab打开即可。图10是笔者实验过后的稠密点云。

    图10 深度图融合之后的稠密点云

    6) 流程回顾

    环境配置 -> 整理输入数据 -> 配准好flag,运行代码 -> 安装深度融合软件 -> 生成稠密点云

    4.2 数据IO要求及数据配置回顾

    MVSNet的整个流程完整、简单,再回顾一下整个流程中文件夹的结构。

    1) Input

    输入时,有一个初始的文件夹(--dense_folder),存放了两个文件夹cams,images 和一个pair.txt.(图8以scan10为例)

    其中images文件夹,包含了49张照片,是放置畸变校正之后RGB图像的地方, cams中也包含了49个.txt文件,每一个txt文件就是对应序号图片的相机内参数和外参数. 第三个pair.txt 保存了,当每一个照片为参考影像时, 与其最相似的前十张相片(具体的排序方式是:在稀疏重建过程中, 两张相片共视的三维点数, 共视的三维点越多,则排名越高.)

    图11 pair.txt文件

    逐行解释如下:

    10 选取排名较高的前十张影像 10号 得分 2346.41分 1号, 得分2036.53 9号 得分1243.89。所以,对于0号影像来说,筛选前5个类似影像为10号,1号,9号,12号,11号,从数据集找出对应的RGB图片可观察筛选情况(图12)。

    图12 0号(ref) 10号 1号 9号 12号 11号 影像

    如果将MVSNet暂时看成黑箱, 那么输入到MVSNet的input文件夹,结构一定要遵从上述结构(图8)。

    2) Output

    在深度估计结束后,  会在dense_folder下新建一个depths_mvsnet, 里面包含了生成的深度图,点云生成后,还有一个文件夹points_mvsnet,里面包含场景的三维点云。

    图13 output文件夹结构

    4.3 利用自采数据进行深度估计

    将MVSNet看做一个黑箱, 需要将自采数据整理成4-1中dense_folder的文件夹结构,即需要每一个包含经过畸变矫正的RGB图片的images文件夹、包含每一个相片的内外参数的cams文件夹,和一个pair.txt文件。

    一般的自采数据,可获得RGB图片,所以,需要再利用稀疏重建的原理获得相机的内外参数和相关中间输出。这里提供了一个完整的数据处理pipeline,第一,先利用COLMAP进行稀疏重建,第二,导出相机文件和稀疏场景的信息,第三利用Yaoyao提供的python代码,将COLMAP结果直接转换为MVSNet的输入格式。具体步骤如下:

    1) 稀疏重建

    利用COLMAP进行稀疏重建,根据上一篇文章, 稀疏重建结束后,可得到了如下的场景。

    图14 稀疏重建结果

    2) 图像纠正

    点击“reconstruction” 中的“dense reconstruction”. 打开稠密重建窗口,进行图像畸变纠正。选择dense_folder为worksapce地址,点击“undistortion”进行图像去畸变。(原理这里不再赘述)

    图15 图像纠正窗口

    再返回到dense_folder下,可以看到当前的文件夹结构(图16)。这里的sparse是自动创建的保存相机数据和稀疏场景结构的文件夹。

    图16 纠正之后的文件结构

    3) 导出相机参数和中间数据

    点击COLMAP中“file”的 “export data as TXT”, 并以2)中的sparse/文件夹作为导出地址,导出三个文件:camera.txt, images.txt, points3D.txt.

    图17 相机数据和中间数据(选中部分)

    • camera.txt是保存相机内参数的文件

    • images.txt是保存图片外参数和图片二维特征与三维空间点对应信息的文件

    • points3D.txt是保存三维空间点在世界坐标系下坐标、RGB值以及在各个影像上的轨迹(track)

    4) 结果转换

    感谢Yaoyao的结果转换代码(colmap2mvsnet.py),可以将COLMAP的结果直接转化成MVSNet输入需要的结果。执行代码为:

    python colmap2mvsnet.py –dense_folder our_dense_folder –max_d XXX –interval_scale XXX
    
    • Flag –dense_folder 需要以我们的dense_folder作为地址,里面必须包含sparse文件夹

    • --max_d 表示,最大估计的离散深度采样区间数,因为MVSNet是按照平面扫描原理进行深度估计的,所以深度是离散采样的,一般我们设定为192个深度采样区间。

    • --interval_scale表示每个深度区间的大小,默认为1.06(mm)。

    • 深度估计范围:已知深度最小值depth_min,则深度最大值满足:

    • 注意:我们需要估计自采数据的深度范围,已保证在深度采样区间内,能对目标场景进行有效的深度估计,举个例子,如果自采数据的深度范围为45cm – 80cm,那么我们用于深度估计的区间范围应该是35cm,从45 – 80cm。此时如果我们设定的深度区间为0 – 35cm,那么估计出来的深度图肯定是错误的。所以对于自采数据,大家需要尝试不同的深度区间,以找到合适的取值范围。

    • 在估计自采数据的深度范围时,需要修改Yaoyao的代码,需要的朋友们可以私戳笔者,获取修改之后的代码。

    5) 深度估计

    转换结束后,将dense_folder中的取出cams,images两个文件夹和pair.txt文件,放入一个新的文件夹中,该文件夹就可以作为MVSNet的输入。然后,参考4-1节即可利用自采数据进行深度估计和稠密重建。


    图18 自采数据运行结果

    原图,深度图,稠密点云

    6) 流程回顾

    利用自己采集的数据进行深度估计的步骤为:采集数据 -> 稀疏重建 -> COLMAP文件导出 -> 数据转换 -> 输入MVSNet  -> 输出深度图 -> 深度融合,恢复点云。

    5. 总结

    MVSNet是一种端到端的基于监督学习的深度估计网络,从2018年提出伊始,就作为一种比较流行的深度学习框架,其提出的深度代价匹配和构造方法能快速对MVS数据进行参考影像的深度估计,其精度相比较传统方法也有一定的提升。

    可是,其在正则化过程中仍旧消耗近11GB的内存,这使得许多人在使用MVSNet的时候受到限制,下一篇文章,将讲述如何利用循环神经网络和一种链式的Cost Volume构造方法减少MVSNet的GPU消耗,敬请期待。

    参考文献

    [1] Yao Yao, Luo Zixin, Li Shiwei, Fang Tian, Quan Long. MVSNet: Depth Inference for Unstructured Multi-View Stereo. European Conference on Computer Vision (ECCV)

    [2] Scharstein D , Szeliski R . A Taxonomy and Evaluation of Dense Two-Frame Stereo Correspondence Algorithms[J]. International Journal of Computer Vision, 2002, 47(1-3):7-42.

    [3] Han, X., Leung, T., Jia, Y., Sukthankar, R., Berg, A.C.: Matchnet: Unifying feature and metric learning for patch-based matching. Computer Vision and Pattern Recognition (CVPR) (2015)

    [4] Collins R T . A Space-Sweep Approach to True Multi-Image Matching[C] Computer Vision and Pattern Recognition, 1996. Proceedings CVPR '96, 1996 IEEE Computer Society Conference on. IEEE, 1996.

    [5] Yang R , Pollefeys M . Multi-Resolution Real-Time Stereo on Commodity Graphics Hardware[C] 2003 IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 2003. Proceedings. IEEE, 2003.

    [6] Furukawa Y , Hernández, Carlos. Multi-View Stereo: A Tutorial[J]. Foundations & Trends in Computer Graphics & Vision, 2015, 9(1-2):1-148.

    [7] Ronneberger, O., Fischer, P., Brox, T.: U-net: Convolutional networks for biomedical image segmentation. International Conference on Medical Image Computing and Computer Assisted Intervention (MICCAI) (2015)

    附录

    开源数据集下载链接:(感谢香港科技大学 姚遥开源的数据集链接)我们需要下载的是用于测试的数据集,在公众号「3D视觉工坊」后台回复「mvsnet」,即可获得下载链接。打开百度云链接时,点击 “mvsnet”,再点击“preprocessed_inputs”,下载其中的“dtu.zip”和“tankandtemples.zip”即可(图18)。

    图19  目标目录

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

    下载1

    在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。

    下载2

    在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计汇总等。

    下载3

    在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

    重磅!3DCVer-学术论文写作投稿 交流群已成立

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

    同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群。

    一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

    ▲长按加微信群或投稿

    ▲长按关注公众号

    3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

    学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

     圈里有高质量教程资料、可答疑解惑、助你高效解决问题

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

    展开全文
  • 点击上方“计算机视觉工坊”,选择“星标”干货第一时间送达上期文章介绍了用于三维重建的深度学习框架MVSNet[1],这也是如今比较主流的深度估计的神经网络框架。框架的原理按照双目立体匹配框...
  • 下载1 在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。 下载2 在「3D视觉工坊」公众号后台回复:3D...
  • 而基于计算机视觉的多视图几何三维重建,不需要相机按特定的轨迹运动,也不需要对相机进行预标定,可以从不同视角获取目标物体的幅视图,从视图中提取目标物体的三维几何约束信息,利用约束信息即可实现景物的三维...
  • 1)B站多视图几何三维重建视频讲解:https://www.bilibili.com/video/BV1Sj411f73e 2)武汉大学摄影测量与遥感专业博士李迎松的CSDN: https://blog.csdn.net/rs_lys/article/list/1 涉及的内容主要是 sfm, Patch...
  • python depthfusion.py --dense_folder TEST_DATA_FOLDER --fusibile_exe_path FUSIBILE_EXE_PATH --prob_threshold 0.3
  • 写在前面感谢我们「3D视觉从入门到精通」知识星球嘉宾为我们带来的主题为基于多视图几何方式的三维重建视频讲解,星球成员可免费观看学习。备注:作者来自武汉大学在读博士,精通多视图几何算法。什么...
  • “齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”——F.S.Hill, JR。1.1首先我们先谈一下向量和点的区分问题。 我们先用一个基和一个向量...
  • 写在前面感谢我们「3D视觉从入门到精通」知识星球嘉宾为我们带来的主题为基于多视图几何方式的三维重建视频讲解,星球成员可免费观看学习。备注:作者来自武汉大学在读博士,精通多视图几何算法。这里...
  • 《计算机视觉中的多视图几何》匹配源代码,matlab中关于三维重建的源代码
  • 基于传统多视图几何三维重建算法 基于深度学习的三维重建算法 总地来说,尽管目前传统的三维重建算法依旧占据研究的主要部分,但是越来越的研究者开始关注于用CNN探索三维重建,或者说...
  • 研究数据驱动的多视图三维重建技术,包括如何从视频或图像数据中获取摄像机的内部参数,外部参数和场景三维几何信息,有效地解决大规模三维重建中的光照一致性和几何一致性等问题,为当今应用需求提供了一套完备的解决...
  • 基于图像点特征的多视图三维重建

    千次阅读 2017-12-25 17:02:34
    基于图像点特征的多视图三维重建大致分成四步:一.图像特征点描述 ;二.图像特征点匹配; 三.基于图像的稀疏三维重建;四.多视图稠密匹配与三维重建 一.图像特征点描述: 为描述所检测到的图像特征点,通常提取特征...
  • 3D空间点与2D图像点的对应 其实是几个相似三角形,所以存在比例关系可以对应。...两视图几何——寻找最小配置解的意义 在计算F和E时为什么要寻找做小配置解(最少的对应点)? 图像匹配点中不可避免的存在外点
  • 写在前面感谢大家的一路陪伴与支持,这里赠送一张「3D视觉从入门到精通」知识星球优惠券,有效期两天,有需要的可以使用。三维重建技术是计算机视觉的重要技术之一,基于视觉的三维重建技术通过深度数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,696
精华内容 1,478
关键字:

多视图几何三维重建