什么是体素?
答:图像里面的最小单位是像素,体素就是三维立体图里面的最小单位。
可以理解成二维中的像素的升级版,更直观的理解是“我的世界”里面的一个个小立方块。
下面就不用体素这个词了,直接用小立方块更直观地表达。
基于体素的TSDF——翻译为人话就是:怎么结合体素来描述一个三维地图
首先,我们的整个三维地图都用小立方体来表示,好像很简单呀:如果这个小立方体如果有物体存在,就记为1,没有物体覆盖就记为-1,so seay。
——小了,格局小了,能广泛使用的算法哪能怎么简单呢?
TSDF基本思想
TSDF模型的思想其实也很简单,三维世界嘛,无非三种情况:物体内部,物体外部,物体表面:
我们的小立方体要么在物体内部
我们的小立方体要么在物体外部
我们的小立方体要么在物体表面(或者说小立方体被物体表面隔开成两部分,一部分在物体内部,一部分在物体外部)
下面开始讲具体怎么解决这个问题
每个小立方体都有描述他两个值:tsdf值和rgb值。
tsdf值就是用来描述这个小立方体中是否有物体存在。(rgb值就没必要解释了)
先说tsdf值:
tsdf值不是像上面那样简单的取1或-1,tsdf值有他的取值范围[-1,1],也就是说,tsdf是一个小数。
可以这么直观的理解:
tsdf的具体公式:
注:sdf(x)里面的x就是指具体的某个小立方块x;t是一个阈值,后面再分析。
公式转换成语言就是:一般来说,tsdf的值就是sdf(x)的值,但是给sdf(x)加了个上下限,如果超出1-或1,tsdf就只能取到[-1,1]之间。
那么sdf(x)是什么?
sdf怎么来的
直接上公式吧:
其中:
dp = 这个小立方块到相机的距离
dx = 这个小立方块到相机,两点组成的这条直线上测得的深度值(小立方体的世界坐标(x,y,z)——>相机坐标(x’,y’,z’)——>图像平面(u,v)——>根据(u,v)从深度图中找出深度值)
糙一点的塑料示意图如下:
所以很容易的到sdf的含义:
需要注意的是,如果我现在告诉你,sdf = 50,你能告诉我小立方块距离物体表面是很远还是很近吗?
答:不能。这是50nm还是50m呢?因为并没有进行归一化,这是一个抽象的数字,并不能表征距离。
那怎么办?
开头说到:“当tsdf = 1 ,小立方块在距离物体外无限远处。”sdf的数值怎么可能是无穷的呢?这时候就要用到前面提到的tsdf公式中的 t 了
t 怎么用?
无穷远处——这个抽象的概念是人为的,当实际工程认为,sdf = 100就可以认为距离无穷远了,那我就把t设置成100,我们将这个参数带入到前面sdf=50的例子中:
此时 sdf(x)/t = 50/100 = 0.5 ; tsdf = max [ -1 , min(1, 50/100) ] = 0.5
很显然,小立方块不在物体内部,但是距离物体表面也不是很远。
假如设置参数 t = 5 呢:
此时 sdf(x)/t = 50/5= 10; tsdf = max [ -1 , min(1, 50/5) ] = 1
显然,小立方块不在物体内部,且距离表面无穷远(我们认为的无穷远)
大致讲完了,TSDF模型就是这么一回事。
还有一个问题,不同的相机角度,因为干扰,误差之类的,都会得到不同的TSDF模型吧,那这时候怎么办呢?
TSDF地图融合
直接上公式,这是一种比较常见的做法:
参数解释:
也就是说每个时刻的tsdf值,都与上一时刻的tsdf值有关;
而上一时刻的tsdf值,又跟上上时刻的tsdf值相关,环环相扣;
所以当前时刻的tsdf值,与前面所有时刻的tsdf值都有关系,这个“关系”就通过权值来联系了。
参考博客:
https://blog.csdn.net/qq_39732684/article/details/105294993