• 构建表情符号制作应用程序


    表情符号是当今在线交流中必不可少的工具,因为它们有助于为基于文本的聊天增添色彩,并允许用户更好地表达其文字背后的情感。由于预设表情符号的数量总是有限的,现在许多应用程序都允许用户创建自己的自定义表情符号,以保持新鲜和令人兴奋。

    例如,在社交媒体应用程序中,不想在视频通话时露脸的用户可以使用动画角色来保护他们的隐私,将他们的面部表情应用到角色上;在直播或电子商务应用程序中,具有逼真的面部表情的虚拟主播更有可能吸引观看者;在视频或照片拍摄应用中,用户可以在自拍时控制动画角色的面部表情,然后将自拍分享到社交媒体;在一款儿童教育应用程序中,一个可爱的动画角色和详细的面部表情将使在线课程对学生来说更加有趣和吸引人。

    我自己正在开发这样一个消息传递应用程序。当与朋友聊天并想用文字以外的方式表达自己时,我的应用程序的用户可以拍照来创建他们自己的表情符号,或者他们选择的动画角色。然后,该应用程序将识别用户的面部表情,并将他们的面部表情应用到表情符号中。通过这种方式,用户可以创造出无穷无尽的独特表情符号。在我的APP开发过程中,我使用了HMS Core AR Engine提供的能力来跟踪用户的面部表情,并将面部表情转化为参数,大大减少了开发工作量。现在我将向您展示我是如何做到这一点的。

    执行

    AR Engine为应用程序提供实时跟踪和识别面部表情的能力,然后将其转化为面部表情参数,用于精确控制虚拟角色的面部表情。

    目前,该套件提供了 64 种面部表情,包括眼皮、眉毛、眼球、嘴巴和舌头的动作。支持眼球运动、睁眼、闭眼等21种眼部相关动作;28 个嘴部动作,包括张嘴、皱起、拉或舔嘴唇,以及移动舌头;以及五个眉毛动作,包括抬高或降低眉毛。

    演示

    基于面部表情的表情符号

    开发流程

    开发环境要求

    JDK:1.8.211 或更高版本

    Android Studio:3.0 或更高版本

    minSdkVersion:26 或更高版本

    targetSdkVersion:29(推荐)

    compileSdkVersion: 29 (推荐)

    Gradle版本:6.1.1或更高版本(推荐)

    确保您已从 AppGallery 下载 AR Engine APK 并将其安装在设备上。

    如果您需要使用多个HMS Core套件,请使用这些套件所需的最新版本。

    准备工作

    1. 开始前,您需要注册成为华为开发者并完成身份验证。您可以点击此处了解详细的注册和身份验证程序。

    2. 开发前,通过Maven 仓库将AR Engine SDK 集成到您的开发环境中。

    3、在Android Studio中配置Maven仓库地址的过程因Gradle plugin 7.0以下版本、Gradle plugin 7.0版本、Gradle plugin 7.1及以上版本而异。需要根据具体的Gradle插件版本进行配置。

    4、以Gradle plugin 7.0为例:

    在你的Android Studio项目中打开项目级的build.gradle文件,配置Maven仓库地址。

    进入buildscript > repositories,配置SDK的Maven仓库地址。

    1. buildscript {
    2. repositories {
    3. google()
    4. jcenter()
    5. maven {url "https://developer.huawei.com/repo/" }
    6. }
    7. }

    打开项目级settings.gradle文件,配置HMS Core SDK的Maven仓库地址。

    1. dependencyResolutionManagement {
    2. repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    3. repositories {
    4. repositories {
    5. google()
    6. jcenter()
    7. maven {url "https://developer.huawei.com/repo/" }
    8. }
    9. }
    10. }

    5. 在dependencies块中添加以下构建依赖项。

    1. dependencies {
    2. implementation 'com.huawei.hms:arenginesdk:{version}
    3. }

    应用程序开发

    1. 检查当前设备是否安装了AR Engine。如果是,您的应用程序可以正常运行。如果没有,您需要提示用户安装它,例如,通过将用户重定向到 AppGallery。示例代码如下:

    1. boolean isInstallArEngineApk =AREnginesApk.isAREngineApkReady(this);
    2. if (!isInstallArEngineApk) {
    3. // ConnectAppMarketActivity.class is the activity for redirecting users to AppGallery.
    4. startActivity(new Intent(this, com.huawei.arengine.demos.common.ConnectAppMarketActivity.class));
    5. isRemindInstall = true;
    6. }

    2.创建一个AR场景。AR Engine支持五个场景,包括运动追踪(ARWorldTrackingConfig)、人脸追踪(ARFaceTrackingConfig)、手部识别(ARHandTrackingConfig)、人体追踪(ARBodyTrackingConfig)、图像识别(ARImageTrackingConfig)。

    下面以调用ARFaceTrackingConfig创建人脸跟踪场景为例。

    1. // Create an ARSession object.
    2. mArSession = new ARSession(this);
    3. // Select a specific Config to initialize the ARSession object based on the application scenario.
    4. ARFaceTrackingConfig config = new ARFaceTrackingConfig(mArSession);

    使用config.set XXX方法设置场景参数。

    1. // Set the camera opening mode, which can be external or internal. The external mode can only be used in ARFace. Therefore, you are advised to use the internal mode.
    2. mArConfig.setImageInputMode(ARConfigBase.ImageInputMode.EXTERNAL_INPUT_ALL);

    3. 设置人脸追踪的AR场景参数,开启人脸追踪。

    1. mArSession.configure(mArConfig);
    2. mArSession.resume();

    4.初始化FaceGeometryDisplay类,获取人脸几何数据,并将数据渲染到屏幕上。

    1. public class FaceGeometryDisplay {
    2. // Initialize the OpenGL ES rendering related to face geometry, including creating the shader program.
    3. void init(Context context) {...
    4. }
    5. }

    5、在FaceGeometryDisplay类中初始化onDrawFrame方法,调用face.getFaceGeometry()获取人脸网格。

    1. public void onDrawFrame(ARCamera camera, ARFace face) {
    2. ARFaceGeometry faceGeometry = face.getFaceGeometry();
    3. updateFaceGeometryData(faceGeometry);
    4. updateModelViewProjectionData(camera, face);
    5. drawFaceGeometry();
    6. faceGeometry.release();
    7. }

    6.在FaceGeometryDisplay类中初始化updateFaceGeometryData() 。

    使用 OpenGl ES 传递用于配置的面部网格数据和设置面部表情参数。

    1. private void updateFaceGeometryData (ARFaceGeometry faceGeometry) {
    2. FloatBuffer faceVertices = faceGeometry.getVertices();
    3. FloatBuffer textureCoordinates =faceGeometry.getTextureCoordinates();
    4. // Obtain an array consisting of face mesh texture coordinates, which is used together with the vertex data returned by getVertices() during rendering.
    5. }

    7、初始化FaceRenderManager类,管理人脸数据渲染。

    1. public class FaceRenderManager implements GLSurfaceView.Renderer {
    2. public FaceRenderManager(Context context, Activity activity) {
    3. mContext = context;
    4. mActivity = activity;
    5. }
    6. // Set ARSession to obtain the latest data.
    7. public void setArSession(ARSession arSession) {
    8. if (arSession == null) {
    9. LogUtil.error(TAG, "Set session error, arSession is null!");
    10. return;
    11. }
    12. mArSession = arSession;
    13. }
    14. // Set ARConfigBase to obtain the configuration mode.
    15. public void setArConfigBase(ARConfigBase arConfig) {
    16. if (arConfig == null) {
    17. LogUtil.error(TAG, "setArFaceTrackingConfig error, arConfig is null.");
    18. return;
    19. }
    20. mArConfigBase = arConfig;
    21. }
    22. // Set the camera opening mode.
    23. public void setOpenCameraOutsideFlag(boolean isOpenCameraOutsideFlag) {
    24. isOpenCameraOutside = isOpenCameraOutsideFlag;
    25. }
    26. ...
    27. @Override
    28. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    29. mFaceGeometryDisplay.init(mContext);
    30. }
    31. }

    8、通过调用FaceActivityFaceRenderManagersetArSessionsetArConfigBase等方法实现人脸追踪效果。

    1. public class FaceActivity extends BaseActivity {
    2. @Override
    3. protected void onCreate(Bundle savedInstanceState) {
    4. mFaceRenderManager = new FaceRenderManager(this, this);
    5. mFaceRenderManager.setDisplayRotationManage(mDisplayRotationManager);
    6. mFaceRenderManager.setTextView(mTextView);
    7. glSurfaceView.setRenderer(mFaceRenderManager);
    8. glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    9. }
    10. }

    结论

    表情符号允许用户以文字无法表达的方式表达他们的心情和兴奋。您现在可以让用户自己创建表情符号,让您的应用程序更有趣,而不是为用户提供已被使用一百万次的陈旧无聊预设表情符号的选择!用户可以轻松创建带有自己微笑的表情符号,只需面对镜头,选择他们喜欢的动画角色,然后微笑。有了这种自定义表情符号的能力,用户将能够以更加个性化和有趣的方式表达他们的感受。 

  • 相关阅读:
    外贸业务员如何通过google搜索多个关键词批量提取客户网址?
    如何监控容器或K8s中的OpenSearch
    Problem A: 两个有序链表序列的合并
    Java接入sqlserver的一些坑点记录
    Android学习笔记 38. 网络加载框架Retrofit
    python数字
    Docker简介与为什么要用Docker?
    postgresql字符串处理的函数
    [TAPL] 概念笔记
    CCF-CSP 30次 第二题【矩阵运算】
  • 原文地址:https://blog.csdn.net/wouderw/article/details/127974362