TextureMe论文阅读
介绍
高质量的纹理建图一般都是离线的后处理步骤,在这篇文章中,提出一种实时的联合恢复3D几何表面和高质量纹理。核心方法是创建与TSDF零交点相关联的三角形。
虽然基于TSDF重建,使用有噪声的深度图融合,也能得到干净的表明,但传统的TSDF一个体素只能存储一个颜色值,要表示精细的表面颜色,那么就需要微小的体素,并需要大量的内存。通过Marching Cubes 可以从一个体素获得多个三角形,一般传统的方法通过对相邻体素插值来获得详细的三角形的颜色,因此受限于体素的分辨率。为了解决这个问题,提出了离线的纹理贴图方法,因为通过融合颜色图的方法来获得纹理图一般会受颜色图的位姿漂移影响,所以先前方法尝试取优化相机位姿和纹理图位置来获得高质量的纹理贴图。
我们提出一个框架TextureMe,从RGB-D图像序列联合创建一个高质量的纹理地图和表面几何。其核心idea是 维护一个全局的纹理地图集 ** 其由直角三角形组成,我们称纹理patch,存储重建表面的三角形的颜色细节**。对Marching Cubes获得的三角形映射到当前帧得到纹理patch,然后整理纹理patch到全局纹理地图集中。
本文贡献点概述:
- 提出一个实时的同时重建几何和纹理的3D重建框架,没有采用任何后处理步骤;
- 我们的方法值利用了颜色图,构建和更新一个全局纹理地图集;
- 处理纹理patch不对齐,网格连接更新,纹理patch更新等问题;
相关工作
系统概述
TextureMe的几何重建模块是基于KinectFusion的,并且融合RGB信息,使用光度误差和几何误差来估计当前帧的位姿,虽然使用当前帧的位姿和深度图来更新TSDF模型。
为了重建纹理块,网格模型是必要的。TSDF是暗含表面的表示方法,因此我们使用Marching Cubes去获得包含零点的三角形,然后使用位姿映射这些三角形到当前帧,来获得关联的详细颜色,然后在当前帧构建纹理块,使用纹理块去更新全局纹理地图集,当前帧的纹理块与全局纹理地图集中对应的纹理块进行平均更新。
TextureMe的核心是在全局纹理地图集中有效地表示,存储,构建,更新纹理块。接下来就第4节介绍纹理块的表示和存储,第5节介绍纹理快的构建和更新,第6节介绍优化误对齐的纹理块。
纹理图集表示
纹理块 是一个带有详细颜色信息的直角三角形,存储在纹理地图集中。
纹理地图集 纹理图集是存储了一组直角三角形纹理块的大型图像,在重建开始之前,预先为纹理地图集分配显存,同时,通过将纹理图集均匀划分为直角三角形,预先计算纹理图集中每个纹理块的顶点的UV坐标,预先定义一个最小纹理块的大小,它可以存储从输入的彩色图像中可能的最大纹理细节。具体来说,将体素投影到当前的彩色图中,来计算纹理块的直角三角形大小。
存储 我们从零交叉体素中生成三角形并分配一个唯一的纹理块索引,当一个体素第一次表示一个表面时,给他创建一个纹理块,然后存储在纹理图集中。设定每个体素最多能提取出 n t r i n_{tri} ntri个三角网格,假设当前整个体积有 n v n_v nv,那么就要给纹理图集分配 n t r i × n v n_{tri} \times n_v ntri×nv个纹理块的大小,这显然会浪费巨大的显存空间。作者使用一个空闲栈取管理纹理块,用来存储在纹理图集中暂无对应的纹理块的索引。一开始空闲栈填充纹理块数量的最大值个索引,每当创建一个纹理块,就从空闲栈中pop出一个索引分配给这个纹理块,当清除一个纹理块时,就push对应的索引到空闲栈中。
如图,体素A有3个纹理块,当释放体素A的纹理块时,free list push进去纹理块的索引,当体素B需要创建一个纹理块时,从free list 中pop一个索引出来。
某一帧使用Marching Cubes在体素A创建了某种类型的纹理块,但随后某帧在体素A创建了与之前不同数量或不同类型的纹理块,这时候就需要删除之前的纹理块,重新创建纹理块。(重采样)
纹理块融合
我们首先通过更新后的TSDF体积中提取三角形,将其投影到当前彩色图像上来构造新的纹理块,然后自适应地将来自当前帧的新纹理块与现有纹理图集中的纹理块进行融合,采用图像模糊度的加权融合,纹理块融合后还要解决网格连接问题。
构建 M k M_k Mk表示第k帧从TSDF模型中提取的三角网格,为每一个网格构建一个纹理块 T k ′ T'_k Tk′,将这个网格投影到当前的颜色图 C k C_k Ck中,可以在颜色图 C k C_k Ck中找到对应的三角形。
更新 对纹理块的颜色进行加权平均,类似与TSDF的更新方式。如果当前体素中的纹理块类型数量都没变,那么在全局纹理图集中有一个当前体素中的纹理块对应,然后采用如下的更新方式:
T
k
=
W
k
−
1
⊙
T
k
−
1
+
W
k
′
⊙
T
k
′
W
k
−
1
+
W
k
′
\mathbf{T}_{k}=\frac{\mathbf{W}_{k-1} \odot \mathbf{T}_{k-1}+\mathbf{W}_{k}^{\prime} \odot \mathbf{T}_{k}^{\prime}}{\mathbf{W}_{k-1}+\mathbf{W}_{k}^{\prime}}
Tk=Wk−1+Wk′Wk−1⊙Tk−1+Wk′⊙Tk′
W
k
′
(
p
)
=
w
n
⋅
w
d
⋅
w
b
W'_k(p) = w_n \cdot w_d \cdot w_b
Wk′(p)=wn⋅wd⋅wb
过滤 避免体素的顶点在零点附近反复横跳,从而避免提取的三角形会经常改变。
t
k
′
=
{
t
k
if
∣
t
k
∣
≥
δ
+
δ
if
∣
t
k
∣
<
δ
and
t
k
−
1
≥
+
δ
−
δ
if
∣
t
k
∣
<
δ
and
t
k
−
1
≤
−
δ
t
k
−
1
′
otherwise
(
∣
t
k
∣
<
δ
and
∣
t
k
−
1
∣
<
δ
)
t_{k}^{\prime}=\left\{\begin{array}{ll} t_{k} & \text { if }\left|t_{k}\right| \geq \delta \\ +\delta & \text { if }\left|t_{k}\right|<\delta \text { and } t_{k-1} \geq+\delta \\ -\delta & \text { if }\left|t_{k}\right|<\delta \text { and } t_{k-1} \leq-\delta \\ t_{k-1}^{\prime} & \text { otherwise }\left(\left|t_{k}\right|<\delta \text { and }\left|t_{k-1}\right|<\delta\right) \end{array}\right.
tk′=⎩⎪⎪⎨⎪⎪⎧tk+δ−δtk−1′ if ∣tk∣≥δ if ∣tk∣<δ and tk−1≥+δ if ∣tk∣<δ and tk−1≤−δ otherwise (∣tk∣<δ and ∣tk−1∣<δ)
重采样 前n帧在体素A创建了某种类型的纹理块,但随后帧在体素A创建了与之前不同数量或不同类型的纹理块,这时候就需要删除之前的纹理块,重新创建纹理块。将新创建的纹理块投影到预测表面(KinectFusion)进行采样颜色信息。
纹理块优化
实际中,相机位姿不可能完美准确,输入的彩色图像本身也经常收到镜头变形、快门失真以及不完美的颜色和深度图像同步的影响。在这一节中介绍一种优化方法使得对这些情况更加鲁棒。
图像变形场 理想情况下,输入图像和当前模型渲染出来的图像(预测图)应该是完美对齐上的,但实际上会存在误对齐。在输入的图像和预测图都建立规则的网格变形场。
目标 最小化当前颜色图和预测图在位置s的光度误差,这里s是2D三角网格的重心坐标。用网格的边长作为惩罚项。
多尺度优化 金字塔。
优化纹理块采样流程 当前帧从模型中提取出纹理块,当前帧颜色图和预测图都规则的分成网格,