【问题标题】:iOS11 ARKit: Can ARKit also capture the Texture of the user's face?iOS11 ARKit:ARKit也能捕捉到用户面部的Texture吗?
【发布时间】:2018-04-23 19:55:36
【问题描述】:

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

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

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

【问题讨论】:

    标签: ios ios11 arkit iphone-x


    【解决方案1】:

    您想要一张纹理贴图风格的面部图像吗?没有任何 API 可以完全满足您的要求,但您需要的所有信息都在那里:

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

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

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

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

    如果您想知道相机图像中的每个像素对应于面部几何图形的哪个部分,那就有点困难了。您不能仅仅颠倒上述数学,因为您缺少每个像素的深度值......但如果您不需要映射每个像素,SceneKit 命中测试是获取单个像素几何的简单方法。


    如果您实际要求的是地标识别 - 例如相机图像中的位置是眼睛、鼻子、胡须等——ARKit 中没有用于这些的 API。 Vision 框架可能会有所帮助。

    【讨论】:

    • 非常感谢您的出色回答。我正在遵循从 ARFaceGeometry 操作纹理坐标缓冲区的方法,它看起来很有希望。
    • @rickster 我可以假设(使用上面的“一次性”技术)与其尝试操纵相机图像以适应纹理坐标,不如不理会相机图像,并操纵.obj 文件中的纹理坐标?
    • @coco 什么 obj 文件? ARFaceGeometry 提供了一个新的面部网格,更新了顶点位置以匹配面部的当前姿势/表情,在每一帧。所以“all at once”是“all at once per frame”;也就是说,每次你得到一个具有更新几何的新锚点时,你都会遍历它的顶点缓冲区并生成一个新的纹理坐标缓冲区,将每个顶点映射到视频图像中当前该顶点“后面”的点.
    • 在我建议的两种方法中,您都不会操纵图像——这完全是关于操纵纹理坐标(使用顶点位置数据),以便将纹理样本放入图像中,使您的像素与当前面部网格的位置相匹配. “一次全部”意味着处理整个顶点缓冲区(可能在 CPU 上);另一种方法是在GPU 渲染期间执行此操作,因为搞乱顶点属性(如位置/texcoord)正是顶点着色器的用途。
    • 谢谢@rickster。在我对此的探索中,我首先处理单个帧,这就是我将数据导出为 .obj 文件的原因,以便更轻松地查看结果。
    【解决方案2】:

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

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

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

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

    几乎所有的工作都是在金属渲染过程中完成的,因此它很容易实时运行。

    我还 put together some notes 介绍了演示的局限性


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

    • 将转换后的 ARSCNFaceGeometry 渲染到 1 位缓冲区以创建 image mask。基本上你只想要面部模型看起来是白色的地方,而其他一切都应该是黑色的。

    • 将蒙版应用于捕获的帧图像。

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

    【讨论】:

    • 嗨,马特,这是一个很好的例子,但是如果我们想要用 ARMesh(在 ARKit 3.5 中引入)而不是 Face,我们可以实现它吗?如果是的话,你能解释一下我们该怎么做吗?
    • 核心逻辑应该相同,您只需更新FaceTextureGenerator.swift 以从跟踪用户面部的 ARMesh 中提取几何体,而不是从 SceneKit 几何体中提取几何体
    • @MattBierner 能否告诉我们您的项目与 Apple 的 Augmented Faces 演示项目之间的区别?还有一个想法是将纹理输出到面部的 UVW 贴图,以便它可以来回映射,谢谢!
    • 苹果视频面部纹理演示使用片段着色器绘制面部几何图形,该片段着色器从捕获的图像中采样(更像是后期处理效果)。我的示例为每一帧的面部几何图形生成一个新的纹理贴图。然后,您可以将此纹理应用回一个单独的面部几何体,该几何体可以独立于用户的实际面部进行变换
    • @MattBierner 我和 Ali Aeman 有同样的问题。你能提供一个样本吗?
    【解决方案3】:

    可以如下计算纹理坐标:

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

    【讨论】:

    • 那么,通过这个我可以知道每个图像像素在那一刻映射到纹理坐标的位置?假设我想创建一个对面部进行采样的漫反射贴图,为每个像素绘制漫反射贴图
    • 我已将此应用于 SCNGeometry 纹理坐标源。但它会产生奇怪的结果......有什么想法吗?
    【解决方案4】:

    没有。 ARKit 目前没有该信息。

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

    【讨论】:

    • 你把问题复杂化了,忽略了已经提供的 arkit 丰富的资源。您应该能够将相机输入 1:1 投影到面部网格。
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 2010-10-25
    • 2012-11-10
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多