使用带有 TrueDepth 传感器的 iPhone 相机,我能够在我的脸部图像中捕捉准确的深度数据。我正在从正面、左侧和右侧(大约旋转 30 度)捕获深度,并且头部稍微向上倾斜以捕获下巴下方(总共 4 个深度图像)。我们在这里只捕捉深度,所以没有颜色信息。我们正在使用椭圆框裁剪不重要的数据
我们还使用 ARKit 为我们提供了面部锚点的变换,这与面部的变换相同,参考:https ://developer.apple.com/documentation/arkit/arfaceanchor 。不可能同时捕获深度图像和面部变换,因为它们来自不同的捕获会话。所以我们必须拍摄深度图像,然后在用户保持面部不动的情况下快速切换会话以获得面部锚点变换。世界对齐设置为.camera
因此面部锚点变换应该相对于相机,而不是世界原点。
我们最终得到了 4 个如下所示的点云: 左右:下巴向上,左侧 30,向前,右侧 30
我们还得到了 4 个变换。我们正在尝试使用 python 中的 open3d 将它们的点云缝合在一起以制作平滑的面部网格。
到目前为止的过程如下:
- 读取点云和变换
- 对点云应用逆变换以返回到相机的原始位置
我原以为这些点云大致位于同一位置,但实际上却发生了这种情况:
我是否使用了错误的转换?
python 代码和示例点云和变换在这里:https://github.com/JoshPJackson/FaceMesh但重要的一点如下:
dir = './temp4/'
frontPcd = readPointCloud('Front.csv', dir)
leftPcd = readPointCloud('Left.csv', dir)
rightPcd = readPointCloud('Right.csv', dir)
chinPcd = readPointCloud('Chin.csv', dir)
frontTransform = readTransform('front_transform.csv', dir)
leftTransform = readTransform('left_transform.csv', dir)
rightTransform = readTransform('right_transform.csv', dir)
chinTransform = readTransform('chin_transform.csv', dir)
rightPcd.transform(np.linalg.inv(rightTransform))
leftPcd.transform(np.linalg.inv(leftTransform))
frontPcd.transform(np.linalg.inv(frontTransform))
chinPcd.transform(np.linalg.inv(chinTransform))
我希望将所有点云合并在一起,这样我就可以删除重复的顶点,然后制作一个网格