KinectFusionAppLib_comments icon indicating copy to clipboard operation
KinectFusionAppLib_comments copied to clipboard

tsdf计算问题

Open 1icas opened this issue 2 years ago • 3 comments

  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种实现方式有什么不一样呢?

1icas avatar Nov 02 '23 05:11 1icas

kinect相机的深度值是 测量的物体到相机平面的垂直距离,而不是物体到相机光心的距离

1icas avatar Jan 04 '24 07:01 1icas

(1.f / lambda) * camera_pos.norm() 这块代码的意思就是求 体素中心到相机平面的深度。 感觉完全不需要这么写,其实就是 camera_pos在z轴的投影,也就是 camera_pos.z

1icas avatar Jan 17 '24 07:01 1icas

kinect相机的深度值是 测量的物体到相机平面的垂直距离,而不是物体到相机光心的距离

另外的表达方式。 沿光轴方向距离(垂直于成像平面的方向)和 相机光心出发到各个表面点的方向距离

1icas avatar Jun 20 '24 11:06 1icas