当前位置: 代码迷 >> 综合 >> 3D重建 “Real-time 3D Reconstruction at Scale using Voxel Hashing“
  详细解决方案

3D重建 “Real-time 3D Reconstruction at Scale using Voxel Hashing“

热度:76   发布时间:2024-01-20 08:48:47.0

Real-time 3D Reconstruction at Scale using Voxel Hashing是一篇比较经典的实时3D重建的论文,这里介绍一些看了本文后的一些理解。

论文下载链接:https://graphics.stanford.edu/~niessner/papers/2013/4hashing/niessner2013hashing.pdf

  1. 论文的核心其实是采用了稀疏的哈希表来存储体素数据,从而减少了存储量和计算时间。体素Voxel的数据结构如下,其中sdf其实是TSDF,即截断带符号距离值,用于描述体素与物体表面的位置和距离关系,大于0表示位于物体和视角之间,小于0代表位于物体的后面;值越小表示离表面越近,可以从下面的两张图中分析。colorRGB表示体素颜色数据,而weight代表权重,越靠近表面的体素的权重越高。
    在这里插入图片描述
    在这里插入图片描述 在这里插入图片描述
  2. 论文中Hash的一些理解。首先Hash函数并不复杂,是使用世界坐标系下的坐标x, y ,z来计算hash值。当发生冲突时的解决策略是:首先有hash bucket的存在,相当于一个连续数组,有重复的就依次存进去;但是桶的大小也很难定,因为太大则浪费空间;太小则桶也太容易溢出,作者最后的结论是桶的大小为2时效率最高。那如果桶也溢出了呢?则利用了链表的方法,链接到别的桶里空的位置。因此Hash表中存储的内容HashEntry结构体里有offset这一项,就是用来存放链接指针的。
    查询Hash表的方法也很简单,算出Hash值,找到对应的桶,桶的逐个元素遍历,通过offset链接的元素也要遍历到,注意不能遍历到空的值就停下,因为重建过程中会删除一些HashEntry导致碎片的产生。遍历的过程就是比较世界坐标系是否相同,这也是HashEntry中要存在x, y, z坐标的原因。
    HashEntry中还有一项——pointer,就是指向第1点中的Voxel的。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 这一点依旧是关于Hash的,由于Hash表在存储的时候并不是连续存储,所以在遍历的时候就需要经历上面提到的遍历方式,这里作者给出了一种更方便的压缩方法,将所有有效的HashEntry集中到一个连续存储的数组中,然后再操作就有效率地多。使用一种并行前缀和的方法如下图。将位于视锥内的,不为空的HashEntry集中了起来,方便后面进行处理。
    在这里插入图片描述
  4. 表面提取。使用光线追踪(Raycasting)进行表面提取,简单理解就是,相机坐标系下从原点发出一条光线,看穿过某个像素点后会经过哪些体素,记录下这些体素中z坐标的最小值和最大值,其实就相当于进行了一个2.5D栅格化,这在激光雷达点云处理中是非常常见的点云压缩手段。
    得到z坐标最小与最大值之后,就可以从某一端开始遍历TSDF的值,显然由正变负(或由负变正,取决于遍历起始的方向)的就是那个坐标就是跨过表面的坐标。在求某一点的TSDF值的时候,使用了三线性插值,融合周边8个voxel的信息;遍历求表面位置的时候采用由粗到细的方式,一开始用一个较大的步长(TSDF中截断值的一半)得到粗值,然后用短步长精细化。

总体而言,我觉得文章写得很好,是我看的第一篇3D重建的文章,想到哪写到哪,也还是有诸多没搞懂的地方,接下来准备看一下著名的InfiniTAM的论文 Very High Frame Rate Volumetric Integration of Depth Images on Mobile Devices

  相关解决方案