乐趣区

关于android:AR人体姿态识别实现无边界的人机交互

近年来,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)

理解更多详情 >>

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

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

退出移动版