首页 文章

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

提问于
浏览
3

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

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

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

3 回答

  • 6

    你想要面部的 texture-map-style 图像?没有 API 可以帮助您,但您需要的所有信息都在那里:

    • ARFrame.capturedImage为您提供相机图像。

    • ARFaceGeometry为您提供面部的 3D 网格。

    • ARAnchorARCamera一起告诉您脸部相对于相机的位置,以及相机与图像像素的关系。

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

    • 将顶点位置从模型空间转换为相机空间(使用锚点的变换)

    • 与具有该向量的相机投影相乘以获得归一化的图像坐标

    • 除以图像 width/height 以获得像素坐标

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

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


    如果你真正要求的是具有里程碑意义的认可 - e.g. 在相机图像中的位置是眼睛,鼻子,胡须等 - 在 ARKit 中没有 API。 视力框架可能有所帮助。

  • 2

    不可以。这个信息目前不在ARKit中。

    要检测其他面部特征,您需要运行自己的自定义计算机视觉代码。您可以使用AVFoundation从 front-facing 摄像机捕获图像。

  • 1

    您可以按如下方式计算纹理坐标:

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

相关问题