你有沒有過這種體驗,拍照時對著鏡頭,腦子一片空白、表情僵硬、手和腳無處安放,最後拍出來的照片很是奇怪。拍照軟體中的固定姿勢抓拍功能可以幫助你:選擇一個你想要的姿勢模板,當你擺出同款姿勢時,軟體會進行自動抓拍,完美避開拍照時的尷尬。本文詳細介紹了華為HMS ML kit人體骨骼識別技術的整合過程,該技術精準定位了14個骨骼點,可以輕鬆實現固定姿勢抓拍。
人體骨骼檢測功能開發實戰
做了一個視訊流骨骼識別小demo,做一次實戰演練,Github demo原始碼:https://github.com/HMS-Core/hms-ml-demo/tree/master/MLKit-Sample
1.開發前準備
您需要完成必要的開發準備工作,同時請確保您的工程中已經配置HMS Core SDK的Maven倉地址,並且完成了本服務的SDK整合。
1.1 在專案級build.gradle檔案中配置maven倉地址。
buildscript {
repositories {
google()
jcenter()
maven { url 'https://developer.huawei.com/repo/' }
}
//配置AGC外掛
dependencies {
classpath "com.android.tools.build:gradle:3.3.2"
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://developer.huawei.com/repo/' }
}
}
1.2在應用級build.gradle中引入SDK。
dependencies {
implementation 'com.huawei.hms:ml-computer-vision-skeleton-model:2.0.1.300'
implementation 'com.huawei.hms:ml-computer-vision-skeleton:2.0.1.300'
implementation 'com.huawei.hms:ml-computer-vision-base:2.0.1.300'
}
2.開發步驟
2.1 靜態圖片檢測
2.1.1 建立人體骨骼檢測器。
MLSkeletonAnalyzer analyzer = MLSkeletonAnalyzerFactory.getInstance().getSkeletonAnalyzer();
2.1.2 通過bitmap建立MLFrame,建議圖片尺寸不小於320 * 320畫素,不大於1920 * 1920畫素。
//通過bitmap建立MLFrame。
MLFrame frame = MLFrame.fromBitmap(bitmap);
2.1.3 呼叫“asyncAnalyseFrame”方法進行人體骨骼檢測。
Task<List<MLSkeleton>> task = analyzer.asyncAnalyseFrame(frame);
task.addOnSuccessListener(new OnSuccessListener<List<MLSkeleton>>() {
public void onSuccess(List<MLSkeleton> skeletons) {
// 對檢測結果進行處理。
}
}).addOnFailureListener(new OnFailureListener() {
public void onFailure(Exception e) {
// 檢測失敗。
}
});
2.1.4 檢測完成,停止分析器,釋放檢測資源。
try {
if (analyzer != null) {
analyzer.stop();
}
} catch (IOException e) {
// 異常處理。
}
給大家看下Demo效果:
2.2 動態視訊檢測
2.2.1 建立人體骨骼檢測器。
MLSkeletonAnalyzer analyzer = MLSkeletonAnalyzerFactory.getInstance().getSkeletonAnalyzer();
2.2.2 開發者建立識別結果處理類“SkeletonAnalyzerTransactor”,該類實現MLAnalyzer.MLTransactor
public class SkeletonAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLSkeleton> {
@Override
public void transactResult(MLAnalyzer.Result<MLSkeleton> results) {
SparseArray<MLSkeleton> items = results.getAnalyseList();
// 開發者根據需要處理識別結果,例如,在此方法中進行相似度計算,從而在檢測到特定姿勢後進行拍照等操作。
// 需要注意,這裡只對檢測結果進行處理,不可呼叫ML Kit提供的其他檢測相關介面。
// 將SparseArray封裝的結果轉換為List陣列,以便進行相似度比較。
List<MLSkeleton> resultsList = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
resultsList.add(items.valueAt(i));
}
// 在檢測結果和模板之間進行相似度比較。
// templateList表示人體骨骼模板,可以通過靜態圖片檢測的方式生成模板,支援單人或多人模板匹配。
float result = analyzer.caluteSimilarity(resultsList, templateList);
}
@Override
public void destroy() {
// 檢測結束回撥方法,用於釋放資源等。
}
}
2.2.3 設定識別結果處理器,實現分析器與結果處理器的繫結。
analyzer.setTransactor(new SkeletonAnalyzerTransactor());
2.2.4 建立LensEngine,該類由ML Kit SDK提供,用於捕捉相機動態視訊流並傳入分析器。建議設定的相機顯示尺寸不小於320 * 320畫素,不大於1920 * 1920畫素。
// Create LensEngine.
LensEngine lensEngine = new LensEngine.Creator(getApplicationContext(), analyzer)
.setLensType(LensEngine.BACK_LENS)
.applyDisplayDimension(1280, 720)
.applyFps(20.0f)
.enableAutomaticFocus(true)
.create();
2.2.5 開發者啟用相機,讀取視訊流並進行識別,待檢測完成,停止分析器,釋放檢測資源。
if (analyzer != null) {
try {
analyzer.stop();
} catch (IOException e) {
// 異常處理。
}
}
if (lensEngine != null) {
lensEngine.release();
}
動態視訊流效果:
基於華為HMS ML kit人體骨骼識別技術,我們能做的還有很多:
a.在體感遊戲中讓虛擬形象模擬真人動作,增加遊戲趣味性。
b.輔助健身鍛鍊或康復訓練時的姿勢矯正。
c.在監控中檢測異常行為。
更詳細的開發指南參考華為開發者聯盟官網:
欲瞭解更多詳情,請參閱:
華為開發者聯盟官網: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?fid=18&tid=0202333916402640253
原作者:留下落葉