marchingcubes算法主要是根据一个立方体每个顶点的数据来进行通过该立方体的表面进行重建的技术。这么说显得非常的抽象,实际上,简单来说,Marchingcubes就是用来重建出面的,通常这里的面是空间中物体的表面。
在SLAM 系统中,建图(或者通俗地称之为构建三维或者二维的场景模型)也是非常重要的一方面,在建图的过程中,有稀疏地图与稠密地图之分,稀疏地图通常可以用于位姿估计优化等等,而稠密地图则可以用来避障等。稠密地图另一个非常有趣的应用就是重构出环境的3D模型。例如双目SLAM系统搭载在一个机器人上,进入室内空间进行扫描拍摄,既可以重建出这个室内空间的3D模型。在重建模型的过程中,为了可视化重建的结果,通常我们可以采用MarchingCubes算法进行重建。但是具体怎么应用这一算法进行重建呢?
从SLAM 应用的视觉来看,marchingcubes主要是在位姿估计完成以后,将图片数据转换为空间中的坐标点,其中位置坐标可有图像中点转化到相机坐标系,进而通过位姿转化到世界坐标系(aka: 全局坐标系);颜色信息可直接有图像中某一点的像素颜色获得;法矢信息通常采用的办法是在图像中选取相邻点然后作外积。在这些坐标点的基础上使用marchingcubes算法进行三维重建。具体操作过程为:
input: 一堆空间点以及空间点的法矢以及空间点的材质(也可以视为颜色信息,通常一个float类型数据即可,通过位运算可转化为RGBA数据);
output: 三维模型
step1:分割空间为子空间,分割后的空间体素数据以数组或链表形式存储;
step2:计算空间中每个体素顶点的SDF或者TSDF;
step3: 线性插值得到体素与要重建的三维表面的交点,获得三角面片的坐标信息等;
step4: 将所有三角面片进行渲染得到三维模型或者将这些三角面片写入文件中(STL,PLY等格式均可);