如何让虚拟角色自然融入现实?
随着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 .添加编译依赖
- 打开项目中应用级的“build.gradle”文件。
- 在“dependencies”中添加如下编译依赖。
dependencies { implementation 'com.huawei.hms:arenginesdk:{version}' }
- 重新打开修改完的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; }
- 创建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_FOCUS mArSession.configure(mArConfigBase); } //给setBodyMask传入需要的参数 mBodyRendererManager.setBodyMask(((mArConfigBase.getEnableItem() & ARConfigBase.ENABLE_MASK) != 0) && mIsBodyMaskEnable); sessionResume(mBodyRendererManager); } }
- 创建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()); } }
- 自定义相机预览类,用于实现基于一定置信度的人体绘制。
Public class BodyMaskDisplay implements BaseBackGroundDisplay{}
- 获取骨架数据并将其传递给OpenGL ES,OpenGL ES将渲染数据并在屏幕上显示。
public class BodySkeletonDisplay implements BodyRelatedDisplay {
- 获取骨架点连接数据,并将其传递给OpenGL ES以便在屏幕上渲染。
public class BodySkeletonLineDisplay implements BodyRelatedDisplay {}
其他类内容请参考示例代码集成。
了解更多详情>>
访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHub、Gitee
关注我们,第一时间了解 HMS Core 最新技术资讯~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
GPT-4 来了!这些开源的 GPT 应用又要变强了
近日,在 GPT-3.5 发布的半年后,OpenAI 正式推出了大版本的 GPT-4,不同于 GPT-3 到 GPT-3.5 耗时两年,这次版本升级只用了半年。如果你对 OpenAI 不熟悉,答应我读下这篇《ChatGPT 会开源吗?》 ,它详细介绍了 OpenAI 这家公司及其产品。 为了让你快速“入戏”,这里简单引用下 ChatGPT 对 GPT 的介绍: GPT-4 vs 3.5 在读完多篇媒体和 OpenAI 官方对 GPT-4 的介绍之后,现在我对 GPT-4 有了一个清晰的认知:它绝对是个资深体坛选手,淋漓尽致地发挥了“更快、更高、更强”的体育精神。 根据官方的发布的报告,GPT-4 相较于之前的 GPT-3.5 大幅度地提升了理解力和表达能力,换成专业术语就是 GPT-4 用了更多的数据量来训练,有着更高级的推理能力和支持了多模态。它的理解力和表达力体现在了,GPT-4 参加美国高考能考 710 分,以及通过了模拟的律师考试。更重要的在官方发布的 GPT-4 测试报告中显示,它竟然能刷 LeetCode,那以后出去面试带上 GPT-4 的工具,offer 岂不手到擒来!(...
- 下一篇
【微电平台】-高并发实战经验-奇葩问题解决之旅
作者:京东科技 孙亮 微电平台 微电平台是集电销、企业微信等于一体的综合智能SCRM SAAS化系统,涵盖多渠道管理、全客户生命周期管理、私域营销运营等主要功能,目前已经有60+京东各业务线入驻,专注于为业务提供职场外包式的一站式客户管理及一体化私域运营服务。 导读 本文介绍电销系统在遇到【客户名单离线打标】问题时,从排查、反复验证到最终解决问题并额外提升50%吞吐的过程,适合所有服务端研发同学,提供生产环遇到一些复杂问题时排查思路及解决方案,正确使用京东内部例如sgm、jmq、jsf等工具抓到问题根因并彻底解决,用技术为业务发展保驾护航~ 下面开始介绍电销系统实际生产环境遇到的离线拒绝营销打标流程吞吐问题。 案例背景 1、概述 每日凌晨1~8点会使用80台机器为电销系统上亿客户名单进行拒绝营销打标,平均95万名单/分钟,拒绝营销jsf服务总tps约2万****,**tp99在100~110ms,若夜间没有完成标记加工操作,会导致白天职场无法正常作业,并且存在客户骚扰隐患、降低职场运营效率的问题,因外部接口依赖数量较多**打标程序只能凌晨启动和结束。 2、复杂度 面向业务提供千人千面的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能