1)
3.1
Ntwarp={dgv,dgw,dgse3}t N w a r p t = { d g v , d g w , d g s e 3 } t
dgv
d
g
v
表示该点canonical frame的位置
dgw
d
g
w
表示影响范围
dgse3
d
g
s
e
3
该点在当前帧的形变
i=1…n i = 1 … n 其中 n n 是第0层node点数
2)
公式(2)中从world转到当前帧的camera view
3)
3.2算体素的psdf
对于每个体素中心 xc x c (世界坐标, canonical space), 先转到当前帧的camera view中 xt x t , (3)式第二部分
然后将该点 xt x t 投影当前帧的Image view里面 uc u c , 然后索引出深度, 转回到camera view中. (3)式第一部分
第一部分为相机到surface, 第二部分为相机到体素中心的距离, 两者相减则为体素中心到surface的距离
4)
3.3算
Wt
W
t
,即算每帧相机的pose
Tlw
T
l
w
, 每点的形变
Tic
T
i
c
5)
3.3.1 用non-rigid ICP构造data term
注意ICP第一步是找匹配, 跟kinnect fusion不同(kinnect fusion找前后两帧Image view的匹配点, 然后算出世界坐标让他们一致), 它先根据TSDF提取出一个zero level set: Ṽ c={Vc,Nc} V ~ c = { V c , N c } , 然后用 Wt W t 对其进行形变,(注意 Wt W t 是我们要求的, 我们这里采用的初值然后逐步迭代, 跟KinnectFusion求 T̃ zg,k一样,先定一个初值,然后代入公式再逐步优化 T ~ g , k z 一 样 , 先 定 一 个 初 值 , 然 后 代 入 公 式 再 逐 步 优 化 ), 此时形变后的坐标为当前帧的camera view, 然后再投影到image space里面, 这样就有一个image view 到canonical space的对应关系. 即每个像素 u u 对应一个形变后的canonical点的坐标 以及形变后的canonical的法向量 n̂ u n ^ u , 然后将 v̂ u v ^ u 投影回image view ũ u ~ , 索引出深度,投影回camera view, vlũ v l u ~ , 最后组成公式(7)
好了, 现在说说我自己对整个流程的理解
第一帧深度图来了之后, 算每个体素中心的tsdf, 根据tsdf的零切面可以提取出来canonical model的点云,然后我们更新整个体素的tsdf(好更新零切面), 由于场景物体是运动的(也就是体素是在扭曲), 所以要需要算体素的形变,由于体素数量太多, 我们将体素的形变embedded到node的形变, 我们先采样node,然后算node的形变,再用node的形变去插值体素的形变。
那么怎么采样node呢?就是用一堆半径为r的点去覆盖前面的canonical model的点云(canonical cloud)
那么算node的形变呢?对于新加进来的node, 我们把它的形变初始化为单位形变, 然后每帧算出新的形变, 前一帧的形变作为当前帧形变的初始值, 然后迭代去解。具体解法见3.3, 这里大致说下,假设前一帧node的形变已求得, 对于当前帧,我们先用前一帧每一个node的形变去形变canonical cloud, 然后渲染到当前视角,得到一张图片,其中有canonical cloud的像素区域我们称为可见区域,对于可见区域里的像素我们可以还原出形变后的canonical 3d cloud, 然后当前帧的深度图可以还原一个3d cloud, 然后用icp的方法,可以得到canonical cloud的形变, 由于cloud的形变又是由node的形变插值完成, 所以我们可以得到node的形变。
得到了node的形变我们就可以通过3.2回去更新我们的canonical cloud, 怎么更新呢?
先通过node的形变算出体素的形变, 然后结合当前的深度图更新体素的tsdf, 最后提取出更新后的canonical cloud. 如果有新的cloud没有被node覆盖到, 我们增加新的node去覆盖它。