DEV Community

HuaweiDevsLATAM
HuaweiDevsLATAM

Posted on

Seguimiento del cuerpo humano con AR Engine

Alt text of image

Introducción

HUAWEI AR Engine tiene soporte para detectar objetos en el mundo real que se llama “Seguimiento del entorno” y con él puede registrar iluminación, plano, imagen, objeto, superficie y otra información ambiental para ayudar a sus aplicaciones a fusionar objetos virtuales en escenarios físicos. mundo.

Body tracking

Esta función identifica y rastrea ubicaciones 2D para 23 puntos del esqueleto corporal (o ubicaciones 3D de 15 puntos del esqueleto corporal) y admite el seguimiento de una o dos personas a la vez.
AR Engine reconoce cuerpos humanos y genera coordenadas 2D y 3D (basadas en SLAM) de puntos del esqueleto, y es capaz de cambiar entre las cámaras delantera y trasera.
La capacidad de seguimiento del cuerpo le permite superponer objetos virtuales en el cuerpo con un alto grado de precisión, como en el hombro izquierdo o el tobillo derecho. También puede realizar una mayor cantidad de acciones precisas en el avatar, dotando a sus aplicaciones de AR con una funcionalidad divertida.
Alt text of image

Ejemplo de aplicación de Android

Para este ejemplo, trabajaremos en el seguimiento del entorno para que podamos detectar una mano e interactuar con ella.

Proceso de desarrollo

Crear una aplicación

Cree una aplicación siguiendo las instrucciones de Creating an AppGallery Connect Project y Adding an App to the Project.
Platforma: Android
Dispositivo: Mobile phone
App category: App or Game

Integración de HUAWEI AR Engine SDK

Antes del desarrollo, integre HUAWEI AR Engine SDK a través del repositorio de Maven en su entorno de desarrollo.
Abra el archivo build.gradle en el directorio raíz de su proyecto de Android Studio.

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        jcenter()
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.0.1"
        classpath 'com.huawei.agconnect:agcp:1.3.2.301'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        maven {url 'https://developer.huawei.com/repo/'}
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
Enter fullscreen mode Exit fullscreen mode

Abra el archivo build.gradle en el directorio de la aplicación de su proyecto

apply plugin: 'com.android.application'
android {
    compileSdkVersion 30
    buildToolsVersion "30.0.1"
defaultConfig {
        applicationId "com.vsm.myarapplication"
        minSdkVersion 27
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    testImplementation 'junit:junit:4.12'
    //
    implementation 'com.huawei.agconnect:agconnect-core:1.4.2.301'
    //
    implementation 'com.huawei.hms:arenginesdk:2.15.0.1'
    //
    implementation 'de.javagl:obj:0.3.0'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
apply plugin: 'com.huawei.agconnect'
Enter fullscreen mode Exit fullscreen mode

Creas tu actividad en la que trabajarás (activity_body.xml):

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".body.BodyActivity">
<android.opengl.GLSurfaceView
        android:id="@+id/bodySurfaceview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="top"
        tools:ignore="MissingConstraints" />
<TextView
        android:id="@+id/bodyTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textColor="@color/red"
        tools:layout_editor_absoluteX="315dp"
        tools:layout_editor_absoluteY="4dp"
        tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
Enter fullscreen mode Exit fullscreen mode

AR Engine no es para todos los dispositivos, por lo que primero debemos validar si el dispositivo es compatible con AR Engine y está disponible, aquí está la lista de dispositivos compatibles
Alt text of image

Utilizará estos métodos para comprobar si un dispositivo es compatible:

Métodos

private void setMessageWhenError(Exception catchException) {
    if (catchException instanceof ARUnavailableServiceNotInstalledException) {
        startActivity(new Intent(getApplicationContext(), ConnectAppMarketActivity.class));
    } else if (catchException instanceof ARUnavailableServiceApkTooOldException) {
        message = "Please update HuaweiARService.apk";
    } else if (catchException instanceof ARUnavailableClientSdkTooOldException) {
        message = "Please update this app";
    } else if (catchException instanceof ARUnSupportedConfigurationException) {
        message = "The configuration is not supported by the device!";
    } else {
        message = "exception throw";
    }
}
Enter fullscreen mode Exit fullscreen mode

En nuestro BodyActivity.java llamarás a la detección de superficie:

package com.vsm.myarapplication.body;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.huawei.hiar.ARBodyTrackingConfig;
import com.huawei.hiar.ARConfigBase;
import com.huawei.hiar.AREnginesApk;
import com.huawei.hiar.ARSession;
import com.huawei.hiar.exceptions.ARCameraNotAvailableException;
import com.huawei.hiar.exceptions.ARUnSupportedConfigurationException;
import com.huawei.hiar.exceptions.ARUnavailableClientSdkTooOldException;
import com.huawei.hiar.exceptions.ARUnavailableServiceApkTooOldException;
import com.huawei.hiar.exceptions.ARUnavailableServiceNotInstalledException;
import com.vsm.myarapplication.R;
import com.vsm.myarapplication.body.rendering.BodyRenderManager;
import com.vsm.myarapplication.common.ConnectAppMarketActivity;
import com.vsm.myarapplication.common.DisplayRotationManager;
public class BodyActivity extends AppCompatActivity {
    private static final String TAG = BodyActivity.class.getSimpleName();
private ARSession mArSession;
private GLSurfaceView mSurfaceView;
private BodyRenderManager mBodyRenderManager;
private DisplayRotationManager mDisplayRotationManager;
// Used for the display of recognition data.
    private TextView mTextView;
private String message = null;
private boolean isRemindInstall = false;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_body);
        mTextView = findViewById(R.id.bodyTextView);
        mSurfaceView = findViewById(R.id.bodySurfaceview);
        mDisplayRotationManager = new DisplayRotationManager(this);
// Keep the OpenGL ES running context.
        mSurfaceView.setPreserveEGLContextOnPause(true);
// Set the OpenGLES version.
        mSurfaceView.setEGLContextClientVersion(2);
// Set the EGL configuration chooser, including for the
        // number of bits of the color buffer and the number of depth bits.
        mSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
mBodyRenderManager = new BodyRenderManager(this);
        mBodyRenderManager.setDisplayRotationManage(mDisplayRotationManager);
        mBodyRenderManager.setTextView(mTextView);
mSurfaceView.setRenderer(mBodyRenderManager);
        mSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
    }
@Override
    protected void onResume() {
        Log.d(TAG, "onResume");
        super.onResume();
        Exception exception = null;
        message = null;
        if (mArSession == null) {
            try {
                if (!arEngineAbilityCheck()) {
                    finish();
                    return;
                }
                mArSession = new ARSession(this);
                ARBodyTrackingConfig config = new ARBodyTrackingConfig(mArSession);
                config.setEnableItem(ARConfigBase.ENABLE_DEPTH | ARConfigBase.ENABLE_MASK);
                mArSession.configure(config);
                mBodyRenderManager.setArSession(mArSession);
            } catch (Exception capturedException) {
                exception = capturedException;
                setMessageWhenError(capturedException);
            }
            if (message != null) {
                Toast.makeText(this, message, Toast.LENGTH_LONG).show();
                Log.e(TAG, "Creating session", exception);
                if (mArSession != null) {
                    mArSession.stop();
                    mArSession = null;
                }
                return;
            }
        }
        try {
            mArSession.resume();
        } catch (ARCameraNotAvailableException e) {
            Toast.makeText(this, "Camera open failed, please restart the app", Toast.LENGTH_LONG).show();
            mArSession = null;
            return;
        }
        mSurfaceView.onResume();
        mDisplayRotationManager.registerDisplayListener();
    }
/**
     * Check whether HUAWEI AR Engine server (com.huawei.arengine.service) is installed on the current device.
     * If not, redirect the user to HUAWEI AppGallery for installation.
     */
    private boolean arEngineAbilityCheck() {
        boolean isInstallArEngineApk = AREnginesApk.isAREngineApkReady(this);
        if (!isInstallArEngineApk && isRemindInstall) {
            Toast.makeText(this, "Please agree to install.", Toast.LENGTH_LONG).show();
            finish();
        }
        Log.d(TAG, "Is Install AR Engine Apk: " + isInstallArEngineApk);
        if (!isInstallArEngineApk) {
            startActivity(new Intent(this, ConnectAppMarketActivity.class));
            isRemindInstall = true;
        }
        return AREnginesApk.isAREngineApkReady(this);
    }
private void setMessageWhenError(Exception catchException) {
        if (catchException instanceof ARUnavailableServiceNotInstalledException) {
            startActivity(new Intent(this, ConnectAppMarketActivity.class));
        } else if (catchException instanceof ARUnavailableServiceApkTooOldException) {
            message = "Please update HuaweiARService.apk";
        } else if (catchException instanceof ARUnavailableClientSdkTooOldException) {
            message = "Please update this app";
        } else if (catchException instanceof ARUnSupportedConfigurationException) {
            message = "The configuration is not supported by the device!";
        } else {
            message = "exception throw";
        }
    }
@Override
    protected void onPause() {
        Log.i(TAG, "onPause start.");
        super.onPause();
        if (mArSession != null) {
            mDisplayRotationManager.unregisterDisplayListener();
            mSurfaceView.onPause();
            mArSession.pause();
        }
        Log.i(TAG, "onPause end.");
    }
@Override
    protected void onDestroy() {
        Log.i(TAG, "onDestroy start.");
        super.onDestroy();
        if (mArSession != null) {
            mArSession.stop();
            mArSession = null;
        }
        Log.i(TAG, "onDestroy end.");
    }
@Override
    public void onWindowFocusChanged(boolean isHasFocus) {
        Log.d(TAG, "onWindowFocusChanged");
        super.onWindowFocusChanged(isHasFocus);
        if (isHasFocus) {
            getWindow().getDecorView()
                    .setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                            | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Alt text of image

Conclusión

Con HUAWEI AR Engine puedes identificar puntos del esqueleto del cuerpo y características del cuerpo humano de salida, como puntos finales de las extremidades, postura corporal y esqueleto.
Documentación
Codelab
Code Sample
Explora más artículos
Conviértete en Huawei Developer es gratis.

Top comments (0)