AR人體姿態識別,實現無邊界的人機交互

来源:https://www.cnblogs.com/hmscore/archive/2022/10/28/16834825.html
-Advertisement-
Play Games

近年來,AR不斷發展,作為一種增強現實技術,給用戶帶來了虛擬和現實世界的融合體驗。但用戶已經不滿足於單純地將某件虛擬物品放在現實場景中來感受AR技術,更想用身體姿勢來觸發某個指令,達到更具真實感的人機交互功能。 比如在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)

瞭解更多詳情>>

訪問華為開發者聯盟官網
獲取開髮指導文檔
華為移動服務開源倉庫地址:GitHubGitee

關註我們,第一時間瞭解 HMS Core 最新技術資訊~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 各位好啊,我是會編程的蝸牛,作為java開發者,我們都是需要接觸Linux伺服器的,一般部署應用都是部署在Linux伺服器上的~ 但一般的伺服器要麼需要購買,要麼只是公司里的,那麼有沒有免費的Linux可以讓我們自己使用呢?答案是,有的。 我們可以在自己的電腦上安裝一個虛擬機,然後就可以在虛擬機裡面... ...
  • 更多技術文章,請關註我的個人博客 www.immaxfang.com 和小公眾號 Max的學習札記。 Redis 事務簡介 Redis 只是提供了簡單的事務功能。其本質是一組命令的集合,事務支持一次執行多個命令,在事務執行過程中,會順序執行隊列中的命令,其他客戶端提交的命令請求不會插入到本事務執行命 ...
  • 閱識風雲是華為雲信息大咖,擅長將複雜信息多元化呈現,其出品的一張圖(雲圖說)、深入淺出的博文(雲小課)或短視頻(雲視廳)總有一款能讓您快速上手華為雲。更多精彩內容請單擊此處。 摘要:Hudi是數據湖的文件組織層,對Parquet格式文件進行管理提供數據湖能力,支持多種計算引擎。 本文分享自華為雲社區 ...
  • 摘要:通常在運維監控出現CPU使用率較高、P80/P95指標較高、慢SQL數量上升等現象,或者業務出現超時報錯時,優先應排查是否出現慢SQL。 本文分享自華為雲社區《GaussDB慢SQL常見定位處理手段》,作者:酷哥。 關鍵指標 通常在運維監控出現CPU使用率較高、P80/P95指標較高、慢SQL ...
  • 雲時代已經來臨,雲上很多場景下都需要數據的遷移、備份和流轉,各大雲廠商也大都提供了自己的遷移工具。本文主要介紹京東雲資料庫為解決用戶數據遷移的常見場景所提供的解決方案。 ...
  • 1. 詳解explain分析SQL; 2. 索引失效的幾個場景; 3. SQL優化的幾個場景: 4. 大批量插入; 5. order by; 6. group by; 7. limit分頁; 8. insert操作; 9. 嵌套查詢; 10. or條件 ...
  • 一、前言 作為全鏈路數字化技術與服務提供商,袋鼠雲提供了從數據湖、大數據基礎平臺、離線開發、實時開發、數據服務、數據治理、指標管理、客戶數據洞察、數據孿生可視化等全產品體系的服務。 圍繞著“行業應用”及“通用應用”,袋鼠雲聚焦數智提供全維數字解決方案,幫助企業實現降本增效、快捷轉型,迄今為止袋鼠雲已 ...
  • uni-app預設使用uni-ui全端相容的、高性能UI框架,在我們開發過程中可以滿足大部分的需求了,並且如果是為了相容性,還是強烈建議使用uni-ui作為UI框架使用。 如果作為初創公司,自身又不想費太多精力去自己設計一套UI框架,那麼DCloud插件市場提供了很多優秀的UI框架,最重要的是有些U ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...