流程分析:
- 首先需要构建一大块空区域(不能太大,GPU放不下)
- 一般把这个大区域叫做volume
- 它有很多个小区域组成,每个角voxel(体素)
- 需要计算每个voxel的TSDF值及其权重
初始化操作:
- 一个三维的大区域(TSDF图)由LxWxH个三维小方块组成
- 其中每一个小方块的大小也是自己定义的,例如0.05mx0.05mx0.05m
- 5mx5mx5m的真实三维场景中有10^6个体素,计算量很大
- 一般都用GPU来算,CPU也可以,但是会很慢
要对每个体素计算什么呢?(一个体素的SDF值,是它到最近的表面的距离)
- x是其中的一个体素,绿色是离它最近平面
- P点是平面上离X最近的一点
- 它两之间的距离就是SDF(要计算的结果)
- 其中T表示截断的意思(太近太远的设为 定值 )
- 0表示最近,1和-1分别表示正面和反面最远
如何计算TSDF呢?
- 面到相机的深度是ds,相机采集到的深度dv,则d(x)=ds-dv
- d(x)>0说明该体素在真实的面的前面;反之则说明改体素在真实的面的后面
- 转换操作(ds,其实就是我们的深度图中的数值)
- 遍历每一个体素,计算其在世界坐标系中的位置
- 根据初始化“大块”时设置的极点位置和体素大小决定
- 再将其在世界坐标系的值转换成其在相机坐标系中的位置(位姿RT已知)(其到相机坐标原点的举例就是dv)
- 再根据相机内参,转换到像素坐标(因为我们由深度图,得到像素坐标就能得到其深度值)
TSDF结果:
- 红色表示一个表面
- 正负1表示离得很远
- 最终得到了多少体素的结果
- 当前只表示其中一帧,还要融合
TSDF组合
- 我们的输入由很多视角的图像组成,但是大块就那么一个
- 所以咱们的大块时一直在更新的,但是并不是算完所有的一起更新
- 相当于每一个体素的值是一种平均的感觉,各个视角的图都会对其产生影响
- 但是第二帧是由其结果与第一帧组合得到,第三帧就是组合了第二帧(就像之前的动图,是一个增量式的过程,并不是最后一次组合)
整体概述
这个就是TSDF的更新和组合的过程
一步步计算各个体素TSDF值再把他们拼接起来