TextureMe:High-Quality TexturedSceneReconstruction in RealTime
1. Abstract
本文的工作:在线重建出高质量纹理的地图
- 创建TSDF模型,以及在mesh基础上,创建三角形纹理块
- 将颜色集成到贴片中,同时将深度图融合进TSDF中
- 不需要额外的 纹理图优化、网格参数、繁重的后处理
2. Introduction
背景
- 前人的TSDF模型很好,但若想表示更细节的纹理,需要增加体素网格数量,无疑增大了计算量
- Marching Cubes算法: 从TSDF模型中提取出mesh网格,mesh网格可以表示更加细节的颜色,但以往的方法都是通过插值来确定网格颜色,依然受制于体素网格数量
- Kinect相机可以捕捉到高质量的颜色信息,但是以往的方法都注重在提高3D模型的质量,忽略了颜色细节的重建
- 本文提出了一个全新的框架,同时创建一个 纹理地图 和 几何地图,全局纹理图+TSDF图
- 纹理地图:包括直角三角形(存储了该位置重建表面的颜色细节);Marching Cubes算法提取出的三角形映射到RGB图上得到texture patches三角块;texture patches再集成到纹理地图上
- texture fusion的比较:
- TF和本文的实现目标手段相同,都建立了纹理地图和几何地图;
- 本文和TF重建的几何模型都是体素模型,但是,TF中每个体素只对应一个纹理,而本文对纹理的划分不仅局限在体素尺度上;
本文贡献
- 本文提出了基于纹理块的多尺度优化,让纹理块能更加高效对齐
- 本文提出一个TSDF 过滤器,防止三角形进行不必要的链接或者更新,进而使得纹理块的更新更加稳健
- 重采样算法,当三角形间的链接关系发生变化时,新全局纹理地图
- 提出一种考虑模糊程度加权方案来更新全局纹理
3. System Overview
- TSDF模型用Kinectfusion的流程,并修改了KF中ICP,加上颜色信息
- 获取全局纹理地图,局部纹理地图,并融合
- Marching Cubs算法从TSDF模型中提取mesh(三角形网格)
- 从当前帧中提取纹理块(纹理块表示了mesh网格的位置颜色)
- 利用当前帧纹理块来update全局纹理地图
- 本文的核心是纹理块的 表示、存储、建立、更新,融合到全局纹理
- Section 4 : 纹理块的表示和存储
- Section 5 : 纹理块的更新、减少mesh网格连接方式的变化
- Section 6 : 在纹理块更新前,为了避免漂移误差对重建的影响而进行的优化
4. Texture Atlas Representation
为了实现实时处理,本框架需运行在GPU上,所以需要让 纹理块 的数据结构便于并行处理
4.1 纹理块和全局纹理地图的表示
-
纹理块==(texture patch)==: 一个纹理块表示全局mesh网格中的一个三角区域,存储了该三角形区域的颜色、位置信息;为了存储效率,被设置为直角三角形???
-
全局纹理地图==(texture atlas)==:
-
相当于全局所有纹理块的目录
-
是一张由许多直角三角形组成的图片,mesh网格中每一个三角形都对应全局纹理地图中唯一的直角三角形
-
每个直角三角形在图中的位置为该纹理块的索引
-
4.2 存储和管理纹理块
- 由TSDF获得mesh,对mesh中每一个三角形新建纹理块
- 一个体素所能对应的三角形个数是有限的,由Marching Cubes算法得到mesh,本文一个体素最多对应5个三角形
- 为了节省空间,用栈动态存储所有未被使用的纹理块对象
- 随着重建过程(KinectFusion)的进行,全局mesh网格随之变化,必然新纹理块会产生,旧纹理块会被替代
- 将所有新建的纹理块的索引放入栈freelist中
- 判断新纹理块的质量,
- 如果质量好,则从freelist中POP出去
- 如果质量不好,或者要被替代,则释放纹理块的空间,并将其索引PUSH到栈中
- 总结:
- 首先,只要TSDF模型中纳入了新的体素,就要为此体素新建纹理块,并加入全局纹理地图中
- 相反,如果相机重复访问了TSDF中某一片区域,
- 当两次访问所提取纹理块数量、形状、位置不一样时,那这片区域所对应的旧纹理块对象被释放,对应的索引PUSH到free list,创建新的纹理块,加入全局纹理地图
- 当两次访问所提取纹理块数量、形状、位置一样时,保留、更新旧纹理块(相当于只更新了颜色)
- 在 Section5.4 中会详细讨论新旧纹理块间如何更迭
5. Texture patch Fusion
本节展示如何从RGB图像提取纹理块、加权融合至全局纹理图中的纹理块
值得注意的是,加权融合的方法考虑了图像模糊度,以及介绍了一种处理mesh网格频繁变化的方法
5.1 从当前帧提取纹理块
- 当前帧 k k k 对应mesh网格模型为 M k \mathcal{M}_{k} Mk , 对 M k \mathcal{M}_{k} Mk中**每一个三角形新建纹理块 T k ′ T_k' Tk′ **
- 利用当前帧的位姿 Q k \mathcal{Q}_{k} Qk 将每个纹理块 T k ′ T_k' Tk′ 投影到当前帧的RGB平面( C k \mathcal{C}_{k} Ck)上来确定 T k ′ T_k' Tk′ 中每个纹理块的颜色
- 利用三角形的重心坐标来确定纹理块的颜色
5.2 更新全局纹理图中的纹理块
-
前面对当前帧新建的一个纹理块 T k ′ T_k' Tk′ ,要与与 上一帧重建好的纹理块 T k − 1 T_{k-1} Tk−1融合,
-
首先比较包含 T k ′ T_k' Tk′ 的体素和包含 T k − 1 T_{k-1} Tk−1的体素
- 如果对应的纹理块数量和类型相同,直接进行下一步(进行颜色的更新)
- 如果对应的纹理块数量和类型不相同,则在全局纹理图中重新采样 T k − 1 T_{k-1} Tk−1
- 如果 T k ′ T_k' Tk′对应到全局纹理块区域为空的怎么办???
-
T k − 1 T_{k-1} Tk−1 代表了截止到上一帧某三角面的颜色细节信息,用公式(1)来加权平均 T k − 1 T_{k-1} Tk−1和 T k ′ T_k' Tk′
-
T k = W k − 1 ⊙ T k − 1 + W k ′ ⊙ T k ′ W k −