关于android:如何用AR-Engine开发一个虚拟形象表情包

现如今,人们在网上聊天、发帖时越来越爱用表情包,表情包一方面是一种个性化的表达方式,另一方面更能传播出当下的心理流动,能够说在网络社交中表情包是一个不可或缺的存在。加上近年来元宇宙的衰亡,3D虚构形象广泛应用,用户能够通过本人的表情来管制虚构形象的表情,做一系列专属的表情包,更加活泼形象。

那么,如何让虚构形象领有人类一样多变的表情呢?HMS Core AR Engine的人脸表情跟踪能力就能帮忙实现,实时计算人脸各表情对应的参数值。用户可通过本人的面部动作,管制虚构人物的表情,最终制作成虚构人物的各种活泼的表情,以更乏味的模式配合传播文字情绪,同时也极大不便了虚构人物的表情制作等利用场景。

比方在社交App中,不想露脸的人能够把本人的喜怒哀乐通过虚构形象的表情传播,在爱护隐衷的同时又减少了趣味性。在直播、电商App里,为了防止同质化,商家利用虚构主播的表情生动性可能给用户带来更活泼的生产场景以及离奇的互动体验,激发年轻人对沉迷式虚构娱乐和数字生产的需要。在短视频、拍照等App中,用户利用人脸表情管制虚构形象的表情,进行自我展现与表白,拉近人与人的间隔;而在教育、文旅等App中,捕获人脸图像信息,实时将其了解成人脸表情内容,用虚构形象进行解说教学更加活泼,激发用户的学习趣味。

实现办法

AR Engine提供“人脸表情跟踪”能力,可实时跟踪获取人脸图像信息,计算人脸的位姿,并将其了解成人脸表情内容,并转化成各种表情参数,利用表情参数能够实现人脸表情间接管制虚构形象的表情。AR Engine目前共提供64种表情,蕴含眼睛、眉毛、眼球、嘴巴、舌头等次要脸部器官的表情动作。眼部共有21种表情,包含眼球的挪动、睁闭眼、眼皮的微动作等;嘴部共有28种表情,包含张嘴噘嘴、嘴角下拉、抿嘴唇、舌头的动作等;眉毛共有5种表情,包含抬眉、单侧眉毛朝下或抬上等。其余具体表情参数可见FaceAR设计规范。

成果展现

开发步骤

开发环境要求:

JDK 1.8.211及以上。
装置Android Studio 3.0及以上:
minSdkVersion 26及以上
targetSdkVersion 29(举荐)
compileSdkVersion 29(举荐)
Gradle 6.1.1及以上(举荐)

在华为终端设备上的利用市场下载AR Engine服务端APK(需在华为利用市场,搜寻“华为AR Engine”)并装置到终端设备。

测试利用的设施:参见AREngine个性软硬件依赖表。如果同时应用多个HMS Core的服务,则须要应用各个Kit对应的最大值。

开发筹备

  1. 在开发利用前须要在华为开发者联盟网站上注册成为开发者并实现实名认证,具体方法请参见帐号注册认证。
  2. 华为提供了Maven仓集成形式的AR Engine SDK包,在开始开发前,须要将AR Engine SDK集成到您的开发环境中。
  3. Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle插件版本,抉择对应的配置过程。
  4. 以7.0为例:

关上Android Studio我的项目级“build.gradle”文件,增加Maven代码库。

在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。

buildscript {
        repositories {
            google()
            jcenter()
            maven {url "https://developer.huawei.com/repo/" }
        }
}

关上我的项目级“settings.gradle”文件,配置HMS Core SDK的Maven仓地址

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
            repositories {
                    repositories {
                            google()
                        jcenter()
                        maven {url "https://developer.huawei.com/repo/" }
                    }
                }
}
  1. 增加依赖 在“dependencies”中增加如下编译依赖:
dependencies {
    implementation 'com.huawei.hms:arenginesdk:{version}
}

利用开发

  1. 运行前验证:查看以后设施是否装置了AR Engine,若曾经装置则失常运行,若没有装置,App应采纳适合的形式揭示用户装置AR Engine,如被动跳转利用市场,申请装置AR Engine。具体实现代码如下
boolean isInstallArEngineApk =AREnginesApk.isAREngineApkReady(this);
if (!isInstallArEngineApk) {
    // ConnectAppMarketActivity.class为跳转利用市场的Activity。
startActivity(new Intent(this, com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));
    isRemindInstall = true;
}
  1. 创立AR场景:AR Engine提供5种场景,包含静止跟踪(ARWorldTrackingConfig)、人脸跟踪(ARFaceTrackingConfig)、手部辨认(ARHandTrackingConfig)、人体跟踪(ARBodyTrackingConfig)和图像识别(ARImageTrackingConfig)。
    调用ARFaceTrackingConfig接口,创建人脸跟踪。
// 创立ARSession。
mArSession = new ARSession(this);
// 依据要应用的具体场景,选用具体的Config来初始化ARSession。
ARFaceTrackingConfig config = new ARFaceTrackingConfig(mArSession);

创建人脸跟踪ARSession后,可通过config.setXXX办法配置场景参数

//设置相机的打开方式,内部关上或外部关上,其中内部关上只能在ARFace中应用,举荐应用外部关上相机的形式。
mArConfig.setImageInputMode(ARConfigBase.ImageInputMode.EXTERNAL_INPUT_ALL);
  1. 配置人脸跟踪AR场景参数,启动人脸跟踪场景:
mArSession.configure(mArConfig);
mArSession.resume();
  1. 创立FaceGeometryDisplay类,此类是获取人脸几何数据,并在屏幕上渲染数据
public class FaceGeometryDisplay {
//初始化与面几何体相干的OpenGL ES渲染,包含创立着色器程序。
void init(Context context) {...
}
}
  1. 在FaceGeometryDisplay类中创立,onDrawFrame办法,用face.getFaceGeometry()办法来获取人脸Mesh
public void onDrawFrame(ARCamera camera, ARFace face) {
    ARFaceGeometry faceGeometry = face.getFaceGeometry();
    updateFaceGeometryData(faceGeometry);
    updateModelViewProjectionData(camera, face);
    drawFaceGeometry();
    faceGeometry.release();
}
  1. 在FaceGeometryDisplay类中创立办法updateFaceGeometryData()传入人脸Mesh数据进行配置 用OpenGl来设置表情参数
private void  updateFaceGeometryData(ARFaceGeometry faceGeometry){
FloatBuffer faceVertices = faceGeometry.getVertices();
FloatBuffer textureCoordinates =faceGeometry.getTextureCoordinates();
//获取人脸Mesh纹理坐标点数组,在渲染时,与getVertices()返回的顶点数据配合应用。 
}
  1. 创立FaceRenderManager类,此类来治理与人脸数据相干的渲染:
public class FaceRenderManager implements GLSurfaceView.Renderer {
//构造函数初始化上下文和activity
public FaceRenderManager(Context context, Activity activity) {
    mContext = context;
    mActivity = activity;
}
//设置ARSession,获取最新数据
public void setArSession(ARSession arSession) {
    if (arSession == null) {
        LogUtil.error(TAG, "Set session error, arSession is null!");
        return;
    }
    mArSession = arSession;
}
//设置ARConfigBase,获取配置模式。
public void setArConfigBase(ARConfigBase arConfig) {
    if (arConfig == null) {
        LogUtil.error(TAG, "setArFaceTrackingConfig error, arConfig is null.");
        return;
    }
    mArConfigBase = arConfig;
}
//设置外置摄像头打开方式
public void setOpenCameraOutsideFlag(boolean isOpenCameraOutsideFlag) {
    isOpenCameraOutside = isOpenCameraOutsideFlag;
}
...
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
mFaceGeometryDisplay.init(mContext);
}
}
  1. 最初在FaceActivity中 调用办法:通过设置这些办法来实现最终的成果
public class FaceActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
mFaceRenderManager = new FaceRenderManager(this, this);
mFaceRenderManager.setDisplayRotationManage(mDisplayRotationManager);
mFaceRenderManager.setTextView(mTextView);

glSurfaceView.setRenderer(mFaceRenderManager);
glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
}
}

具体实现可参考示例代码。

理解更多详情>>

拜访华为开发者联盟官网
获取开发领导文档
华为挪动服务开源仓库地址:GitHub、Gitee

关注咱们,第一工夫理解 HMS Core 最新技术资讯~

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理