前言
之前在《用華為HMS ML kit人體骨骼識別技術,Android快速實現人體姿勢動作抓拍》文章中,我們給大家介紹了HMS ML Kit人體骨骼識別技術,可以定位頭頂、脖子、肩、肘、手腕、髖、膝蓋、腳踝等多個人體關鍵點。那么除了識別人體關鍵點以外,HMS ML Kit還為開發者提供了手部關鍵點識別技術,可以定位包括手指指尖、關節點,以及手腕點等21個手部關鍵點,讓人機交互的體驗更加豐富。
應用場景
手部關鍵點識別技術在生活中有很多的應用場景。比如拍攝短視頻的軟件在集成了這種技術后,可以根據手部關鍵點生成一些可愛或者搞笑的特效,增加短視頻的趣味性。

或者是在面向智能家居的場景中,可以自定義一些手勢作為智能家電的遠距離操控指令,進行一些更加智能的人機交互方式。

開發實戰
下面給大家介紹如何快速集成華為HMS ML Kit手部關鍵點識別技術,以視頻流識別為例。
1. 開發准備
詳細的准備步驟可以參考華為開發者聯盟:
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-process-4
這里列舉關鍵的開發步驟。
1.1 項目級gradle里配置Maven倉地址
buildscript {
repositories {
...
maven {url 'https://developer.huawei.com/repo/'}
}
}
dependencies {
...
classpath 'com.huawei.agconnect:agcp:1.3.1.300'
}
allprojects {
repositories {
...
maven {url 'https://developer.huawei.com/repo/'}
}
}
1.2 應用級gradle里配置SDK依賴
dependencies{
// 引入基礎SDK
implementation 'com.huawei.hms:ml-computer-vision-handkeypoint:2.0.2.300'
// 引入手部關鍵點檢測模型包
implementation 'com.huawei.hms:ml-computer-vision-handkeypoint-model:2.0.2.300'
}
1.3 在文件頭添加配置
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
1.4 添加如下語句到AndroidManifest.xml文件中,自動更新機器學習模型到設備
<meta-data
android:name="com.huawei.hms.ml.DEPENDENCY"
android:value= "handkeypoint"/>
1.5 申請相機權限和讀取本地文件權限
<!--相機權限-->
<uses-permission android:name="android.permission.CAMERA" />
<!--讀權限-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
2. 代碼開發
2.1 創建手部關鍵點分析器
MLHandKeypointAnalyzerSetting setting = new MLHandKeypointAnalyzerSetting.Factory()
// MLHandKeypointAnalyzerSetting.TYPE_ALL表示所有結果都返回。
// MLHandKeypointAnalyzerSetting.TYPE_KEYPOINT_ONLY表示只返回手部關鍵點信息。
// MLHandKeypointAnalyzerSetting.TYPE_RECT_ONLY表示只返回手掌區域信息。
.setSceneType(MLHandKeypointAnalyzerSetting.TYPE_ALL)
// 設置同一張圖片中最多支持檢測的手部區域個數。默認最多支持10個手部區域信息檢測。
.setMaxHandResults(1)
.create();
MLHandKeypointAnalyzer analyzer = MLHandKeypointAnalyzerFactory.getInstance().getHandKeypointAnalyzer(setting);
2.2 開發者創建識別結果處理類“HandKeypointTransactor”,該類實現MLAnalyzer.MLTransactor
接口,使用此類中的“transactResult”方法獲取檢測結果並實現具體業務。檢測結果除了包含每個手指點的坐標信息外,還包括手掌置信度,以及每個點的置信度值,可以基於置信度值過濾誤識別的無效手掌,實際應用中可根據對誤識別的容忍程度,設置闕值靈活應用。
public class HandKeypointTransactor implements MLAnalyzer.MLTransactor<List<MLHandKeypoints>> {
@Override
public void transactResult(MLAnalyzer.Result<List<MLHandKeypoints>> results) {
SparseArray<List<MLHandKeypoints>> analyseList = result.getAnalyseList();
// 開發者根據需要處理識別結果,需要注意,這里只對檢測結果進行處理。
// 不可調用ML Kit提供的其他檢測相關接口。
}
@Override
public void destroy() {
// 檢測結束回調方法,用於釋放資源等。
}
}
2.3 設置識別結果處理器,實現分析器與結果處理器的綁定。
analyzer.setTransactor(new HandKeypointTransactor());
2.4 創建LensEngine,該類由ML Kit SDK提供,用於捕捉相機動態視頻流並傳入分析器。建議設置的相機顯示尺寸不小於320320像素,不大於19201920像素。
2.5 調用run方法,啟動相機,讀取視頻流,進行識別。
// 請自行實現SurfaceView控件的其他邏輯。
SurfaceView mSurfaceView = findViewById(R.id.surface_view);
try {
lensEngine.run(mSurfaceView.getHolder());
} catch (IOException e) {
// 異常處理邏輯。
}
2.6 檢測完成,停止分析器,釋放檢測資源。
if (analyzer != null) {
analyzer.stop();
}
if (lensEngine != null) {
lensEngine.release();
}
Demo效果
下面這個demo展示了不同手勢時手部關鍵點識別的效果,開發者可根據實際開發需要進行拓展。

Github源碼
更詳細的開發指南參考華為開發者聯盟官網
https://developer.huawei.com/consumer/cn/hms/huawei-mlkit
欲了解更多詳情,請參閱:
華為開發者聯盟官網:https://developer.huawei.com/consumer/cn/hms
獲取開發指導文檔:https://developer.huawei.com/consumer/cn/doc/development
參與開發者討論請到Reddit社區:https://www.reddit.com/r/HMSCore/
下載demo和示例代碼請到Github:https://github.com/HMS-Core
解決集成問題請到Stack Overflow:https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Newest
原文鏈接:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203346162792430439&fid=18
作者:留下落葉
