你想要一个面部的纹理贴图风格的图像?没有API可以帮助您,但您需要的所有信息都在那里:
ARFrame.capturedImage 获取相机图像.ARFaceGeometry 为您提供面部的3D网格.ARAnchor并ARCamera一起告诉您脸部相对于相机的位置,以及相机与图像像素的关系.因此,完全可以使用当前视频帧图像来纹理人脸模型.对于网格中的每个顶点...
这将获得每个顶点的纹理坐标,然后您可以使用相机图像对网格进行纹理处理.您可以一次性完成此数学运算以替换纹理坐标缓冲区ARFaceGeometry提供的数据,或者在渲染期间在GPU上的着色器代码中执行此操作.(如果使用SceneKit进行渲染ARSCNView,则可以在geometry入口点的着色器修改器中执行此操作.)
相反,如果你想知道相机图像中每个像素对应的面部几何形状的哪一部分,那就更难了.你不能只是颠倒上面的数学,因为你错过了每个像素的深度值......但如果你不需要映射每个像素,SceneKit命中测试是获取单个像素几何的简单方法.
如果您真正要求的是具有里程碑意义的识别 - 例如,在相机图像中的位置是眼睛,鼻子,胡须等 - 在ARKit中没有API.该愿景框架可能的帮助.
我已经制作了一个演示 iOS 应用程序来展示如何实现这一点。该演示实时捕获面部纹理贴图,并将其应用回ARSCNFaceGeometry创建用户面部的纹理 3D 模型。
下面您可以在左上角看到实时纹理 3D 脸部模型,叠加在 AR 前置摄像头视图的顶部:
\n\n该演示的工作原理是渲染ARSCNFaceGeometry,但是您不是正常渲染它,而是在纹理空间中渲染它,同时继续使用原始顶点位置来确定从捕获的像素数据中的何处进行采样。
以下是实现相关部分的链接:
\nFaceTextureGenerator.swift\xe2\x80\x94\xc2\xa0生成人脸纹理的主类。这设置了Metal 渲染管道来生成纹理。
faceTexture.metal\xe2\x80\x94 用于生成面部纹理的顶点和片段着色器。它们在纹理空间中运行。
几乎所有工作都是在金属渲染通道中完成的,因此它可以轻松实时运行。
\n我还整理了一些笔记涵盖了演示的局限性
\n如果您想要用户脸部的 2D 图像,您可以尝试执行以下操作:
\n将转换后的图像渲染ARSCNFaceGeometry到 1 位缓冲区以创建图像蒙版。基本上,您只需要面部模型看起来是白色的地方,而其他一切都应该是黑色的。
将蒙版应用到捕获的帧图像。
\n这应该会给你一张只有脸部的图像(尽管你可能需要裁剪结果)
\n| 归档时间: |
|
| 查看次数: |
2050 次 |
| 最近记录: |