1

使用带有 TrueDepth 传感器的 iPhone 相机,我能够在我的脸部图像中捕捉准确的深度数据。我正在从正面、左侧和右侧(大约旋转 30 度)捕获深度,并且头部稍微向上倾斜以捕获下巴下方(总共 4 个深度图像)。我们在这里只捕捉深度,所以没有颜色信息。我们正在使用椭圆框裁剪不重要的数据

我们还使用 ARKit 为我们提供了面部锚点的变换,这与面部的变换相同,参考:https ://developer.apple.com/documentation/arkit/arfaceanchor 。不可能同时捕获深度图像和面部变换,因为它们来自不同的捕获会话。所以我们必须拍摄深度图像,然后在用户保持面部不动的情况下快速切换会话以获得面部锚点变换。世界对齐设置为.camera因此面部锚点变换应该相对于相机,而不是世界原点。

我们最终得到了 4 个如下所示的点云: 左右:下巴向上,左侧 30,向前,右侧 30抬起下巴,左,前,右

我们还得到了 4 个变换。我们正在尝试使用 python 中的 open3d 将它们的点云缝合在一起以制作平滑的面部网格。

到目前为止的过程如下:

  1. 读取点云和变换
  2. 对点云应用逆变换以返回到相机的原始位置

我原以为这些点云大致位于同一位置,但实际上却发生了这种情况:变换 1 后 变身2后

如您所见,这些面仍然彼此偏移:变形后 3

我是否使用了错误的转换?

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))

我希望将所有点云合并在一起,这样我就可以删除重复的顶点,然后制作一个网格

4

1 回答 1

0

一种好方法是找到你的脸的数学参考。(仅适用于表面)

许多步骤来做到这一点:

  • 取一张脸并创建一个二维函数,用函数 f(x, y) 映射人脸。噪声必须指向 z 方向。
  • 使用lmfit.minimizecurve_fit将新函数拟合到其他面
  • 使用拟合的返回参数来了解偏移量!
于 2021-03-30T12:54:25.000 回答