湘人老淼 發表於 2020-9-18 16:24:00

用华为HMS ML kit人体骨骼识别技术,Android快速实现人体姿势动作抓拍 

<p>  你有没有过这种体验,拍照时对着镜头,脑子一片空白、表情僵硬、手和脚无处安放,最后拍出来的照片很是奇怪。拍照软件中的固定姿势抓拍功能可以帮助你:选择一个你想要的姿势模板,当你摆出同款姿势时,软件会进行自动抓拍,完美避开拍照时的尴尬。本文详细介绍了华为HMS ML kit人体骨骼识别技术的集成过程,该技术精准定位了14个骨骼点,可以轻松实现固定姿势抓拍。&nbsp;</p>
<h2 id="人体骨骼检测功能开发实战">人体骨骼检测功能开发实战</h2>
<p>  做了一个视频流骨骼识别小demo,做一次实战演练,Github demo源码:https://github.com/HMS-Core/hms-ml-demo/tree/master/MLKit-Sample&nbsp;</p>
<h2 id="1开发前准备">1.开发前准备</h2>
<p>  您需要完成必要的开发准备工作,同时请确保您的工程中已经配置HMS Core SDK的Maven仓地址,并且完成了本服务的SDK集成。&nbsp;&nbsp;</p>
<h3 id="11-在项目级buildgradle文件中配置maven仓地址">1.1 在项目级build.gradle文件中配置maven仓地址。</h3>
<pre><code class="language-java">buildscript {
repositories {
      google()
      jcenter()
      maven { url 'https://developer.huawei.com/repo/' }
    }
    //配置AGC插件
    dependencies {
      classpath "com.android.tools.build:gradle:3.3.2"
    }
}
</code></pre>
<pre><code class="language-java">allprojects {
    repositories {
      google()
      jcenter()
      maven { url 'https://developer.huawei.com/repo/' }
    }
}
</code></pre>
<h3 id="12在应用级buildgradle中引入sdk">1.2在应用级build.gradle中引入SDK。</h3>
<pre><code class="language-java">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'
}
</code></pre>
<h2 id="2开发步骤">2.开发步骤</h2>
<h3 id="21-静态图片检测">2.1 静态图片检测</h3>
<p>2.1.1 创建人体骨骼检测器。</p>
<pre><code class="language-java">MLSkeletonAnalyzer analyzer = MLSkeletonAnalyzerFactory.getInstance().getSkeletonAnalyzer();
</code></pre>
<p>2.1.2 通过bitmap创建MLFrame,建议图片尺寸不小于320 * 320像素,不大于1920 * 1920像素。</p>
<pre><code class="language-java">//通过bitmap创建MLFrame。
MLFrame frame = MLFrame.fromBitmap(bitmap);
</code></pre>
<p>2.1.3 调用“asyncAnalyseFrame”方法进行人体骨骼检测。</p>
<pre><code class="language-java">Task&lt;List&lt;MLSkeleton&gt;&gt; task = analyzer.asyncAnalyseFrame(frame);
         task.addOnSuccessListener(new OnSuccessListener&lt;List&lt;MLSkeleton&gt;&gt;() {
             public void onSuccess(List&lt;MLSkeleton&gt; skeletons) {
               // 对检测结果进行处理。
             }
         }).addOnFailureListener(new OnFailureListener() {
             public void onFailure(Exception e) {
               // 检测失败。
             }
         });
</code></pre>
<p>2.1.4 检测完成,停止分析器,释放检测资源。</p>
<pre><code class="language-java">try {
    if (analyzer != null) {
      analyzer.stop();
    }
} catch (IOException e) {
    // 异常处理。
}
</code></pre>
<p>给大家看下Demo效果:</p>
<p><img src="https://img-blog.csdnimg.cn/20200917175547611.gif#pic_center"></p>
<h3 id="22-动态视频检测">2.2 动态视频检测</h3>
<p>2.2.1 创建人体骨骼检测器。</p>
<pre><code class="language-java">MLSkeletonAnalyzer analyzer = MLSkeletonAnalyzerFactory.getInstance().getSkeletonAnalyzer();
</code></pre>
<p>2.2.2 开发者创建识别结果处理类“SkeletonAnalyzerTransactor”,该类实现MLAnalyzer.MLTransactor<t>接口,使用此类中的“transactResult”方法获取检测结果并实现具体业务。</t></p>
<pre><code class="language-java">public class SkeletonAnalyzerTransactor implements MLAnalyzer.MLTransactor&lt;MLSkeleton&gt; {
    @Override
    public void transactResult(MLAnalyzer.Result&lt;MLSkeleton&gt; results) {
      SparseArray&lt;MLSkeleton&gt; items = results.getAnalyseList();
      // 开发者根据需要处理识别结果,例如,在此方法中进行相似度计算,从而在检测到特定姿势后进行拍照等操作。
      // 需要注意,这里只对检测结果进行处理,不可调用ML Kit提供的其他检测相关接口。
      // 将SparseArray封装的结果转换为List数组,以便进行相似度比较。
      List&lt;MLSkeleton&gt; resultsList = new ArrayList&lt;&gt;();
      for (int i = 0; i &lt; items.size(); i++) {
            resultsList.add(items.valueAt(i));
      }
      // 在检测结果和模板之间进行相似度比较。
      // templateList表示人体骨骼模板,可以通过静态图片检测的方式生成模板,支持单人或多人模板匹配。
      float result = analyzer.caluteSimilarity(resultsList, templateList);
    }
    @Override
    public void destroy() {
      // 检测结束回调方法,用于释放资源等。
    }
}
</code></pre>
<p>2.2.3 设置识别结果处理器,实现分析器与结果处理器的绑定。</p>
<pre><code class="language-java">analyzer.setTransactor(new SkeletonAnalyzerTransactor());
</code></pre>
<p>2.2.4 创建LensEngine,该类由ML Kit SDK提供,用于捕捉相机动态视频流并传入分析器。建议设置的相机显示尺寸不小于320 * 320像素,不大于1920 * 1920像素。</p>
<pre><code class="language-java">// Create LensEngine.
LensEngine lensEngine = new LensEngine.Creator(getApplicationContext(), analyzer)
    .setLensType(LensEngine.BACK_LENS)
    .applyDisplayDimension(1280, 720)
    .applyFps(20.0f)
    .enableAutomaticFocus(true)
    .create();
</code></pre>
<p>2.2.5 开发者启用相机,读取视频流并进行识别,待检测完成,停止分析器,释放检测资源。</p>
<pre><code class="language-java">if (analyzer != null) {
    try {
      analyzer.stop();   
    } catch (IOException e) {
         // 异常处理。
    }
}
if (lensEngine != null) {
    lensEngine.release();
}
</code></pre>
<p>动态视频流效果:</p>
<p><img src="https://img-blog.csdnimg.cn/20200917175627436.gif#pic_center"></p>
<p>&nbsp;&nbsp;<br>
基于华为HMS ML kit人体骨骼识别技术,我们能做的还有很多:<br>
a.在体感游戏中让虚拟形象模拟真人动作,增加游戏趣味性。<br>
b.辅助健身锻炼或康复训练时的姿势矫正。<br>
c.在监控中检测异常行为。</p>
<h2 id="更详细的开发指南参考华为开发者联盟官网">更详细的开发指南参考华为开发者联盟官网:</h2>
<p>华为开发者联盟机器学习服务开发指南</p>
<p>欲了解更多详情,请参阅:</p>
<p>华为开发者联盟官网:https://developer.huawei.com/consumer/cn/hms<br>
获取开发指导文档:https://developer.huawei.com/consumer/cn/doc/development<br>
参与开发者讨论请到Reddit社区:https://www.reddit.com/r/HMSCore/<br>
下载demo和示例代码请到Github:https://github.com/HMS-Core<br>
解决集成问题请到Stack Overflow:https://stackoverflow.com/questions/tagged/huawei-mobile-services?tab=Newest</p>
<hr>
<p>原文链接:https://developer.huawei.com/consumer/cn/forum/topicview?fid=18&amp;tid=0202333916402640253<br>
原作者:留下落叶</p><br><br>
来源:https://www.cnblogs.com/developer-huawei/p/13691963.html
頁: [1]
查看完整版本: 用华为HMS ML kit人体骨骼识别技术,Android快速实现人体姿势动作抓拍&nbsp;