如何在iPhone本地保存照片上创建ARFaceAnchor实现人脸AR特效
问题描述
我近期参考苹果官方tracking and visualizing faces示例代码,基于指定的ARSCNDelegate实现ARFaceAnchor生成逻辑,核心代码如下:
protocol VirtualContentController: ARSCNViewDelegate { // The root node for the virtual content. var contentNode: SCNNode? { get set } func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) } func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) { guard let faceAnchor = anchor as? ARFaceAnchor, let contentController = faceAnchorsAndContentControllers[faceAnchor], let contentNode = contentController.contentNode else { return } // do stuff with the faceAnchor... }
上述代码中
faceAnchorsAndContentControllers是示例代码用于切换不同ARFaceAnchor特效的简单枚举类型。
目前我希望能够针对本地已保存的照片创建faceAnchor。我已知在实时相机流场景下,平面人脸静态图像(例如墙上张贴的人像照片)可和具备真实深度信息的人脸一样被检测识别。请问是否存在方案可以“诱导”ARSession在iPhone本地存储的图片文件中放置SCNNode?这样我就可以复用现有为实时采集场景搭建的基础设施,直接为已保存的图片生成对应的AR特效。
回答
没有公开API可以直接让ARSession读取本地存储的图片文件、自动生成ARFaceAnchor,核心限制如下:
ARSession的人脸检测、锚点生成逻辑完全绑定实时相机采集的连续视频流,同时会匹配设备运动传感器数据做几何校验,没有支持传入静态本地图片作为输入源的公开接口。- 你提到的“实时相机流中可以识别平面人像照片上的人脸”,是ARKit对连续视频帧中人脸特征做逐帧追踪估算的结果,单张静态图片无法满足ARKit追踪所需的连续帧校验要求,无法触发自动的人脸锚点生成。
如果要复用现有基于ARFaceAnchor搭建的特效渲染逻辑,无需重构现有代码,按以下步骤适配即可:
- 第一步:使用系统原生
Vision框架的VNDetectFaceLandmarksRequest接口对本地存储的图片做人脸检测,拿到人脸的边界框、面部关键点坐标、人脸俯仰/偏航/翻滚角姿态参数,这套数据结构和ARFaceAnchor提供的人脸拓扑结构完全对齐。 - 第二步:手动初始化
ARFaceAnchor实例,将Vision检测到的人脸几何参数映射到ARFaceAnchor的对应属性中;如果不需要动态表情效果,blendShapes参数可先填充默认值;锚点的变换矩阵根据你展示本地图片的位置、缩放比例计算,确保人脸坐标和图片显示位置对齐。 - 第三步:调用
ARSCNView实例的session.add(anchor:)方法,把手动构造的ARFaceAnchor加入当前运行的会话。你的现有ARSCNViewDelegate回调逻辑会被正常触发,之前写好的所有AR特效渲染代码不需要修改就可以直接运行。
不要尝试伪造虚拟相机输入给ARSession喂本地图片帧的方案:ARKit会强制校验视频帧和设备运动传感器数据的一致性,伪造输入大概率会触发会话报错中断,稳定性极差,完全无法在生产环境使用。
内容的提问来源于stack exchange,提问作者Saul Aryeh Kohn
相关产品推荐
相关产品推荐

