我正在开发一个快速应用程序,该应用程序应该测量站在静态安装的 iPhone 7+ 前面的人的物理正确 z 值。因此,我使用 AVDepthData 对象,其中包含来自双摄像头系统的深度图。
然而,生成的点云表明深度图不具有亚像素精度,因为点云由沿 z 方向的切片组成,并且相邻切片的距离随着深度的增加而增加。这似乎是由整数离散化引起的。
以下是可视化问题的两个文件:
捕获的深度图,在 4.0m 后裁剪 Z 值:图例中带有 Z 值的深度图
纹理点云,侧视图 (90°):从 iPhone 渲染的点云
根据 Apple 的文档,我已经停用了时间过滤并使用查找表中的失真系数对图像进行了变形,以便获得正确的世界坐标。
过滤深度数据使其在将视觉效果应用于伴随图像时更有用,但会改变数据,使其不再适用于计算机视觉任务。(在未过滤的深度图中,缺失值表示为 NaN。)
有没有办法检索具有亚像素精度的深度图,以便对站在相机前的人进行良好的测量?
您可以在下面找到我编写的用于离线创建点云的 python 代码,方法calculate_rectified_point由 Apple 提供,用于从图像中消除镜头失真。
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]))