繁体   English   中英

将面部姿势的点云组合成 3d 网格

[英]Combining point clouds of facial poses into a 3d mesh

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

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

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

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

到目前为止的过程如下:

  1. 读取点云和变换
  2. 对点云应用逆变换以返回原始 position w.r.t 相机

我原以为这些点云大致相同 position,但实际上却发生了这种情况: 变换 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))

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

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

许多步骤来做到这一点:

  • 取一个面并使用 function f(x, y) 创建一个2D function到 map 面。 噪声必须指向 z 方向。
  • 使用lmfit.minimizecurve_fit将您的新 function 安装到其他面
  • 使用拟合的返回参数来了解偏移量!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM