我正在开发一个快速的应用程序,该应用程序应测量站在静态安装的iPhone 7+前面的人的正确的z物理值。因此,我使用的AVDepthData对象包含来自双摄像头系统的深度图。
但是,所得的点云表明深度图不具有亚像素精度,因为点云由沿z方向的切片组成,并且相邻切片的距离随深度的增加而增加。这似乎是由整数离散化引起的。以下是两个可视化问题的文件:
捕获的深度图,在4.0m之后裁剪了Z值:DepthMap with Z-values in Legend
带纹理的Pointcloud,从侧面(90°)查看:Pointcloud rendered from iPhone
根据Apple的文档,为了获得正确的世界坐标,我已经停用了时间过滤并使用查找表中的失真系数使图像不变形。
过滤深度数据使其对于将视觉效果应用于伴随图像更加有用,但是会更改数据,使其可能不再适合于计算机视觉任务。 (在未过滤的深度图中,缺失值表示为NaN。)
是否有任何方法可以检索具有亚像素精度的深度图,以便对站在相机前的人进行良好的测量?
在下面,您可以找到我编写的用于离线创建点云的python代码,Apple提供了方法 calculate_rectified_point 来消除图像中的镜头失真。
for v in range(height):
for u in range(width):
r, g, b = rgb_texture[v, u]
z = depth_map[v, u]
if z <= 0:
continue
# Step 1: inverse the intrinsic parameters
x = (u - center[0]) / focal_lengths[0]
y = (v - center[1]) / focal_lengths[1]
# Step 2: remove the radial and tangential distortion
x_un, y_un = calculate_rectified_point((x, y), dist_coefficients, optical_center, (width, height))
# Step 3: inverse extrinsic parameters
x, y, z = extrinsic_matrix_inv.dot(np.array([x_un * z, y_un * z, z]))