iOS11 ARKit:ARKit还可以捕获用户脸部的纹理吗?

Fra*_*ock 4 ios ios11 arkit iphone-x

我上下阅读了所有ARKit类的完整文档.我没有看到任何描述实际获取用户面部纹理的能力的地方.

ARFaceAnchor包含ARFaceGeometry(由顶点组成的拓扑和几何)和BlendShapeLocation数组(允许通过操纵用户面顶点上的几何数学来操纵各个面部特征的坐标).

但是我在哪里可以获得用户脸部的实际纹理.例如:实际的肤色/肤色/纹理,面部毛发,其他独特的特征,如疤痕或出生痕迹?或者这根本不可能?

ric*_*ter 7

你想要一个面部的纹理贴图风格的图像?没有API可以帮助您,但您需要的所有信息都在那里:

  • ARFrame.capturedImage 获取相机图像.
  • ARFaceGeometry 为您提供面部的3D网格.
  • ARAnchorARCamera一起告诉您脸部相对于相机的位置,以及相机与图像像素的关系.

因此,完全可以使用当前视频帧图像来纹理人脸模型.对于网格中的每个顶点...

  1. 将顶点位置从模型空间转换为相机空间(使用锚点的变换)
  2. 与具有该向量的相机投影相乘以获得归一化的图像坐标
  3. 除以图像宽度/高度以获得像素坐标

这将获得每个顶点的纹理坐标,然后您可以使用相机图像对网格进行纹理处理.您可以一次性完成此数学运算以替换纹理坐标缓冲区ARFaceGeometry提供的数据,或者在渲染期间在GPU上的着色器代码中执行此操作.(如果使用SceneKit进行渲染ARSCNView,则可以在geometry入口点的着色器修改器中执行此操作.)

相反,如果你想知道相机图像中每个像素对应的面部几何形状的哪一部分,那就更难了.你不能只是颠倒上面的数学,因为你错过了每个像素的深度值......但如果你不需要映射每个像素,SceneKit命中测试是获取单个像素几何的简单方法.


如果您真正要求的是具有里程碑意义的识别 - 例如,在相机图像中的位置是眼睛,鼻子,胡须等 - 在ARKit中没有API.该愿景框架可能的帮助.


Mat*_*ner 7

我已经制作了一个演示 iOS 应用程序来展示如何实现这一点。该演示实时捕获面部纹理贴图,并将其应用回ARSCNFaceGeometry创建用户面部的纹理 3D 模型。

\n

下面您可以在左上角看到实时纹理 3D 脸部模型,叠加在 AR 前置摄像头视图的顶部:

\n

左上角的纹理 3D 脸部模型覆盖在 AR 前置摄像头视图的顶部

\n

该演示的工作原理是渲染ARSCNFaceGeometry,但是您不是正常渲染它,而是在纹理空间中渲染它,同时继续使用原始顶点位置来确定从捕获的像素数据中的何处进行采样。

\n

以下是实现相关部分的链接:

\n\n

几乎所有工作都是在金属渲染通道中完成的,因此它可以轻松实时运行。

\n

我还整理了一些笔记涵盖了演示的局限性

\n
\n

如果您想要用户脸部的 2D 图像,您可以尝试执行以下操作:

\n
    \n
  • 将转换后的图像渲染ARSCNFaceGeometry到 1 位缓冲区以创建图像蒙版。基本上,您只需要面部模型看起来是白色的地方,而其他一切都应该是黑色的。

    \n
  • \n
  • 将蒙版应用到捕获的帧图像。

    \n
  • \n
\n

这应该会给你一张只有脸部的图像(尽管你可能需要裁剪结果)

\n