1.Overview
两者的原理几乎一模一样,只不过是在不同坐标系下进行的
TSDF:Truncated Signed Distance Function-在世界坐标系下求解体素中心到表面的距离的截断值
PSDF:Projective TSDF-在相机坐标系下求解体素中心到表面的距离的截断值
2.PSDF
1.计算体素x的世界坐标:设体素x中心在立体块中的坐标(vx,vy,vz),那么在世界坐标系下的位置是:
注:一开始构建立体块-PSDF模型时会计算立体块原点世界坐标和体素块的世界坐标系下的长度
2.将体素x的世界坐标转化到相机坐标系下:
注:即用该帧的相机位姿的逆矩阵左乘世界坐标
3.由相机成像模型得到体素中心和相机中心的在相机坐标系下的距离-camz(x):
注:Ix表示体素x投影在相机成像平面下的像素坐标
4.则体素x的SDF值为(PSDF为截断的SDF-Truncated):
5.则T素x的PSDF为:
注:当− t ≤ sdf ( x ) ≤ t时,psdf ( x ) = sdf ( x ) / t ∈ [ − 1 , 1 ]。当sdf ( x ) > t或者sdf ( x ) < − t时,psdf ( x ) = 1或者− 1 。其实这个表达式是有物理意义的。t可以看作是体素x和截面对应点P深度差值的阈值。当体素x距离截面对应点P非常远的时候,它的psdf值等于正负一。当体素x距离截面对应点P比较近的时候,它的psdf值[ − 1 , 1 ]之间,是有意义的。用更为通俗的话说,当体素离表面非常近的时候,它的psdf值接近于零;当体素离表面非常远的时候,它的psdf值趋于正一或者负一
3.TSDF
1.计算体素的世界坐标:设体素x中心在立体块中的坐标(vx,vy,vz),那么在世界坐标系下的位置是:
2.将体素x的世界坐标转化到相机坐标系下:
即用该帧的相机位姿的逆矩阵左乘世界坐标3.得到对应的像素坐标:
3.计算体素x的sdf值,用像素坐标的深度值 D(Ix) 减去体素中心和相机中心的在世界坐标系下的距离t(x):
注:
Ix表示体素x投影在相机成像平面下的像素坐标;
t(x)乘以,是将沿着射线的距离转化到沿着光轴的距离,D(Ix)不乘这个系数是因为它本身就是像素点对应的沿着光轴的深度值.
4.体素x的tsdf值为:
4.Conclusion and questions
所以我们看完PSDF、TSDF的计算,会发现两者区别就在sdf的那里,PSDF是D(Ix) -Camz(x),TSDF是D(Ix) - t(x),Camz(x)是相机坐标系下的体素与相机中心的距离,t(x)是在世界坐标系下直接求得的,而相机到表面点距离用的都是D(Ix)。
注:有的版本的sdf求解中是用的*Camz(x)-D(Ix)、*t(x)-D(Ix),我也很迷糊,但是吧,这对结果的影响无非就是体素的sdf/sdf在表面的哪一边为正哪一边为负的问题罢了。
注:还有一个问题就是有时候计算sdf时,我们不是沿着射线(相机光心出发到各个表面点的方向)计算距离之差的,而是转化到沿光轴方向(垂直于成像平面的方向)计算深度之差,如下图。这时候就需要乘个系数将其转化为沿光轴的深度,但是不管时沿射线还是沿光轴其实算出来的sdf没有太大差别(来自kinect-fusion论文原话),这里有个问题,在kinect-fusion中我们乘的系数只是在t(x)上乘并没有对D(Ix)乘,那就说明kinect相机获得的每个像素的深度信息是沿着光轴方向上的深度