关于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 最新技术资讯~

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理