KinectFusionAppLib_comments
KinectFusionAppLib_comments copied to clipboard
tsdf计算问题
const Vec3fda xylambda(
(uv.x() - cam_params.principal_x) / cam_params.focal_x, // (x/z)
(uv.y() - cam_params.principal_y) / cam_params.focal_y, // (y/z)
1.f);
// 计算得到公式7中的 lambda
const float lambda = xylambda.norm();
// step 2.3 计算 SDF, 参考论文公式6中括号的部分
// 这里的 camera_pos 已经是该体素中心点在当前世界坐标系下的坐标了, 论文中的公式的意思是计算相机光心到该点的距离, 就相当于这个坐标直接取欧式二范数
// 前面乘的负号是因为, 咱们定义 SDF 表示中平面前的部分为正, 平面后的部分为负
// SDF 其实也就是表示了空间体素点的(预测值 - 观测值)
const float sdf = (-1.f) * ((1.f / lambda) * camera_pos.norm() - depth);
关于上面这块代码,有一些疑问需要咨询大神。 1.xylambda到底代表了什么。为什么xylambda存储了 x/z 和 y/z (相机坐标系)。x/z和y/z表示的具体含义是什么,我一直没有搞明白。 2.sdf的计算方式。 代码中计算sdf的方式如上面所示((1.f / lambda) * camera_pos.norm() - depth)。然后我看其他kinectfusion实现的时候,我发现有的计算方式是直接让 相机坐标系下体素块的z值去和 深度图的z值相减。 实现方式有区别,这2种实现方式有什么不一样呢?
kinect相机的深度值是 测量的物体到相机平面的垂直距离,而不是物体到相机光心的距离
(1.f / lambda) * camera_pos.norm() 这块代码的意思就是求 体素中心到相机平面的深度。 感觉完全不需要这么写,其实就是 camera_pos在z轴的投影,也就是 camera_pos.z
kinect相机的深度值是 测量的物体到相机平面的垂直距离,而不是物体到相机光心的距离
另外的表达方式。 沿光轴方向距离(垂直于成像平面的方向)和 相机光心出发到各个表面点的方向距离