AR人体姿态识别,实现无边界的人机交互

ar,人体,姿态,识别,实现,边界,人机交互 · 浏览次数 : 972

小编点评

文章中介绍了华为 HMS Core AR Engine 服务如何识别特定的人体姿势并进行人机交互。以下是文章的关键内容: * HMS Core AR Engine 提供单人身体姿态识别能力,识别六种静态身体姿势并输出识别结果。 * 用户可以通过摄像头切换前后摄像机,实现虚拟世界与现实世界的融合。 * 开发者可以通过 HMS Core SDK 在开发应用中运用人体姿态识别功能,实现交互界面控制、游戏操作动作识别等。 **人体姿态识别服务的步骤:** 1. 获取华为 AR Engine 服务端 APK。 2. 安装和启动服务。 3. 打开应用,选择要识别的姿势。 4. 用户通过摄像头识别姿势。 5. 服务会返回姿势识别结果。 **其他相关信息:** * 服务需要与华为 HMS Core AR Engine 服务端进行连接。 * 服务支持多种编程语言,例如 Java、Kotlin、C#、Python。 * 服务是一个开源项目,可以用于各种应用场景。 **参考资料:** * AR Engine 示例代码-AR Engine | 华为开发者联盟 (huawei.com) * GitHub、Gitee关注我们,第一时间了解 HMS Core 最新技术资讯~

正文

近年来,AR不断发展,作为一种增强现实技术,给用户带来了虚拟和现实世界的融合体验。但用户已经不满足于单纯地将某件虚拟物品放在现实场景中来感受AR技术,更想用身体姿势来触发某个指令,达到更具真实感的人机交互功能。

比如在AR体感游戏中,用户不必点击按键进行频繁操作,通过某个姿势即可触发;在拍摄短视频时,用户无需接触屏幕,摆出不同的姿势便可触发某些特定效果;健身App中,教练进行健身教学时,用户可以摆出相应姿势跟练,由系统识别姿势是否标准。

那么,如何用特定的人体姿势来识别指令进行人机交互呢?

华为HMS Core AR Engine服务给出了解决方案,其中人体姿态识别服务提供了单人身体姿态识别能力,识别六种静态身体姿势并输出识别结果,支持前后摄像机切换,实现虚拟世界与现实世界的融合。

开发者伙伴可将人体姿态识别能力运用在需要识别动作并触发某些事件的应用场景中,比如交互界面控制、游戏操作动作识别等触发类交互行为,是体感应用的基础核心功能,为开发者AR应用提供较远距离远程控制和协作能力,丰富应用交互体验。

下面是开发者应用集成AR Engine人体姿态识别能力的具体步骤。

开发步骤

开发环境要求:

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;
}

2.初始化AR场景:AREngine提供5种场景,包括运动跟踪(ARWorldTrackingConfig)、人脸跟踪(ARFaceTrackingConfig)、手部识别(ARHandTrackingConfig)、人体跟踪(ARBodyTrackingConfig)和图像识别(ARImageTrackingConfig)。

3.调用ARBodyTrackingConfig接口,初始化人体跟踪场景。

  mArSession = new ARSession(context)
  ARBodyTrackingConfig config = new ARHandTrackingConfig(mArSession);
  Config.setEnableItem(ARConfigBase.ENABLE_DEPTH | ARConfigBase.ENABLE.MASK);
  配置session信息
  mArSession.configure(config);

4.初始化BodyRelatedDisplay接口,用于渲染主体AR类型相关数据。

Public interface BodyRelatedDisplay{
     Void init();
     Void onDrawFrame(Collection<ARBody> bodies,float[] projectionMatrix);
  }
  1. 初始化BodyRenderManager类,此类渲染AREngine获取的个人数据。
Public class BodyRenderManager implements GLSurfaceView.Renderer{

		//实现onDrawFrame方法
         Public void onDrawFrame(){
             ARFrame frame = mSession.update();
             ARCamera camera = Frame.getCramera();
             //获取AR相机的投影矩阵。
             Camera.getProjectionMatrix();
             //获取所有指定类型的可跟踪对像集合,传入ARBody.class, 用于人体骨骼跟踪时返回跟踪结果
             Collection<ARBody> bodies = mSession.getAllTrackbles(ARBody.class);
         }
   }
  1. 初始化BodySkeletonDisplay,用来获取骨架数据并将其传递给openGL ES,openGL ES将渲染数据并在屏幕上显示。
Public class BodySkeletonDisplay implements BodyRelatedDisplay{
        //此类需要几个方法
//初始化方法
public void init(){
}
//使用OpenGL更新节点数据并绘制。
Public void onDrawFrame(Collection<ARBody> bodies,float[] projectionMatrix){
   for (ARBody body : bodies) {
            if (body.getTrackingState() == ARTrackable.TrackingState.TRACKING) {
                float coordinate = 1.0f;
                if (body.getCoordinateSystemType() == ARCoordinateSystemType.COORDINATE_SYSTEM_TYPE_3D_CAMERA) {
                    coordinate = DRAW_COORDINATE;
                }
                findValidSkeletonPoints(body);
                updateBodySkeleton();
                drawBodySkeleton(coordinate, projectionMatrix);
            }
        }
}
//查找有效骨架点
private void findValidSkeletonPoints(ARBody arBody) {
        int index = 0;
        int[] isExists;
        int validPointNum = 0;
        float[] points;
        float[] skeletonPoints;

if (arBody.getCoordinateSystemType() == ARCoordinateSystemType.COORDINATE_SYSTEM_TYPE_3D_CAMERA) {
            isExists = arBody.getSkeletonPointIsExist3D();
            points = new float[isExists.length * 3];
            skeletonPoints = arBody.getSkeletonPoint3D();
        } else {
            isExists = arBody.getSkeletonPointIsExist2D();
            points = new float[isExists.length * 3];
            skeletonPoints = arBody.getSkeletonPoint2D();
        }
for (int i = 0; i < isExists.length; i++) {
            if (isExists[i] != 0) {
                points[index++] = skeletonPoints[3 * i];
                points[index++] = skeletonPoints[3 * i + 1];
                points[index++] = skeletonPoints[3 * i + 2];
                validPointNum++;
            }
        }
        mSkeletonPoints = FloatBuffer.wrap(points);
        mPointsNum = validPointNum;
    }
}
  1. 获取骨架点连接数据,并将其传递给OpenGL ES以便在屏幕上渲染。
public class BodySkeletonLineDisplay implements BodyRelatedDisplay {
     //渲染身体骨骼之间的线条。
     public void onDrawFrame(Collection<ARBody> bodies, float[] projectionMatrix) {
        for (ARBody body : bodies) {
            if (body.getTrackingState() == ARTrackable.TrackingState.TRACKING) {
                float coordinate = 1.0f;
                if (body.getCoordinateSystemType() == ARCoordinateSystemType.COORDINATE_SYSTEM_TYPE_3D_CAMERA) {
                    coordinate = COORDINATE_SYSTEM_TYPE_3D_FLAG;
                }
                updateBodySkeletonLineData(body);
                drawSkeletonLine(coordinate, projectionMatrix);
            }
        }
}
}

8.具体实现请参考:AR Engine示例代码-AR Engine | 华为开发者联盟 (huawei.com)

了解更多详情>>

访问华为开发者联盟官网
获取开发指导文档
华为移动服务开源仓库地址:GitHubGitee

关注我们,第一时间了解 HMS Core 最新技术资讯~

与AR人体姿态识别,实现无边界的人机交互相似的内容:

AR人体姿态识别,实现无边界的人机交互

近年来,AR不断发展,作为一种增强现实技术,给用户带来了虚拟和现实世界的融合体验。但用户已经不满足于单纯地将某件虚拟物品放在现实场景中来感受AR技术,更想用身体姿势来触发某个指令,达到更具真实感的人机交互功能。 比如在AR体感游戏中,用户不必点击按键进行频繁操作,通过某个姿势即可触发;在拍摄短视频时

AR空间音频能力,打造沉浸式声音体验

随着元宇宙的兴起,3D虚拟现实广泛引用,让数字化信息和现实世界融合,目前大家的目光主要聚焦于视觉交互层面,为了在虚拟环境中更好的再现真实世界的三维空间体验,引入听觉层面必不可少,空间音频孕育而生。 空间音频是一种音频体验,会让用户更容易体验到声音的立体感和深度,将环绕声更准确地定位在合适的方位,让用

AR Engine光照估计能力,让虚拟物体在现实世界更具真实感

AR是一项现实增强技术,即在视觉层面上实现虚拟物体和现实世界的深度融合,打造沉浸式AR交互体验。而想要增强虚拟物体与现实世界的融合效果,光照估计则是关键能力之一。 人们所看到的世界外观,都是由光和物质相互作用而决定的,当光源照射到物体上时,光线通过被吸收、反射和透射等方式,传递给人们物体的颜色、亮度

AR手势识别交互,让应用更加“得心应手”

现如今, AR技术不断发展,人们不再满足于运用键盘、鼠标等简单器械来实现传统的人机交互模式。随着用户接触机器的多样化,繁琐的操作不但对一些用户有门槛,而且还增加其学习成本;如果能用自然且符合日常生活习惯的人机交互模式,不仅更好上手,也能让开发者们在应用内开发更多玩法。比如在视频直播或者拍照过程中,一

AR Engine毫秒级平面检测,带来更准确的呈现效果

近年来,AR版块成为时下大热,这是一种将现实环境中不存在的虚拟物体融合到真实环境里的技术,用户借助显示设备可以拥有真实的感官体验。AR的应用场景十分广泛,涉及娱乐、社交、广告、购物、教育等领域:AR可以让游戏更具互动性;商品通过AR展示更真实;使用AR进行教育教学让抽象事物更形象等,可以说AR技术已

如何在现实场景中随心放置AR虚拟对象?

随着AR的发展和电子设备的普及,人们在生活中使用AR技术的门槛降低,比如对于不方便测量的物体使用AR测量,方便又准确;遇到陌生的路段使用AR导航,清楚又便捷;网购时拿不准的物品使用AR购物,体验更逼真。 想要让虚拟物体和现实世界相融合,重要的一步就是将虚拟对象准确放置在现实场景中,当用户触摸电子屏幕

ARKit的理解与使用

AR概述 AR的意义:让虚拟世界套与现实世界建立联系,并可以进行互动。 AR的技术实现:通过实时地计算摄影机输出影像的位置及角度,并在内部通过算法识别将场景中的事物,然后在内部模拟的三维坐标系中给识别到的事物建立坐标,然后在特定的坐标上添加相应的图像、视频、3D模型,最终通过手机屏幕合成一个AR效果

如何让虚拟角色自然融入现实?

随着AR的发展,虚拟角色被广泛应用在游戏、直播、社交等App中。例如在直播App里,商家可以自由打造虚拟主播的形象,通过AR算法可以让虚拟形象在介绍时做到不遮挡实物商品,提升直播真实性和趣味性。那么,如何让虚拟角色自然融入现实,实现与用户的真实交互呢? 华为HMS Core AR Engine提供单

[转帖]50年来Intel CPU变化有多大?频率从0.75MHz提升到5.2GHz

https://m.baidu.com/bh/m/detail/ar_9297450181050583423?data_from=lemon 今天(11月15日)是Intel推出4004处理器50周年的日子,当初为日本计算器客户开发的芯片成为全球首个微处理器,并且改变了Intel的发展,从当初的内存

在原生APP中集成Unity容器

随着技术的发展,越来越多的APP期望拥有3D,AR的能力。要达到这个目标可以选择使用原生开发,也可以使用Unity成熟的3D开发技术链,通过嵌入的方式将Unity容器嵌入到APP中。这里介绍的是通过嵌入Unity容器的方式来实现APP的3D,AR能力的。 Unity集成到iOS应用的本质是将Unit