现如今,人们在网上聊天、发帖时越来越爱用表情包,表情包一方面是一种个性化的表达方式,另一方面更能传达出当下的心理活动,可以说在网络社交中表情包是一个不可或缺的存在。加上近年来元宇宙的兴起,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. 在开发应用前需要在华为开发者联盟网站上注册成为开发者并完成实名认证,具体方法请参见帐号注册认证。
  1. 华为提供了Maven仓集成方式的AR Engine SDK包,在开始开发前,需要将AR Engine SDK集成到您的开发环境中。
  1. Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请根据您当前的Gradle插件版本,选择对应的配置过程。
  1. 以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 最新技术资讯~

如何用AR Engine开发一个虚拟形象表情包?相关推荐

  1. python做动态表情包下载_用 Python 开发一个【GIF表情包制作神器】

    之前小帅b写过这样一篇教程然后,好多人表示:虽然存了很多表情包但似乎还不是很过瘾因为它不可以自己来定制我们可不可以根据一些表情素材然后自己制作专属表情包呢像这样 本来小帅b想自己实现一个表情包制作器后 ...

  2. 设计模式之美-11| 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?

    十一.设计模式之美-11| 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统? 一.钱包业务背景介绍 一个简单的钱包业务功能如下 1.充值 用户通过三方支付渠道,把自己银行卡账户内的钱, ...

  3. php设置虚拟域名,如何开发一个虚拟域名系统

    如何开发一个虚拟域名系统 更新时间:2006年10月09日 00:00:00   作者: 大家在使用诸如yourname.yeah.net这样的简记域名时都感到十分方便,有很多人在想:我要是能让自己的 ...

  4. php ios表情包,十分钟开发一款 iOS 表情包 App

    十分钟开发一款 iOS 表情包 App 在最近更新的 iOS 10 系统中,苹果开放了 iMessage Stickers 的开发,通俗的说法就是我们现在可以为 iMessage 开发表情包了. 表情 ...

  5. python开发专属表情包_Python开发个人专属的表情包网站

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. "表情包"是一种利用图片来表示感情的一种方式.表情包是 ...

  6. 如何用python画出自己喜欢的表情包

    ​​​​​​​ "表情包"是现在非常流行的交流方式,通过一张图片就能把文字不能表达或不便于表达的情感给表示出来,表情包一经诞生,就统治了中国人的社交圈,尤其是年轻人,他们的社交方式 ...

  7. 如何用 Python 快速开发一个区块链数据结构?

    作者 | arjuna sky kok 整理 | Aholiab 出品 | 区块链大本营(blockchain_camp) 根据IEEE此前的一项调查,Python已成为最受开发者欢迎的语言之一.由于 ...

  8. 32驱动_轻松掌握pinctrl子系统驱动开发——一个虚拟pinctrl dev驱动开发

    这周主要对pinctrl子系统进行分析,该分析的基本上已经分析完成,唯一没有细说的估计就是gpio与pinctrl之间的关联了.本章即是pinctrl子系统分析的最后一章,本章我们主要实现一个虚拟的p ...

  9. 简单实现一个虚拟形象系统

    前言 上周启动居家开会的时候,看到有人通过「虚拟形象」功能,给自己带上了口罩.眼镜之类,于是想到了是不是也可以搞一个简单的虚拟形象系统. 大致想来,分为以下几个部分: 卷积神经网络(CNN) 下面讲解 ...

最新文章

  1. SAP PM 入门系列15 - IW41 维护订单确认
  2. Nagios添加主机监控失败-故障小结
  3. 华为P50相机新升级:或首发索尼最大底手机CMOS
  4. 常用Feed流架构实现
  5. PCL中把txt文件转换成.pcd文件(很简单)
  6. 【AtCoder】ARC065
  7. 图片计算景深matlab程序,在线景深计算器
  8. centos更新yum时遇到的问题
  9. python怎么安装re模块_python模块模块re
  10. Box2D 中文手册
  11. 记录日记软件哪个好用
  12. <van-list> </van-list>列表组件的使用
  13. 赛格曹晓冬分享实录:线下仍是智能硬件产品的主要消费渠道
  14. 文储研习社第11期 | DAO的前世今生
  15. C 商人的诀窍 SDUT
  16. 验证码及验证码透明的背景
  17. Openlayers简介
  18. for循环输出素数探究【java】
  19. 斯阔谷冬奥会首次使用计算机,第八届美国斯阔谷冬奥会_温哥华冬奥会_新浪体育_新浪网...
  20. 一文详解4D Radar成像原理及其应用优势

热门文章

  1. Java读取、写入、处理Excel文件中的数据
  2. 英特尔采用 LLVM 作为最新 C/C++ 编译器
  3. WebDay18 MySQL存储过程 存储函数 触发器 事务
  4. 各个 .NET 平台的 UI 框架比较
  5. 基于springboot+vue+Java线上教学平台( 源码+文档)
  6. 论文写作-如何提高英语论文写作水平
  7. macOS配置vim
  8. RabbitMQ确认应答和确认发布
  9. 二次曲面的绘制函数(一)
  10. 连锁酒店网络互联解决方案