如何获得AVDepthData对象中的亚像素差异

时间:2019-09-26 15:25:17

标签: ios swift iphone avfoundation avdepthdata

我正在开发一个快速的应用程序,该应用程序应测量站在静态安装的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]))

0 个答案:

没有答案