BundleFusion学习笔记(3):主要算法(2)——模型重建
求完了位姿,我们就拥有了非常完整的数据,简直可以“为所欲为”了。
BundleFusion的模型重建用的这套方案不算新了(虽然也基本是这个作者做的工作)。
0. 前言
BundleFusion的模型重建部分涉及的主要概念有:
- Voxel体素
- TSDF数据结构
- VoxelHashing方法
- MarchingCube算法
先贴一些轮子:
- 基于体素的三维重建的核心思想——A Volumetric Method for Building Complex Models from Range Images 阅读笔记
- 基于体素的三维重建的最终结果——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算法学习笔记