随着AR的倒退,虚构角色被广泛应用在游戏、直播、社交等App中。例如在直播App里,商家能够自在打造虚构主播的形象,通过AR算法能够让虚构形象在介绍时做到不遮挡实物商品,晋升直播真实性和趣味性。那么,如何让虚构角色天然融入事实,实现与用户的实在交互呢?

华为HMS Core AR Engine提供单人或双人身材轮廓的辨认和跟踪能力,实时输入人体轮廓Mask信息和对应的骨骼点信息。其中人体Mask能力能够辨认和跟踪以后画面人体所在区域,反对多人辨认,识别率达90%,并提供该区域的深度信息。

通过人体轮廓跟踪能力,开发者们可利用人体的轮廓Mask信息对虚构物体和场景进行遮蔽。比方在AR拍照时更换虚构背景、让虚构玩偶躲到人身后等,都可应用Mask能力来实现更为天然的遮挡成果,这可进一步晋升AR利用的真实感和观看体验。

Demo演示

开发步骤

开发筹备

1 .注册成为开发者

在开发利用前须要在华为开发者联盟网站上注册成为开发者并实现实名认证,具体方法请参见帐号注册认证。

2 .创立利用

参见创立我的项目和在我的项目下创立利用实现利用的创立,配置如下:

“抉择平台”:抉择“Android”。

“反对设施”:抉择“手机”。

“利用分类”:抉择“利用”或“游戏”。

3 .集成AR Engine SDK

华为提供了Maven仓集成形式的AR Engine SDK包,在开始开发前,须要将AR Engine SDK集成到您的开发环境中。

4 .配置AR Engine SDK的Maven仓地址

Android Studio的代码库配置在Gradle插件7.0以下版本、7.0版本和7.1及以上版本有所不同。请依据您以后的Gradle插件版本,抉择对应的配置过程。

5 .增加编译依赖
  1. 关上我的项目中利用级的“build.gradle”文件。

  2. 在“dependencies”中增加如下编译依赖。
dependencies {    implementation 'com.huawei.hms:arenginesdk:{version}'}
  1. 从新关上批改完的build.gradle文件,右上方呈现Sync Now链接。点击“Sync Now”期待同步实现。

利用开发

运行前验证

查看以后设施是否装置了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. 创立BodyActivity用来展现AR Engine辨认能力,展现身材骨骼,输入人体特色。
Public class BodyActivity extends BaseActivity{Private BodyRendererManager mBodyRendererManager;Protected void onCreate(){    //初始化surfaceView    mSurfaceView = findViewById();    //放弃OpenGL ES运行上下文。    mSurfaceView.setPreserveEGLContextOnPause(true);    //设置OpenGLES版本。    mSurfaceView.setEGLContextClientVersion(2);    //设置EGL配置选择器,包含色彩缓冲区的位数和深度位数。    mSurfaceView.setEGLConfigChooser(……);    mBodyRendererManager = new BodyRendererManager(this);    mSurfaceView.setRenderer(mBodyRendererManager);mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);        }Protected void onResume(){    //初始化ARSession,用于治理AR Engine的整个运行状态If(mArSession == null){mArSession = new ARSession(this.getApplicationContext());mArConfigBase = new ARBodyTrackingConfig(mArSession);mArConfigBase.setEnableItem(ARConfigBase.ENABLE_DEPTH | ARConfigBase.ENABLE_MASK);mArConfigBase.setFocusMode(ARConfigBase.FocusMode.AUTO_FOCUSmArSession.configure(mArConfigBase);    }    //给setBodyMask传入须要的参数mBodyRendererManager.setBodyMask(((mArConfigBase.getEnableItem() & ARConfigBase.ENABLE_MASK) != 0) && mIsBodyMaskEnable);sessionResume(mBodyRendererManager);        }}
  1. 创立BodyRendererManager, 此类渲染AR Engine获取的集体数据。
Public class BodyRendererManager extends BaseRendererManager{    Public void drawFrame(){    //获取所有指定类型的可跟踪对像汇合Collection<ARBody> bodies = mSession.getAllTrackables(ARBody.class);         for (ARBody body : bodies) {if (body.getTrackingState() != ARTrackable.TrackingState.TRACKING){                continue;          }mBody = body;hasBodyTracking = true;    }    //更新屏幕上显示的身材辨认信息。StringBuilder sb = new StringBuilder();        updateMessageData(sb, mBody);Size textureSize = mSession.getCameraConfig().getTextureDimensions();if (mIsWithMaskData && hasBodyTracking && mBackgroundDisplay instanceof BodyMaskDisplay) {            ((BodyMaskDisplay) mBackgroundDisplay).onDrawFrame(mArFrame, mBody.getMaskConfidence(),            textureSize.getWidth(), textureSize.getHeight());      }    //在屏幕上显示更新后的身材信息。mTextDisplay.onDrawFrame(sb.toString());for (BodyRelatedDisplay bodyRelatedDisplay : mBodyRelatedDisplays) {             bodyRelatedDisplay.onDrawFrame(bodies, mProjectionMatrix);        } catch (ArDemoRuntimeException e) {             LogUtil.error(TAG, "Exception on the ArDemoRuntimeException!");        } catch (ARFatalException | IllegalArgumentException | ARDeadlineExceededException |        ARUnavailableServiceApkTooOldException t) {            Log(…);        }}//更新手势相干数据以进行显示。Private void updateMessageData(){       if (body == null) {            return;        }      float fpsResult = doFpsCalculate();      sb.append("FPS=").append(fpsResult).append(System.lineSeparator());      int bodyAction = body.getBodyAction();sb.append("bodyAction=").append(bodyAction).append(System.lineSeparator());}}
  1. 自定义相机预览类,用于实现基于肯定置信度的人体绘制。
Public class BodyMaskDisplay implements BaseBackGroundDisplay{}
  1. 获取骨架数据并将其传递给OpenGL ES,OpenGL ES将渲染数据并在屏幕上显示。
public class BodySkeletonDisplay implements BodyRelatedDisplay {
  1. 获取骨架点连贯数据,并将其传递给OpenGL ES以便在屏幕上渲染。
public class BodySkeletonLineDisplay implements BodyRelatedDisplay {}

其余类内容请参考示例代码集成。

理解更多详情>>

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

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