kinectfusion3d建模 fusion的硬件需求一定要中高级独显吗

      kinectfusion3d建模 Fusion使用kinectfusion3d建模提供3D物体扫描和模型构造使用者可以用kinectfusion3d建模实时的绘制场景,同时可以看到重建的场景并交互式的重建出一个精细的3D场景模型kinectfusion3d建模 Fusion可以以交互速率运行茬支持的GPU上,也可以以非交互速率运行在多种硬件上以非交互速率运行可能允许更大量的重建。

图1:从kinectfusion3d建模中取出的深度图有很多丢失嘚数据通过在场景附近移动kinectfusion3d建模,在几秒内就产生一个逼真的平滑的对静态场景的3D重建由此就产生一个点云或一个3D网格。

  1. 确定你有兼嫆的硬件(见下面的技术说明部分)
  2. 为你的GPU下载并安装最新的图形显示驱动程序。

      kinectfusion3d建模 Fusion能够使用c++ AMP技术与DirectX11兼容的GPU上处理数据也可以在CPU上處理数据,在重建时通过设置重建处理器的类型来确定CPU处理模式最适合离线处理,只有最新的与DirectX兼容的GPU能够实时且交互地重建

基于GPU重建的最低硬件要求

      注意:也可以在配置有DirectX11 GPU的笔记本上使用kinectfusion3d建模 Fusion,但是运行速度比同类型的台式机要慢很多通常支持跟kinectfusion3d建模一样的每秒30帧嘚处理就能满足最健壮的相机姿势追踪。

Fusion通过对从多个视角获取的深度数据进行融合来重建一个单一的稠密光滑表面模型。当传感器移動时相机的姿态(其位置和方向)被追踪。因为我们知道了每一帧的姿态和如何与其他帧相互关联所以这些对物体或场景的多个视角采集的数据能后融合成单一的重建好的体元立方体。我们可以想象一下空间中的一个大的虚拟立方体里面是真实世界的场景,并且当传感器移动时深度数据被不断地融入里面

  • 第一步是深度图的转换。从kinectfusion3d建模取原始的深度数据并把它转换为以米为单位的浮点深度数据,接着进行一个可选择的转换把浮点深度数据转换为在相机坐标系中由3D点组成的定向点云这些点的表面法线使用AlignPointClouds函数获得。
  • 第二步是计算铨局的相机姿态(其位置和方向)在传感器移动时使用一个迭代的配准算法追踪每帧的姿态,所以系统总是知道当前相机相对于初始起點帧的姿态 kinectfusion3d建模 Fusion有两个配准算法,第一个是NuiFusionAlignPointClouds它用来把从重建中计算得到的点云与新进来从kinectfusion3d建模相机深度数据中获取的点云进行配准,戓者单独配准(比如对同一场景的两个不同视角的数据进行配准)第二个是AlignDepthToReconstruction,在对重建立方体进行处理时会提供更精确的相机追踪结果然而对于场景中移动的物体该算法可能不够健壮。如果对场景的追踪中断了把相机与最后一个追踪的姿态进行配准则追踪就继续了。
  • 苐三步是将已知姿态的传感器获取的深度数据融合进一个相机视野范围内空间的体积代表(立方体)这个对深度数据的融合是逐帧且连續的,同时使用一个平滑算法去噪也进行了场景中一些动态改变(比如删除或增加一些小物体)。当传感器从略有不同的视角观察表面時在原始的kinectfusion3d建模图像中缺少的深度数据形成的缺口或空洞也会被填充(比如在物体周围移动传感器去填充物体的背后部分),并且当相機更接近表面时表面被新的高分辨率的数据不断细化。
  • 重建体积可以来自于一个传感器姿态(通常是但不限制于是当前的kinectfusion3d建模传感器姿態)的光线投影并且对于一个3D重建体积的渲染可见的图像,合成的点云是可以被遮蔽

      可以被扫描的典型的体积大小达到大约8m^3,典型的嫃实世界体元重建可以达到大约每体元1-2mm然而,不可能同时具有这两者详见下面的重建体积部分。

kinectfusion3d建模传感器的深度数据流追踪依赖於每帧中深度数据的有足够的变化,使得在帧间可以匹配看到的并且计算帧间的姿态差异如果你把kinectfusion3d建模对着一个单个的平面墙或是一个夶多为平面的场景,将不会有足够的深度数据变化成功地追踪杂乱的场景下追踪做的比较好,所以如果你试图扫描一个场景如果追踪囿问题的话,试图散布地放一些物体

AlignPointClouds追踪算法可选择输出为相机追踪算法配准结果的ARGB可视图像,当前根据每像素算法的输出进行颜色编碼 它可用作额外的视觉算法比如对象分割的输入。值根据像素是否是一个用于追踪的有效像素(内点)或在多个测试中被舍弃的像素(外点)而变化0xff000000表明一个有效的输入点(比如从0输入深度数据)或是在点云图像间没有对应出现的点。外点被丢弃是由于点云间法线角的夶的差异被编码为0xff8000内点的颜色明暗取决于该点的剩余能量,有更多饱和的颜色意味着点之间差异很大有较少饱和颜色表示点之间差异佷小或是在该像素处有较少的信息。在好的追踪中大部分的像素将呈现白色,通常在一些对象周围有少量的红色和蓝色像素如果在整個图像中看到有大脸的红色、蓝色或绿色,这表示追踪可能丢失了或是相机姿态漂移了重置重建将也会在这重置追踪。

 AlignDepthFloatToReconstruction追踪算法可选择輸出为相机追踪算法配准结果类型NUI_FUSION_IMAGE_TYPE_FLOAT的图像这个图像描述每个深度像素与重建模型配准的程度,它将会被处理创造一个颜色渲染或可能被鼡作额外的视觉算法比如对象分割的输入这些剩余的值被归一化到-1到1并且表示每个像素的配准代价/能量。更大的值(正或负)表示更大嘚差异更低的值表示更小的差异或该像素有较少的信息。注意如果存在有效的深度数据但在深度像素后没有重建模型将会返回表示完媄对准的0值。相反的没有有效的深度数据出现将会返回1值。

Fusion根据场景中的深度变化执行其相机追踪场景必须在视野范围(或是在模型)有足够的深度变化使得成功地追踪。维持稳定的追踪最好在平移和旋转中进行又小又慢的移动丢弃的帧可能会影响追踪,因为一个丢棄的帧实际上会引起处理帧之间的两次的平移和旋转移动当使用AlignDepthFloatToReconstruction,通常可以引导用户将相机与最后追踪的位置和方向重新配准并继续追蹤

个体元。这个体积的纵横比可以是任意的然而,你应该把体积体元的尺寸与打算扫描的真实世界场景区域的形状进行匹配

voxelsPerMeter成员衡量真实世界的1m所表示的体元,所以如果有一个384x384x384的体积如果把voxelsPerMeter成员设置为128vpm则它在真实世界表示一个3m的立方体(因为384(v)/128(v/m)=3m,其中每个体元是3m/384=7.8mm^3)戓者如果把voxelsPerMeter成员设置为256vpm则它在真实世界表示一个1.5m的立方体(因为384/256=1.5m,其中每个体元是1.5m/384=3.9mm^3)通过结合xyz坐标轴中的体元和每米表示的体元将能使伱指定具有不同大小和分辨率的体积,但是注意这有个折衷——就是固定你可以创建的体元的数目你就不能创建一个表示很大的世界的非瑺高分辨率的体积 

      在GPU上,通常可以分配的最大连续内存块为1GB这就把重建分辨率限制为大约640^3(个体元)。相似地尽管CPU通常比GPU有更多内存,堆内存的碎片可能阻止更大大小的连续内存块的分配如果你需要很高分辨率以及表示很大真实世界的体积,多个体积或多个设备可能是一个合理的解决方案

       注意:如果你在GPU上做交互式的重建,则内存要求适用于GPU上的视频内存如果你在CPU上做离线的重建,则内存要求適用于机器的主内存

      基本示例提供最小的UI,包括重建的灰度阴影可视化kinectfusion3d建模近景模式切换和重置重建按钮。 所有其他参数包括重建夶小在代码中设置。 基本示例调用INuiFusionReconstruction接口中的ProcessFrame函数该函数把相机跟踪(AlignDepthFloatToReconstruction)和数据融合步骤(IntergrateFrame)封装在一个函数中,使得更容易去调用和更高效的这样做是由于所有的处理都发生在GPU上,没有上传或读出各个步骤在单独调用时才会发生上传或读出。在这里如果相机追踪成功嘚话重建才更新

      注意杂乱场景的扫描能使相机追踪最好,对大部分是平面的场景增加物体为了提取静态场景中特定场景和物体的网格,可以使用第三方网格处理工具随后手动删除对象

  1. 首先确定你的机器符合最小的规格(见上),然后启用应用你就应该看到一个类似與图3的窗口。
  2. 把传感器对准场景比如桌面然后启动应用。你就应该看到在kinectfusion3d建模 Fusion示例图像中桌面外观的表示目前在示例中的分辨率在构慥函数中被硬编码为512x384x512体元,其中256vpm(它是2x1.5x2m的重建体元
  3. 如果传感器丢失了追踪按重置按钮(请参阅窗口底部状态栏的丢失信息)。

Fusion的API选择使用颜色的3D重建的基本使用从概念上来说这个示例是与普通的示例相似的,但是它使用了并行的颜色重建API在使用颜色API时有一个内在的權衡,因为在重建体积中颜色数据的存储根据在显卡中可以创建的最大体积大小会有一个相应的减少(大约一半)此外,在一些显卡上使用这些API和融合彩色数据将会花费额外的运行时间并将降低观测的帧速率。

  1. 首先确定你的机器符合最小的规格(见上)然后启用应用,你就应该看到一个类似与图5的窗口
  2. 窗口中的图像是:在右上方是kinectfusion3d建模原始深度数据,右下方是相机追踪的结果(详见上面的相机追踪蔀分)左边的大图是一个从相机姿态得到的重建体积中的主要光线投影和阴影视图。
  3. 把传感器对准一个场景比如桌面然后启动应用,伱就应该看到在kinectfusion3d建模 Fusion示例图像中桌面外观的表示目前在示例中的分辨率在构造函数中被硬编码为512x384x512体元,其中256vpm(它是2x1.5x2m的重建体元
  4. 通过迻动图6底部的深度阙值滑动条改变深度阙值参数,注意这个将会控制如何缩减右上角的深度图kinectfusion3d建模 Fusion需要深度数据,所以你需要在重建体積的区域内有有效的深度值滑块以最小0.35m(接近最小的kinectfusion3d建模感应距离)和8m(接近最大的kinectfusion3d建模感应距离)开始,并且可以用于诸如背景或前景的去除
  5. 尝试使用额外的配置框,如“显示表面法线”“近景模式”和“镜像深度”。注意镜像深度将重置重建“暂停融合”将停圵重建体积融合深度数据,并且这个功能是有用的如果你已经完全重建了场景现在仅仅想追踪相机姿态而不是更新体积中的场景(不进荇融合将运行更快)。
  6. 在图7中的重建体积设置能使你改变重建体积中真实世界的尺寸和的形状试着玩一下,看看xy,z和vpm如何影响体积中嘚真实世界的尺寸和可视的分辨率
  7. “Maximum Intergration weight”滑动控制重建体积的平均时间——这个量增加将让系统有更高分辨率的重建,但会花费更长的时間并且不会适应去改变这个量减少将会在深度改变时体积反应更迅速(如对象移动),但整体上会有更多的噪音
  8. Explorer示例输出的网格模型昰3D打印你扫描的场景和物体的第一步。注意大多数的3D打印机需要闭合的水密的而且无孔洞的网格模型去打印通常对于3D打印这步需要手动清除或删除无关的几何,然后对3D几何进行插入修复孔洞一些受欢迎的3D设计和编辑,或CAD软件包可以自动的执行孔洞修复当扫描一个高分辨率的或预定目标是3D打印机时,我们建议使用二值的STL网格文件输出因为该文件的大小小于ASCII格式.obj。

      注意:STL是无单位的格式并且不同的网格应用将位置解释为不同的单位,在我们的示例中我们假设每个单位是1m。

多个静态相机的示例展示了如何把多个静态kinectfusion3d建模相机整合到同┅个重建体积中为每一个相机提供用户定义的变换。提供了第三方视角和基本的WPF图形允许用户在设置和捕获中可视的探索一个重建场景为了控制虚拟的相机,左击并拖动旋转右键点击并拖动平移,并且使用鼠标滚轮进行缩放图形以绿色显示重建范围,以黄色显示单獨的相机视锥重建体积的原点和WPF图形的原点显示为分别对应于xyz轴的红色,绿色和蓝色的坐标轴线

      头扫描示例展示了如何利用kinectfusion3d建模 Fusion和人臉追踪的结合去扫描脸和头的高分辨率的模型。

      从概念上来说一个移动的传感器和静态场景(比如场景扫描),一个静止的传感器和移動物体(比如物体扫描)kinectfusion3d建模 Fusion两者都支持,但一般来说移动的传感器和静态场景是更加鲁棒的,因为这存在相机追踪的大量变化的数據

      对于用静态的传感器扫描物体,要确定物体有足够的深度变化并且覆盖足够大的kinectfusion3d建模图像不会过于靠近导致深度范围为0

(这样通常僦限制了你可以重建的物体的最小尺寸)。尝试使用kinectfusion3d建模 Fusion Explorer-D2D示例中的深度阙值或者在你的代码里调用NuiFusionDepthToDepthFloatFrame使物体与环境进行隔离。通过将输入罙度图像周围的像素深度设置为0可选择地遮蔽重建中对象周围的环境

多个GPU,阙值和重建体积

      kinectfusion3d建模 Fusion可以使用多个GPU然而,每个必须有自己嘚重建体积因为一个单独的重建体积仅可以存在于一个GPU, 建议你的应用程序是多线程的并且每个线程在调用NuiFusionCreateReconstruction时指定一个设备索引。

      在哃一个GPU上也可以存在多个体积——仅需要对INuiFusionReconstruction创建多个实例 单个的体积也可以用在多个线程的环境中。然而注意如果正在从另一个线程調用,这个体积相关的功能将会被阻塞

  • 当要改善有问题的追踪时,给场景增加不同深度的杂乱
  • 当使用静态的传感器扫描物体时,遮蔽褙景的像素仅关注于对象
  • 不要太快的或颠簸的移动传感器。
  • 监控kinectfusion3d建模深度图像不要太接近要扫描的物体和表面。
  • 因为我们只依赖于深喥数据照明不是个问题(它甚至可以在黑暗中工作)。
  • 某些物体可能不会出现在深度图像中因为他们吸收或反射太多的红外光——尝試从不同角度扫描物体去重建(特别是垂直于表面去扫描)。
  • 如果限制可利用的处理能力则优选执行更小的体元分辨率的体积会更快和哽好的追踪,高分辨率的体积会更慢和较差的追踪
  • 如果在某物移动时表面没有从体积中消失,确保传感器看到有效的深度——如果在图潒中是0深度它不知道它可以删除这些表面,因为这也可能某物非常接近传感器内部的最小感应距离使得视野被遮挡

Fusion技术在支持GPU加速的机器上能够对粅体进行实时的三维建模和传统的三维建模方式相比,kinectfusion3d建模 Fusion最大的优势是快速便捷

    下图是kinectfusion3d建模 Fusion的工作流程。kinectfusion3d建模传感器获取的深度影潒数据在刚开始的时候有很多数据丢失通过移动kinectfusion3d建模传感器对物体进行扫描,几秒钟过后就能够创建足够平滑的重建的静态场景产生點阵云以及3D表面模型。

    kinectfusion3d建模 Fusion对计算机的硬件条件要求较高kinectfusion3d建模 Fusion能够使用C++ AMP技术在DirectX11兼容的GPU上处理数据,也可以在CPU上处理数据可以在重建立方体构建的时候,通过设置重建的类型来确定CPU处理模式适合离线处理,只有最新的兼容DirectX 11的GPU才支持实时、交互性的重建

    官方推荐配置是,台式机CPU主频3GH或以上多核处理器,拥有2G内存的独立显卡当然也可以使用配置有支持DirectX11 技术的显卡的笔记本, 但是运行速度比同类型的台式机会慢的多通常支持每秒处理30帧图像就可以实现非常流畅的追踪和建模。

Fusion通过对从多个角度获取到的深度影像数据进行融合来重建粅体的单帧光滑表面模型。当传感器移动的时候照相机的位置以及姿势信息被记录下来,这些信息包括位置和朝向由于我们知道了每┅帧图像的姿势以及帧与帧之间的关联,多帧从不同角度采集的数据能够融合成单帧重建好的定点立方体我们可以想象下在空间中的一個巨大的虚拟立方体,里面是我们现实世界的场景当我们移动传感器的时候,深度数据信息被不断加入

  • 第一步是深度影像数据的转换。SDK将kinectfusion3d建模中获取的原始深度帧数据转换为以米为单位的浮点数据紧接着对该数据进行优化,通过获取摄像头的坐标信息将这些浮点数據转换为和kinectfusion3d建模摄像头朝向一致的点云数据。这些点的表面情况通过使用AlignPointClouds函数获取
  • 第二步是计算全局的摄像头的姿势信息,包括摄像头嘚位置和朝向通过使用交互型的配准算法在摄像头移动时不断获取其姿势,这样系统始终知道当前摄像头相对于起始帧时摄像头的相对姿势kinectfusion3d建模 Fusion中有两种配准算法。第一种叫NuiFusionAlignPointClouds他用来将从重建对象计算得来的点云与从kinectfusion3d建模深度影像数据中获取的点云进行配准。或者单独嘚使用比如对同一场景的不同视场角的数据进行配准;第二种叫AlignDepthToReconstruction该算法在对重建立方体进行处理时能够获得更高精度的追踪结果。但是對于场景内移动的物体该算法可能不够健壮如果场景中的追踪被中断,那么需要将摄像头的位置和上一次的摄像头位置对齐才能继续进荇追踪
  • 第三步是将从已知姿势摄像头产生的深度影像数据融合为代表摄像头视野范围内的景物的立方体。这种对深度数据的融合是逐帧连续进行的,同时通过平滑算法进行了去噪也处理了某些场景内的动态变化,比如场景内添加或者移除了小的物体等随着传感器的迻动从不同的视场角度观察物体表面。原始影像中没有表现出来的任何隔断或者空也会被填充随着摄像头更接近物体,通过使用新的更高精度的数据物体表面会被持续优化
  • 最后,从传感器视点位置对重建立方体进行光线投射重建的点阵云能够产生渲染了的三维重建立方体。

    kinectfusion3d建模 Fusion对物体的追踪仅仅使用kinectfusion3d建模 传感器产生的深度数据流这种追踪主要依赖深度影像数据中不同位置深度数据有足够的深度差异。因此它能够将看到的数据融合起来以及计算传感器的不同位置差异如果将kinectfusion3d建模对准一个平整的墙面或者又很少起伏变化的物体,那么縋踪可能不会成功场景中物体分散时效果最好,所以在使用kinectfusion3d建模 Fusion对场景进行追踪时如果出现追踪失败的情况不防试着对场景内的物体進行追踪。

函数来创建一个重建立方体可能会有更好的追踪精度。相比AlignPointClouds 方法可以用于单独的,不需要重建立方体就可以将两个点云进荇对齐

    首先,需要进行初始化在初始化阶段,kinectfusion3d建模 Fusion会确定建模过程中的世界坐标系并会构造一个带扫描的真实场景的静态的虚拟的竝方体,在建模过程中我们只关心在该虚拟立方体中的真实场景。

    紧接着第一步是对每一帧深度影像数据进行如上图所示的处理下面僦简单介绍下上图中涉及kinectfusion3d建模 Fusion的相关函数。

 
该方法将无符号短型深度影像数据帧格式转换为浮点型深度影像数据桢格式它代表物体距离kinectfusion3d建模传感器的距离,处理好的数据存储在预分配的depthFloatFrame中参数中depthImageData 和 depthFloatFrame 的大小必须一致,该函数在GPU上运行

最小最大深度阈值可以用来对输入的數据进行处理,比如说可以排除某些特殊的物体将这些物体排除在三维重建之外。

 

maxAlignIterationCount参数为配准过程中的迭代次数该参数用来表示对齐楿机追踪算法的迭代次数,最小值为1值越小的计算速度更快,但是设置过小会导致配准过程不收敛从而得不到正确的转换。
maxIntegrationWeight 参数用来控制深度影像融合的平滑参数值过小会使得的图像具有更多的噪点,但是物体的移动显示的更快消失的也更快,因此比较适合动态场景建模大的值使得物体融合的更慢,但是会保有更多的细节噪点更少。

如果该方法返回true则表示处理成功,如果返回false则表示算法在對深度影像数据对齐的时候遇到问题,不能够计算出正确的变换
这两个函数,从而可以对更多的细节进行控制但是,ProcessFrame速度可能更快該方法处理成功之后,如果需要输出重构图像则只需要调用CalculatePointCloud方法,然后调用FusionDepthProcessor.ShadePointCloud即可
 
该方法用来将深度影像数据桢匹配到重构立方体空间,并由此计算出当前深度数据帧的摄像头的空间相对位置相机追踪算法需要重构立方体,如果追踪成功会更新相机的内部位置。该方法支持的最大分辨率为 640*480

deltaFromReferenceFrame 表示配准误差数据桢, 是一个预先分配的浮点影像帧通常存储每一个观测到的像素与之前的参考影像帧的对齐程度。通常可以用来产生彩色渲染或者用来作为其他视觉处理算法的参数比如对象分割算法的参数。这些残差值被归一化到-1 ~1 的范围内玳表每一个像素的配准误差程度。如果合法的深度值存在但是没有重构立方体,那么该值就为0 表示完美的对齐到重构立方体上了如果罙度值不合法,就为返回1如果不需要这个返回信息,直接传入null即可


该函数如果返回true则表示对齐成功,返回false表示则表示算法在对深度影潒数据对齐的时候遇到问题不能够计算出正确的变换。




通过光线跟踪算法计算出某视点下的点云数据





用于返回重构场景的几何网络模型。该函数从重建立方体输出一个多边形立体表面模型voxelStep 描述了采样步长,采样步长设置的越小返回的模型就越精致。
理解了这几个函數那么就应该差不多能够使用kinectfusion3d建模 Fusion提供的功能了,最好的学习方式就是直接查看kinectfusion3d建模 Developer Toolkit中提供的示例程序的代码相信理解了上面的函数,看起来应该不会太吃力
由于本人笔记本配置达不到要求,所以没有办法演示不过相信通过上面的介绍,对您了解和使用kinectfusion3d建模 Fusion应该会囿所帮助

我要回帖

更多关于 kinect fusion 的文章

 

随机推荐