了解如何在您自己的应用中使用“增强型人脸”功能。
构建和运行示例应用
如需构建并运行 AugmentedFaces Java 应用,请执行以下操作:
打开 Android Studio 3.1 或更高版本。建议使用实体设备(而不是 Android 模拟器)来处理增强人脸。设备应通过 USB 连接到开发机器。如需了解详细步骤,请参阅 Android 快速入门。
将 AugmentedFaces Java 示例导入您的项目。
在 Android Studio 中,点击 Run 图标 。然后,选择您的设备作为部署目标,并点击确定以在设备上启动示例应用。
点击批准以授予相机使用示例应用的权限。
应用应打开前置摄像头,并在摄像头画面中立即跟踪您的面部。应该将狐耳朵图像放在额头两侧,并将狐鼻子放在鼻子上方。
在 Sceneform 中使用增强的人脸
将素材资源导入 Sceneform
确保用于增强人脸的素材资源已正确缩放和定位。如需了解相关提示和做法,请参阅为增强型人脸创建素材资源。
如需将纹理和 3D 模型等资源应用于 Sceneform 中的增强人脸网格,请先导入资源。
在运行时,使用 ModelRenderable.Builder
加载 *.sfb
模型,并使用 Texture.Builder
加载人脸的纹理。
// To ensure that the asset doesn't cast or receive shadows in the scene,
// ensure that setShadowCaster and setShadowReceiver are both set to false.
ModelRenderable.builder()
.setSource(this, R.raw.fox_face)
.build()
.thenAccept(
modelRenderable -> {
faceRegionsRenderable = modelRenderable;
modelRenderable.setShadowCaster(false);
modelRenderable.setShadowReceiver(false);
});
// Load the face mesh texture.
Texture.builder()
.setSource(this, R.drawable.fox_face_mesh_texture)
.build()
.thenAccept(texture -> faceMeshTexture = texture);
脸部网格方向
请注意 Sceneform 的人脸网格的方向:
配置 ARCore 会话
增强型人脸需要将 ARCore 现场录像配置为使用前置(自拍)摄像头,并启用人脸网格支持。如需在 Sceneform 中执行此操作,请扩展 ARfragment 类,并替换配置:
@Override
protected Set<Session.Feature> getSessionFeatures() {
return EnumSet.of(Session.Feature.FRONT_CAMERA);
}
@Override
protected Config getSessionConfiguration(Session session) {
Config config = new Config(session);
config.setAugmentedFaceMode(AugmentedFaceMode.MESH3D);
return config;
}
请在 activity 布局中引用此子类化的 ArFragment
类。
获取检测到的人脸的访问权限
AugmentedFace
类扩展了 Trackable
类。在您应用的 Activity 中,使用 AugmentedFace
从addOnUpdateListener()
方法调用获取检测到的人脸。
// Get list of detected faces.
Collection<AugmentedFace> faceList = session.getAllTrackables(AugmentedFace.class);
渲染人脸效果
渲染效果包括以下步骤:
for (AugmentedFace face : faceList) {
// Create a face node and add it to the scene.
AugmentedFaceNode faceNode = new AugmentedFaceNode(face);
faceNode.setParent(scene);
// Overlay the 3D assets on the face.
faceNode.setFaceRegionsRenderable(faceRegionsRenderable);
// Overlay a texture on the face.
faceNode.setFaceMeshTexture(faceMeshTexture);
…
}