基于深度相机的三维重建技术

2023-11-08

/*******************************************************************************************************************

本文转载自http://www.bugevr.com/zblog/?id=14,原创作者bugeadmin,

转载至我的博客,主要是为了备份,日后查找方便。谢谢原创作者的分享!

***********************************************************************************/

三维重建(3D Reconstruction)技术一直是计算机图形学和计算机视觉领域的一个热点课题。早期的三维重建技术通常以二维图像作为输入,重建出场景中的三维模型。但是,受限于输入的数据,重建出的三维模型通常不够完整,而且真实感较低。随着各种面向普通消费者的深度相机(depth camera)的出现,基于深度相机的三维扫描和重建技术得到了飞速发展。以微软的Kinect,华硕的XTion以及因特尔的RealSense等为代表的深度相机造价低廉,体积适当,操作方便,并且易于研究者和工程师进行开发。三维重建技术也是增强现实(Augmented Reality,简称AR)技术的基础,经过扫描重建后的三维模型可以直接应用到AR或VR的场景中。本文将简单介绍基于深度相机的三维重建技术的基本原理及其应用。


三维重建

简单地说,三维重建就是从输入数据中建立3D模型。其中,在面向消费者层面的深度相机出现以前,三维重建技术的输入数据通常只有RGB图像(图1左)。通过对物体的不同角度拍摄的RGB图像,使用相关的计算机图形学和视觉技术,我们便可以重建出该物体的三维模型。不过,早期的三维重建技术得到的模型精度往往较低,且技术的适用范围有限。消费者层面的深度相机的出现为三维重建技术提供了深度图像(depth image)数据,大大降低了重建的难度,并使得三维重建技术可以应用到几乎任何现实场景中(图1右)。由于基于深度相机的三维重建技术所使用的数据是RGB图像和深度图像,因此,这类技术通常也被称为基于RGBD数据的三维重建技术(D指代depth)。

  1.jpg

图1:基于RGB图像的三维重建,以及基于RGB图像和深度图像的三维重建


深度值和三维数据

在介绍基于深度相机的三维重建技术之前,首先需要了解深度图像中的数据的具体含义。对于现实场景中的点,深度相机扫描得到的每一帧数据不仅包括了场景中的点的彩色RGB图像,还包括每个点到深度相机所在的垂直平面的距离值。这个距离值被称为深度值(depth),这些深度值共同组成了这一帧的深度图像(图1右)。也就是说,深度图像可以看做是一副灰度图像,其中图像中每个点的灰度值代表了这个点的深度值,即该点在现实中的位置到相机所在垂直平面的真实距离。图2简单说明了RGB图像和深度图像的关系。

 2.jpg

图2: RGB图像和深度值

如图所示,对于现实场景中点M,深度相机能够获取其在RGB图像中的成像点XM,以及M到相机所在的垂直平面(即XY平面)的距离,这个距离便是M的深度值。以相机位置为原点,相机所朝方向为Z轴,相机的垂直平面的两个轴向为X、Y轴,可以建立相机的局部三维坐标系。另外,RGB图像到相机位置的距离正是相机的焦距。通过这些数据并使用简单的三角几何公式,我们很容易得到M在相机的局部坐标系中的三维坐标。于是,RGB图像中的每个点,都会对应一个在相机的局部坐标系中的三维点。因此,深度相机的每一帧的深度图像就相当于一个在相机的局部三维坐标系中的点云模型。


基于深度相机的三维重建的核心问题

如果输入的RGBD数据只有一帧,那么只需要把这一帧对应的点云模型作为重建的模型输出即可。不过,通常的深度相机的帧率(FPS)普遍较高,所带来的数据量是非常庞大的。以微软的Kinect v1为例,其FPS=30,即1秒钟扫描30帧,也就是1秒钟便可得到30张RGB图像和30张深度图像。每一帧图像的分辨率通常是640x480,那么在短短的1秒钟,深度相机得到的点云的点的个数是640x480x30=9216000。那么,如何在重建过程中处理如此庞大的数据?另外,深度相机所得到的深度数据是存在误差的,即使相机位置固定,现实场景中的点在不同帧中的深度值也会有区别 。也即是说,对于每一个现实中的点,在扫描过程中会得到众多“测量值”位置。那么,如何估计点的最终位置?这个问题可以被称为“从大数据中建立模型”问题(图3)。

 3.jpg

图3: 已知多角度拍摄的庞大的RGBD数据,如何获取重建模型(图片来自[1])

除了上述问题外,重建过程中还有一个关键性问题——相机位置的估计。首先,为什么需要估计相机位置?通过本文之前内容讲述的深度值的原理可知,每一帧深度图像对应的点云模型是在相机的局部三维坐标系中。因此,不同的相机位置(即不同帧)便对应着不同的局部三维坐标系(local space/coordinate frame)。然而,重建后的模型需要坐落在一个坐标系,即世界坐标系或全局坐标系(world/global space/coordinate frame)中。于是,我们需要找到每一帧的相机局部坐标系同世界坐标系的位置关系,也就是确定每一帧中相机在世界坐标系中的位置(图4)。在计算机视觉和智能机器人领域,这个问题是经典的“同步定位与地图构建”(Simultaneous localization and mapping,简称SLAM)中的定位问题:机器人在未知环境中,如何通过获取的周围环境的数据来确定自己所在的位置。

 4.jpg

图4: 如何估计不同帧中的相机位置


相机位置的估计

给定每一帧输入的RGBD数据,我们需要估计相机在世界坐标系中的位置。通常我们会把第一帧的相机位置当做是世界坐标系的原点,于是,我们需要估计的便是相机在此后每一帧相对于第一帧的位置的转移矩阵(transformation matrix)。使用数学语言描述是:在给定了第k-1帧重建的模型以及转移矩阵Tw,k-1,还有第k帧的输入RGBD数据,估计出第k帧的转移矩阵Tw,k(图5)。这里的w下标指代世界坐标系world,k是帧的编号,k>1。

5.jpg

 

图5: 估计新的一帧的转移矩阵


Newcombe 等人于2011年提出的三维重建的经典方法KinectFusion[1] 使用了迭代最近点(Iterative closest point,简称ICP)方法来解决以上问题。给定输入的原始数据(source)和目标数据(target),以及两者的数据点之间的对应关系(correspondence),ICP计算得到原始数据和目标数据之间的转移矩阵,该矩阵使得所有的目标数据点到其对应的原始数据点所在的切平面的距离之和最小(图6)。使用数学公式这个目标函数是:

 5-5.jpg

这里的si和di是原始数据点和对应的目标数据点,ni是si所在的切平面的法向量(图6右)。

  6.jpg

图6: ICP所实现的效果示意图以及相关参数的含义


为了给ICP算法找到合适的对应点,KinectFusion方法简单的将目标数据点——第k帧的数据点(图5中的黄色点)——通过转移矩阵Tw,k-1投影到原始数据点——第k-1帧的点(图5中的红色点),然后将两者作为对应相互对应的点。依照这种对应关系的ICP算法的最大优点是速度快,并且在扫描帧率较大,相邻两帧差别很小的情况下的精度很高。在估计了第k帧的转移矩阵后,将其作用到第k帧的在相机的局部坐标系的数据中,便可得到在全局坐标系中的数据。图7展示了典型的从输入数据(a),到估计相机位置并作用到数据上(b),然后到最终的优化之后的重建模型(c)的流程。

 7.jpg

图7: 新的一帧数据的处理流程


KinectFusion中的ICP方法仅仅使用了三维空间中的数据,并未考虑到RGB数据信息。另外,ICP必须要建立在扫描帧率较大,相邻两帧差别很小的前提下。因此,这种估计相机位置的方法存在较大的局限性,尤其是对存在较大平面的场景(如墙面、天花板和地板等)时,这种估计方法会带来很大的误差。KinectFusion之后的科研工作者们也提出了一些改进方法。例如,在估计相机位置时,同时考虑RGB信息和三维信息,并建立新的目标函数来进行优化[2]。另外,使用已定义好的模型来模拟代替较大平面的物体[3],可以很好的排除掉这类物体所带来的扰动。不过,考虑到实时性和稳定性,这种基于ICP的框架依然是非常经典且最常见的估计相机位置的方法。


从大数据中建立模型

从上文以及图7(c)可以看出,在估计了相机位置后,我们需要把新一帧第k帧的数据同已有的第k-1帧的模型数据结合起来,以输出优化后的模型。这其实就是本文在前面介绍的问题:对于每个现实场景中的点,如何从该点的众多“测量值”位置中估计出最终位置?

这里继续讲述经典的KinectFusion中所采用的方法。KinectFusion在世界坐标系中定义了一个立方体,并把该立方体按照一定的分辨率切割成小立方体(voxel)。以图8上为例所示,图中定义了一个3x3x3米的立方体,并把立方体分为不同分辨率的小立方体网格。也就是说,这个大立方体限制了经过扫描重建的模型的体积。然后,KinectFusion使用了一种称为“截断有符号距离函数”(truncated signed distance function,简称TSDF)的方法来更新每个小网格中的一个数值,该数值代表了该网格到模型表面的最近距离,也称为TSDF值(图8下)。对于每个网格,在每一帧都会更新并记录TSDF的值,然后再通过TSDF值还原出重建模型。例如,通过图8下两幅图中的网格的TSDF数值分布,我们可以很快还原出模型表面的形状和位置。这种方法通常被称为基于体数据的方法(Volumetric-based  method)。该方法的核心思想是,通过不断更新并“融合”(fusion)TSDF这种类型的测量值,我们能够 越来越接近所需要的真实值。

 8.jpg

图8: KinectFusion的立方体网格形式以及TSDF


KinectFusion中TSDF的更新方法核心思想就是简单的对所有的测量值加权平均的过程。这种更新方式效率高,对于保证实时三维重建非常有必要。基于体数据的方法简单直观,而且容易使用并行计算实现,因此可以极大的增加扫描和重建效率。另外, 使用计算机图形学中的网格生成相关方法(例如MarchingCubes),我们可以很容易从这种体数据的结构中生成三角网格模型,这对于进一步的研究和渲染非常重要。不过,这种方法也有很大缺点。例如,KinectFusion这种基于体数据的方法提前已经限定了扫描空间(例如图8上的3x3x3米),超过这个空间的显示场景的物体将无法重建,这是因为定义立方体和网格需要的内存空间非常大 。这就意味着,KinectFusion无法用来扫描大范围空间。另外,立方体中的所有的网格中的TSDF都需要记录,即便这个网格在现实场景中根本没有点,这就造成了极大的内存空间的浪费,并限制了扫描范围。针对这些问题,KinectFusion之后的科研工作者们也提出了一些改进方法。例如,一种移动式的体数据网格(moving volume)方法可以不断移动定义好的网格模型到新的场景中,并不断输出已经重建好的模型到本地空间中,从而能够无限扩展扫描空间[4](图9)。另外,一些重建方法使用了点云的数据结构来代替体数据结构,在重建过程中不断把密集的点云数据融合成一定密度的点云[5]。这种方式不需要存储场景中的并不存在的点,因此能够节省大量空间以扩大扫描范围。

  9.jpg

图9: 移动体数据网格的三维重建方法


参考文献

[1] Newcombe, Richard A., et al. "KinectFusion: Real-time dense surface mapping and tracking." Mixed and augmented reality (ISMAR), 2011 10th IEEE international symposium on. IEEE, 2011.

[2] Whelan, Thomas, et al. "Real-time large-scale dense RGB-D SLAM with volumetric fusion." The International Journal of Robotics Research 34.4-5 (2015): 598-626.

[3] Zhang, Yizhong, et al. "Online structure analysis for real-time indoor scene reconstruction." ACM Transactions on Graphics (TOG) 34.5 (2015): 159.

[4] Roth, Henry, and Marsette Vona. "Moving Volume KinectFusion." BMVC. 2012.

[5] Whelan, Thomas, et al. "ElasticFusion: Dense SLAM without a pose graph."Proc. Robotics: Science and Systems, Rome, Italy (2015).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于深度相机的三维重建技术 的相关文章

  • 三维刚体变换

    欢迎访问我的博客首页 三维刚体变换 1 坐标系 1 1 空间坐标系 1 2 右手坐标系与像素坐标系 2 旋转与平移 2 1 推导旋转 2 2 推导平移 2 3 推导变换 2 4 刚体变换 2 5 坐标系旋转与向量旋转 3 链式变换 4 Ei
  • ROS STAGE教程2(地图定义和GMAPPING建图)

    目前用在ROS Kinetic上的stage版本为4 1 官方教程http rtv github io Stage modules html 用户可以用stage或者gazebo来创建地图和机器人 传感器模型来进行仿真 并与自己的SLAM模
  • 从0.3开始搭建LeGO-LOAM+VLP雷达+小车实时建图(保姆级教程,小白踩坑日记)

    背景 SLAM小白 因为项目需要花了两天时间编译代码 连接雷达实现了交互 踩了很多坑 简单记录一下 让后面感兴趣的朋友少走点弯路 肯定有很多不专业的 错误的地方 还请大家不吝赐教 噗通 也可以见知乎 https zhuanlan zhihu
  • ROS激光SLAM导航理解

    ROS激光SLAM导航理解 注 最近学习ROS的激光导航知识 需要理清ROS的SLAM 环境感知 costmap 与导航算法 为防止自己忘记 将觉得有价值的内容收集于此 对AGV来说 SLAM是个大大坑 环境感知和局部运动控制也是大坑 学习
  • Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18 04 安装速腾聚创最新驱动RSLidar SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16 RS32 RSBP RS128 RS80 RSM1 B3 RSHELIOS等型号 注意 该教程旨在引导安装 可能现在
  • 各向异性(anisotropic)浅提

    文章目录 各向异性 anisotropic 定义 哪种物体具有各向异性反射 什么导致各向异性反射 总结 各向异性 anisotropic 定义 它指一种存在方向依赖性 这意味着在不同的方向不同的特性 相对于该属性各向同性 当沿不同轴测量时
  • 【论文翻译】Iterative Geometry Encoding Volume for Stereo Matching and Multi-View Stereo(CVPR 2023)

    一 论文简述 1 第一作者 Gangwei Xu 2 发表年份 2023 3 发表期刊 CVPR 4 关键词 立体匹配 MVS 几何编码体 GRU 3D卷积 5 探索动机 RAFT的全对相关体缺乏非局部几何知识 难以处理病态区域的局部模糊
  • 对最小二乘法的一点理解 - slam学习笔记

    我对最小二乘法的理解 在给定参数个数和函数模型之后 根据测试数据 找出与所有测试数据的偏差的平方和最小的参数 这里面应该有两个问题 1 为什么选取与真实数据平方和最小的拟合函数 2 如何求参数 为什么选取与真实数据平方和最小的拟合函数 极大
  • 视觉SLAM漫谈(二):图优化理论与g2o的使用

    视觉SLAM漫谈 二 图优化理论与g2o的使用 1 前言以及回顾 各位朋友 自从上一篇 视觉SLAM漫谈 写成以来已经有一段时间了 我收到几位热心读者的邮件 有的希望我介绍一下当前视觉SLAM程序的实用程度 更多的人希望了解一下前文提到的g
  • 【SLAM】libQGLViewer:VS 2019 + Qt 5.14.2 + Win 10 配置

    libQGLViewer 2 7 2 VS 2019 Qt 5 14 2 Win 10 配置 注意 这次配置没有完全成功 编译25个成功 一个失败 失败的是 qglviewerplugin qglviewerplugin 是一个可选控件 不
  • [SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL

    四元数定义 Hamilton vs JPL 简介 四种区分方式 Hamilton vs JPL 引用 不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中 都需要用到单位四元数 Quaternion 来表示旋转 主要是单位四元数表示旋
  • Sophus安装踩坑

    装SLAM十四讲第二版提供的Sophus Eigen版本3 4 0 报错 home ch 下载 Sophus 13fb3288311485dc94e3226b69c9b59cd06ff94e test core test so2 cpp 9
  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • 1-如何安装ROS

    如何安装ROS 大家好 我是如何 今天尝试在Ubantu下安装ROS Robot Operating System 测试环境 虚拟机VMware Ubantu20 04 准备步骤 添加ROS软件源 sudo sh c echo deb ht
  • GMAPPING的参数设置

    二 运行gmapping 我总结了运行gmapping的两种方法 1 基于命令行 rosrun gmapping slam gmapping scan scan delta 0 1 maxUrange 4 99 xmin 5 0 ymin
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • Eigen几何模块的使用方法

    include
  • Todesk突然高速通道使用已结束

    今天使用Todesk直接报出如下错误 好像对于海外用户需要付费购买海外会员 大家有没有什么可以替换的远程控制软件的吗 能分享一下吗
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • KITTI校准文件中参数的格式

    我从以下位置访问了校准文件KITTI 的部分里程计 http www cvlibs net datasets kitti eval odometry php 其中一个校准文件的内容如下 P0 7 188560000000e 02 0 000

随机推荐

  • Android Studio一个项目引入另一个项目作为依赖Libary

    声明 本教程不收取任何费用 欢迎转载 尊重作者劳动成果 不得用于商业用途 侵权必究 16年做的项目 因公司是某国企很注意保密 即有了奇葩要求不允许用svn git版本控制工具 所以就有了此篇文章的诞生 下面是我对以前笔记的整理 Androi
  • Linux 定时任务详解

    今天继续给大家介绍Linux基础知识 本文主要内容是Linux定时任务 一 Linux定时任务简介 计划任务是需要在指定时间执行的任务或者是周期性执行的任务 比如凌晨3点重启设备 每周对日志文件备份等 Linux系统会内置at和cron服务
  • sql的coalesce函数用法

    介绍 coalesce函数是sql里面极其实用的一个函数 具体用法如下 SELECT coalesce exp1 exp2 as info FROM table1 当exp1为NULL时 计算exp2 当exp2为空时 计算exp3 一直到
  • 历年阿里巴巴面试题集,蚂蚁金服Android面经!

    早在2017年我们就建了第一个进击BAT的Android开发进阶交流群 两年期间很多群友都分享了自己的Android面试经历 其中就有很多群友已经斩获蚂蚁金服 天猫 高德 盒马等阿里系offer 收集反馈的面经资料比较乱 最近疫情期间终于空
  • springboot之RestTemplate接口封装的示例分享

    转自 springboot之RestTemplate接口封装的示例分享 下文笔者讲述封装RestTemplate接口的示例分享 如下所示 实现思路 只需对RestTemplate方法进行相应的封装 即可实现HttpClient的效果 例 i
  • 1-3、安装Ubuntu和Windows双系统

    1 3 安装Ubuntu和Windows双系统 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 4 初稿 目录 文章目录 1 3 安装Ubuntu和Windows双系统 版本说明 目录 一 初衷 二 注意 三 制作启动盘
  • rsync备份同步文件

    一 介绍 Rsync具有可使本地和远程两台主机之间的数据快速复制同步镜像 远程备份的功能 cp scp等工具拷贝均为完整的拷贝 而rsync除了可以完整拷贝外 还具有增量拷贝的功能 官方文档 https www samba org ftp
  • 多线程(三)Thread 类及常见方法

    目录 一 Thread类的几个属性 属性 状态 getState 属性 ID和Name getId 和getName 属性 优先级 getPriority 属性 是否守护线程 isDaemon 属性 是否存活 isAlive 二 启动一个线
  • Jetbrains实用技巧汇总

    Jetbrains Tools 关闭 vim模式 菜单栏 tools gt vim emulator Jetbrains Tools 在启动时取消 打开最近关闭的项目 Settings gt System Settings取消勾选 Reop
  • MongoDB未授权访问漏洞验证与修复过程

    环境 Windows MongoDB3 2 文章目录 一 漏洞验证 1 使用MSF验证 2 使用nmap验证 二 修复 1 寻找配置文件mongod cfg Windows下 2 在 network interfaces 下插入以下代码 三
  • STC8--休眠唤醒

    0 休眠有两种 空闲模式和掉电模式 空闲模式是CPU不再运行 其他外设运行 掉电模式是所有设备不再运行 后者更省电 两种模式都通过PCON来设置 B0位置1进入空闲模式 B1位置1进入掉电模式 1 关于休眠后的唤醒 有两类 第一类是利用IN
  • qt creator编译报错:parse error

    qt creator编译报错 parse error 利用qt creator编译qt工程时 出现报错信息parse error 出现错误的文件是pri文件 出现这种错误 一般是pro或pri出现了语法错误 经过检查 发现我的报错原因是pr
  • 日语操作系统安装日语软件乱码的解放方案

    1 打开控制面板 時計 地域 地域 地域 管理 Unicode対応 言語 日本語 日本 按照以上步骤 既可解决日语系统 安装日语软件乱码的问题
  • CreateProcess error=740, 请求的操作需要提升

    再用Java程序启动本地程序时有时会出现CreateProcess error 740 请求的操作需要提升 这样的异常 此异常为Java程序权限不足以调动需要启动的程序 解决方法 用管理员方式启动IED工具 并运行程序
  • C#图书管理系统

    大二 C 程序设计 课程设计项目 包含完整 源码 设计文档 测试数据 答辩PPT 仅供参考 文章目录 登录 系统管理员 图书借阅 登录 系统管理员 图书借阅
  • (GCC)STM32CubeMX中s启动文件详解

    本文所使用工程由STM32CubeMX生成 使用芯片 STM32F103ZET6 基本只开了时钟 s文件内容如下 C COPYRIGHT 2017 STMicroelectronics file startup stm32f103xe s
  • lvds传输距离标准_带你了解LVDS技术

    LVDS Low Voltage Differential Signaling 低电压差分信号技术 一种定义了高速数据传输接口电路电气特性的通用技术标准 而非协议 因为协议是特定于应用程序的 LVDS标准工作组选择仅定义驱动器和接收器的电气
  • 【Web3】 Web3JS Pay Api

    Web3Network eth sendSignedTransaction serializedTx 参数 from String Number 发送帐户的地址 如果未指定 则使用web3 eth defaultAccount属性 或web
  • 菌群多样性分析报告

    参考链接https www docin com p 2107733531 html 在开始实验项目之前 明确实验流程 一步一步获取实验结果 以可视化工具展现结果 并加以生物学意义上的分析 获取完整的分析报告 下面给出菌群多样性分析报告中应包
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计