我上下阅读了所有 ARKit 类的完整文档。我没有看到任何描述实际获取用户面部纹理的能力的地方。
ARFaceAnchor 包含 ARFaceGeometry(由顶点组成的拓扑和几何)和 BlendShapeLocation 数组(允许通过操纵用户面顶点上的几何数学来操纵各个面部特征的坐标)。
但是我在哪里可以获得用户脸部的实际纹理。例如:实际的肤色/肤色/纹理,面部毛发,其他独特的特征,如疤痕或出生痕迹?或者这根本不可能?
你想要面部的 texture-map-style 图像?没有 API 可以帮助您,但您需要的所有信息都在那里:
ARFrame.capturedImage为您提供相机图像。
ARFrame.capturedImage
ARFaceGeometry为您提供面部的 3D 网格。
ARFaceGeometry
ARAnchor和ARCamera一起告诉您脸部相对于相机的位置,以及相机与图像像素的关系。
ARAnchor
ARCamera
因此,完全可以使用当前视频帧图像来纹理人脸模型。对于网格中的每个顶点...
将顶点位置从模型空间转换为相机空间(使用锚点的变换)
与具有该向量的相机投影相乘以获得归一化的图像坐标
除以图像 width/height 以获得像素坐标
这将获得每个顶点的纹理坐标,然后您可以使用相机图像对网格进行纹理处理。您可以一次性完成此数学运算以替换纹理坐标缓冲区ARFaceGeometry提供,或者在渲染期间在 GPU 上的着色器代码中执行此操作。 (如果使用 SceneKit/ARSCNView进行渲染,则可以在着色器修改器中为几何条目 point.)执行此操作
ARSCNView
相反,如果你想知道相机图像中每个像素对应的面部几何形状的哪一部分,那就更难了。你不能只是颠倒上面的数学,因为你错过了每个像素的深度值......但如果你不需要映射每个像素,SceneKit 命中测试是获取单个像素几何的简单方法。
如果你真正要求的是具有里程碑意义的认可 - e.g. 在相机图像中的位置是眼睛,鼻子,胡须等 - 在 ARKit 中没有 API。 视力框架可能有所帮助。
不可以。这个信息目前不在ARKit中。
ARKit
要检测其他面部特征,您需要运行自己的自定义计算机视觉代码。您可以使用AVFoundation从 front-facing 摄像机捕获图像。
AVFoundation
您可以按如下方式计算纹理坐标:
let geometry = faceAnchor.geometry let vertices = geometry.vertices let size = arFrame.camera.imageResolution let camera = arFrame.camera modelMatrix = faceAnchor.transform let textureCoordinates = vertices.map { vertex -> vector_float2 in let vertex4 = vector_float4(vertex.x, vertex.y, vertex.z, 1) let world_vertex4 = simd_mul(modelMatrix!, vertex4) let world_vector3 = simd_float3(x: world_vertex4.x, y: world_vertex4.y, z: world_vertex4.z) let pt = camera.projectPoint(world_vector3, orientation: .portrait, viewportSize: CGSize( width: CGFloat(size.height), height: CGFloat(size.width))) let v = 1.0 - Float(pt.x) / Float(size.height) let u = Float(pt.y) / Float(size.width) return vector_float2(u, v) }
3 回答
你想要面部的 texture-map-style 图像?没有 API 可以帮助您,但您需要的所有信息都在那里:
ARFrame.capturedImage
为您提供相机图像。ARFaceGeometry
为您提供面部的 3D 网格。ARAnchor
和ARCamera
一起告诉您脸部相对于相机的位置,以及相机与图像像素的关系。因此,完全可以使用当前视频帧图像来纹理人脸模型。对于网格中的每个顶点...
将顶点位置从模型空间转换为相机空间(使用锚点的变换)
与具有该向量的相机投影相乘以获得归一化的图像坐标
除以图像 width/height 以获得像素坐标
这将获得每个顶点的纹理坐标,然后您可以使用相机图像对网格进行纹理处理。您可以一次性完成此数学运算以替换纹理坐标缓冲区
ARFaceGeometry
提供,或者在渲染期间在 GPU 上的着色器代码中执行此操作。 (如果使用 SceneKit/ARSCNView
进行渲染,则可以在着色器修改器中为几何条目 point.)执行此操作相反,如果你想知道相机图像中每个像素对应的面部几何形状的哪一部分,那就更难了。你不能只是颠倒上面的数学,因为你错过了每个像素的深度值......但如果你不需要映射每个像素,SceneKit 命中测试是获取单个像素几何的简单方法。
如果你真正要求的是具有里程碑意义的认可 - e.g. 在相机图像中的位置是眼睛,鼻子,胡须等 - 在 ARKit 中没有 API。 视力框架可能有所帮助。
不可以。这个信息目前不在
ARKit
中。要检测其他面部特征,您需要运行自己的自定义计算机视觉代码。您可以使用
AVFoundation
从 front-facing 摄像机捕获图像。您可以按如下方式计算纹理坐标: