BundleFusion学习笔记(3):主要算法(2)——模型重建

求完了位姿,我们就拥有了非常完整的数据,简直可以“为所欲为”了。

BundleFusion的模型重建用的这套方案不算新了(虽然也基本是这个作者做的工作)。

0. 前言

BundleFusion的模型重建部分涉及的主要概念有:

  1. Voxel体素
  2. TSDF数据结构
  3. VoxelHashing方法
  4. MarchingCube算法

先贴一些轮子:

  1. 基于体素的三维重建的核心思想——A Volumetric Method for Building Complex Models from Range Images 阅读笔记
  2. 基于体素的三维重建的最终结果——Marching Cubes算法学习笔记

1. Voxel体素

计算机视觉的第一章中就提到:二维空间中,我们使用像素Pixel描述数据,引申到三维,自然就变成了体素(voxel可能是volumn pixel的简写)。这是连续信号离散化思想在三维空间中的使用。

在BundleFusion的方法体系中,Voxel的数据结构(引自VoxeHashing)为:

struct Voxel {
	float sdf;
	uchar colorRGB[3];
	uchar weight;
};

这其中的sdf到底是什么呢?参考这篇文章中的一张图片:
在这里插入图片描述不妨把一个体素看成一个点A,光心为O,射线OA与等值面的交点为B,AB的长度就是sdf,如果A在等值面外,则sdf为正,反之为负。

但是现在我们先假设,一个立方体的三维空间被等分切割成了很多个小立方体,我们使用Voxel去表示这一个一个的小立方体,就像是一个三维矩阵,只不过矩阵中的元素是一个更为复杂的数据结构。

既然我们已经有了rgbd数据,相机位姿数据和内参,就可以通过三角化以及相机-世界坐标转换,把相应的数据写入体素中。

2. TSDF(truncated signed distance)

为了节省空间,提高效率,Curless和Levoy又提出了TSDF概念,即只存储观测面区域附近的sdf。

3. Voxel Hashing方法

三维空间的膨胀是很夸张的,一个长宽高为10m的立方体,体积是长宽高为1m的立方体的1000倍。如果我们每重建一个表面,都要在内存中分配一个能包括表面的立方体那么大的空间,显然是不合理的。(这一点也从tsdf-fusion的崩溃可以看出)

而哈希技术,天然适合随机存取和小范围的更新,使用在TSDF的存储上,正合适。

具体实现略过。

4. Marching cubes重建方法

从TSDF结构到最后的mesh结果,使用的是Marching Cube算法,这个算法老但实用,相关介绍见轮子基于体素的三维重建的最终结果——Marching Cubes算法学习笔记