AR手勢識別交互,讓應用更加“得心應手”

来源:https://www.cnblogs.com/hmscore/archive/2022/11/24/16921016.html
-Advertisement-
Play Games

現如今, AR技術不斷發展,人們不再滿足於運用鍵盤、滑鼠等簡單器械來實現傳統的人機交互模式。隨著用戶接觸機器的多樣化,繁瑣的操作不但對一些用戶有門檻,而且還增加其學習成本;如果能用自然且符合日常生活習慣的人機交互模式,不僅更好上手,也能讓開發者們在應用內開發更多玩法。比如在視頻直播或者拍照過程中,一 ...


現如今, AR技術不斷發展,人們不再滿足於運用鍵盤、滑鼠等簡單器械來實現傳統的人機交互模式。隨著用戶接觸機器的多樣化,繁瑣的操作不但對一些用戶有門檻,而且還增加其學習成本;如果能用自然且符合日常生活習慣的人機交互模式,不僅更好上手,也能讓開發者們在應用內開發更多玩法。比如在視頻直播或者拍照過程中,一個手勢就能增加相應的貼紙或特效,豐富交互體驗;面對智能家電等硬體設備時,通過不同的手勢可以控制對應的功能。

那麼,應用如何才能實現更自然的人機和交互呢?

華為HMS Core AR Engine提供多種特定手勢的識別,輸出識別到的手勢類別結果並給出手掌檢測框屏幕坐標,左手和右手均可支持。當圖像中出現多只手時,只反饋單手(最清晰且置信度最高)識別結果和坐標信息。支持前後置相機切換。

通過手勢識別能力,可將虛擬物體疊加到人的手部位置,並根據不同的手勢變化來激活某些狀態的切換,給開發者的AR應用提供基礎的交互功能。

不僅如此,AR Engine的手部跟蹤功能能識別和跟蹤21個手部關節點的位置和姿態,形成手部骨骼模型,並可分辨左右手,同時提供單手關節點和骨骼識別能力,輸出手指端點、手部骨骼等手部高級特征。

通過手部骨骼識別能力,開發者們可將虛擬物體疊加到更為精確的手部位置,例如手指尖、手掌心等;利用手部骨骼,能驅動虛擬手做出更為豐富和精細的動作,給開發者們的AR應用提供增強的交互功能和難以置信的新奇玩法。

集成步驟

開發環境要求:

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)。

調用ARHandTrackingConfig介面,初始化手部識別。

mArSession = new ARSession(context);
ARHandTrackingConfig config = new ARHandTrackingconfig(mArSession);
  1. 獲取到ARhandTrackingconfig後,可以設置使用相機的前置或者後置等等一些可選的方法:
Config.setCameraLensFacing(ARConfigBase.CameraLensFacing.FRONT);
  1. 你需要把你獲取到的手部識別獲取到的config配置到ArSession中,然後啟動手部識別場景:
mArSession.configure(config);
mArSession.resume();
  1. 初始化HandSkeletonLineDisplay類,此類是根據手骨架點的坐標來繪製手骨架線:
Class HandSkeletonLineDisplay implements HandRelatedDisplay{
//此類需要幾個方法
//初始化方法
public void init(){
}
//繪製手骨架點的方法,這裡需要傳入ARHand對象,用來獲取數據
public void onDrawFrame(Collection<ARHand> hands,){

    //調用getHandskeletonArray()方法用來獲取手部關節點坐標數據
        Float[] handSkeletons  =  hand.getHandskeletonArray();

        //把handSkeletons傳入到實時更新數據方法中
        updateHandSkeletonsData(handSkeletons);

}
//更新骨架點的連接數據,在更新任何幀的時候調用此方法
public void updateHandSkeletonLinesData(){

//用來創建並初始化緩衝區對象的數據存儲
GLES20.glBufferData(…,mVboSize,…);

//用來更新緩衝區對象中的數據
GLES20.glBufferSubData(…,mPointsNum,…);

}
}
  1. 初始化HandRenderManager類,此類是來渲染從HUAWEI AREngine獲取的數據。
Public class HandRenderManager implements GLSurfaceView.Renderer{
	
	//設置ARSession對象,用於獲取onDrawFrame方法中的最新數據。
	Public void setArSession(){
	}
}
  1. 在HandRenderManager類中,初始化onDrawFrame()方法:
Public void onDrawFrame(){
//在這個方法中調用了setCameraTextureName(),update()等方法用來更新ArEngine的計算結果
//應用在獲取到最新數據時來調用此介面。
mSession.setCameraTextureName();
ARFrame arFrame = mSession.update();
ARCamera arCamera = arFrame.getCamera();
//獲取人體手部跟蹤時返回的跟蹤結果 
Collection<ARHand> hands =  mSession.getAllTrackables(ARHand.class);
     //把獲取到的hands對象迴圈傳入更新手勢識別信息方法中,進行處理
     For(ARHand hand  :  hands){
         updateMessageData(hand);
}
}

8.最後在展示效果的HandActivity頁面,給SurfaceView 設置渲染器。

mSurfaceView.setRenderer(mHandRenderManager);
設置渲染模式
mSurfaceView.setRenderMode(GLEurfaceView.RENDERMODE_CONTINUOUSLY);

具體實現可參考示例代碼

瞭解更多詳情>>

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 學習思路: 1.需求是什麼? 2.方案是什麼? 3.邏輯是什麼? 4.開發中的問題?怎麼解決? 整體流量概況: 1.累計用戶量 2.每日新增用戶量 3.每日的訪問人數、次數 4.每日的全部訪問人均次數、時長和深度 5.計算用戶平均會話數 6.計算當日訪問IP數 7.新老用戶訪問占比 8.每日新老用戶 ...
  • 在進行對接數據時,經常會遇到對接的是介面數據。 關於在對接介面類型的數據,數據返回的為json數組形式的數據,需要講數組先解析出來,主要是通過 jsonpath 表達式 。 jsonpath 表達式 : 1、JSONPath是xpath在json的應用2、JSONPath 是參照xpath表達式來解 ...
  • 在實際使用時,必不可少地需要將多個文檔甚至是多個集合彙總到一起計算、分析,MongoDB 提供了原生聚合框架支持這樣的計算、分析。 ...
  • 一、創建表的完整語法 1、創建表的語法 create table 表名( ​ 欄位名1 欄位類型(數字) 約束條件, ​ 欄位名2 欄位類型(數字) 約束條件, ​ 欄位名3 欄位類型(數字) 約束條件,...) 2、創建表的條件 create table: 創建表的關鍵字 表名:表的名字 欄位名: ...
  • 一、SQL與NoSQL ​ 資料庫服務端可以服務多種類型的客戶端 ​ 客戶端可以是自己開發的,也可以是python代碼編寫的,也可以是其他編程語言編寫的 SQL 操作關係型數據的語言 NoSQL 操作非關係型數據的語言 須知: ​ 1、SQL有時又也指代關係型資料庫 ​ 2、NoSQL有時候也指代非 ...
  • 一、MySQL簡介 ​ MySQL是一種關係型資料庫管理系統,關係資料庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。 二、安裝與下載 1、下載流程 1、訪問官方(www.mysql.com) 2、點擊‘DOWNLOADS’,進入下載界面 3、下拉,找到‘ ...
  • 關於 uniapp 獲取已安裝應用列表 uniapp 中返回的數據問題 獲取所有安裝的app 判斷是否是系統應用 獲取詳細app信息 遇到的問題 參考文檔 uniapp 中返回的數據問題 在uniapp中有時候放回的數據是 一個對象裡面(如下麵所示這種)根本不知大怎麼處理,查閱資料也沒相關資料,只能 ...
  • Android開發之線程間通信 當我們的軟體啟動的時候,電腦會分配進程給到我們運行的程式,在進程中包含多個線程用於提高軟體運行速度。 在android網路請求中,我們知道在日常開發中不能在子線程中跟新ui,否則報錯Only the original thread that created a vi ...
一周排行
    -Advertisement-
    Play Games
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...