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

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

開發(fā)實(shí)戰(zhàn)
下面給大家介紹如何快速集成華為HMS ML Kit手部關(guān)鍵點(diǎn)識別技術(shù),以視頻流識別為例。
1.??開發(fā)準(zhǔn)備
詳細(xì)的準(zhǔn)備步驟可以參考華為開發(fā)者聯(lián)盟:
https://developer.huawei.com/consumer/cn/doc/development/HMS-Guides/ml-process-4
這里列舉關(guān)鍵的開發(fā)步驟。
1.1??? 項(xiàng)目級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?應(yīng)用級gradle里配置SDK依賴?
dependencies{
????//?引入基礎(chǔ)SDK
????implementation?'com.huawei.hms:ml-computer-vision-handkeypoint:2.0.2.300'
????//?引入手部關(guān)鍵點(diǎn)檢測模型包
????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文件中,自動(dòng)更新機(jī)器學(xué)習(xí)模型到設(shè)備
<meta-data?
android:name="com.huawei.hms.ml.DEPENDENCY"?
android:value=?"handkeypoint"/>
1.5申請相機(jī)權(quán)限和讀取本地文件權(quán)限
<!--相機(jī)權(quán)限-->
<uses-permission?android:name="android.permission.CAMERA"?/>
<!--讀權(quán)限-->
<uses-permission?android:name="android.permission.READ_EXTERNAL_STORAGE"?/>
2. 代碼開發(fā)
2.1創(chuàng)建手部關(guān)鍵點(diǎn)分析器
MLHandKeypointAnalyzerSetting?setting?=?new?MLHandKeypointAnalyzerSetting.Factory()
??????//?MLHandKeypointAnalyzerSetting.TYPE_ALL表示所有結(jié)果都返回。
??????//?MLHandKeypointAnalyzerSetting.TYPE_KEYPOINT_ONLY表示只返回手部關(guān)鍵點(diǎn)信息。
??????//?MLHandKeypointAnalyzerSetting.TYPE_RECT_ONLY表示只返回手掌區(qū)域信息。
??????.setSceneType(MLHandKeypointAnalyzerSetting.TYPE_ALL)
??????//?設(shè)置同一張圖片中最多支持檢測的手部區(qū)域個(gè)數(shù)。默認(rèn)最多支持10個(gè)手部區(qū)域信息檢測。
??????.setMaxHandResults(1)
??????.create();
MLHandKeypointAnalyzer?analyzer?=?MLHandKeypointAnalyzerFactory.getInstance().getHandKeypointAnalyzer(setting);
2.2開發(fā)者創(chuàng)建識別結(jié)果處理類“HandKeypointTransactor”,該類實(shí)現(xiàn)MLAnalyzer.MLTransactor<T>接口,使用此類中的“transactResult”方法獲取檢測結(jié)果并實(shí)現(xiàn)具體業(yè)務(wù)。檢測結(jié)果除了包含每個(gè)手指點(diǎn)的坐標(biāo)信息外,還包括手掌置信度,以及每個(gè)點(diǎn)的置信度值,可以基于置信度值過濾誤識別的無效手掌,實(shí)際應(yīng)用中可根據(jù)對誤識別的容忍程度,設(shè)置闕值靈活應(yīng)用。
public?class?HandKeypointTransactor?implements?MLAnalyzer.MLTransactor<List<MLHandKeypoints>>?{
??????????@Override
??????????public?void?transactResult(MLAnalyzer.Result<List<MLHandKeypoints>>?results)?{
??????????????SparseArray<List<MLHandKeypoints>>?analyseList??=?result.getAnalyseList();
??????????????//?開發(fā)者根據(jù)需要處理識別結(jié)果,需要注意,這里只對檢測結(jié)果進(jìn)行處理。
??????????????//?不可調(diào)用ML?Kit提供的其他檢測相關(guān)接口。
??????????}
?????????@Override
?????????public?void?destroy()?{
????????????//?檢測結(jié)束回調(diào)方法,用于釋放資源等。
????????}
}
2.3設(shè)置識別結(jié)果處理器,實(shí)現(xiàn)分析器與結(jié)果處理器的綁定。
analyzer.setTransactor(new?HandKeypointTransactor());
2.4創(chuàng)建LensEngine,該類由ML Kit SDK提供,用于捕捉相機(jī)動(dòng)態(tài)視頻流并傳入分析器。建議設(shè)置的相機(jī)顯示尺寸不小于320*320像素,不大于1920*1920像素。
LensEngine?lensEngine?=?new?LensEngine.Creator(getApplicationContext(),?analyzer)
??????.setLensType(LensEngine.BACK_LENS)
??????.applyDisplayDimension(1280,?720)
??????.applyFps(20.0f)
??????.enableAutomaticFocus(true)
??????.create();
2.5調(diào)用run方法,啟動(dòng)相機(jī),讀取視頻流,進(jìn)行識別。
??//?請自行實(shí)現(xiàn)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效果
下面這個(gè)demo展示了不同手勢時(shí)手部關(guān)鍵點(diǎn)識別的效果,開發(fā)者可根據(jù)實(shí)際開發(fā)需要進(jìn)行拓展。

Github源碼
https://github.com/HMS-Core/hms-ml-demo/blob/master/MLKit-Sample/module-body/src/main/java/com/mlkit/sample/activity/HandKeypointActivity.java
更詳細(xì)的開發(fā)指南參考華為開發(fā)者聯(lián)盟官網(wǎng)
https://developer.huawei.com/consumer/cn/hms/huawei-mlkit
欲了解更多詳情,請參閱:
華為開發(fā)者聯(lián)盟官網(wǎng):https://developer.huawei.com/consumer/cn/hms
獲取開發(fā)指導(dǎo)文檔:https://developer.huawei.com/consumer/cn/doc/development
參與開發(fā)者討論請到Reddit社區(qū):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