【一步步开发AI运动APP】八、自定义姿态动作识别检测——之姿态相似度比较
之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今天开始我们将为您分享新系列【一步步开发AI运动APP】的博文,带您开发性能更强、体验更好的AI运动APP。
一、什么是姿态相似度比较
上一篇为您介绍了通过配置检测规则,来实现自定义姿态动作的检测分析,基于规则配置的姿态动作检测,需要开发者仔细分析动作再编写规则,工作量相对较大。为减轻开发者的工作量,插件姿态识别引擎body-calc还提供了一个姿态相似度比较器,能对两个人体结构的相似度比较,给出两上姿态的整体和分部相似度评分。

二、姿态比较能力调用示例
姿态比较器实例的创建在uni-app和uni-app x框架下略有不同,请注意API文档。
import {Human, PoseComparer} from "@/uni_modules/yz-ai-sport";
//样本动作人体关键点
let json =
`{
width: 480,
height: 640,
score: 0.7404499650001526,
keypoints: [{ y: 66.0156295428602, x: 196.24999974976453, score: 0.3974609375, name: "nose" },
{ y: 56.99219681226278, x: 204.68749974880043, score: 0.395263671875, name: "left_eye" },
{ y: 56.48437477557764, x: 188.12499975069284, score: 0.353759765625, name: "right_eye" },
{ y: 63.867192043105675, x: 217.18751882085854, score: 0.6533203125, name: "left_ear" },
{ y: 60.78125454345827, x: 174.99999975219248, score: 0.49560546875, name: "right_ear" },
{ y: 117.10937476865072, x: 243.12499974440865, score: 0.51220703125, name: "left_shoulder" },
{ y: 124.92188430450126, x: 140.62501882960643, score: 0.5078125, name: "right_shoulder" },
{ y: 196.40624975959042, x: 251.2499997434803, score: 0.45068359375, name: "left_elbow" },
{ y: 207.65624975830502, x: 136.8749997565486, score: 0.4960937798023224, name: "right_elbow" },
{ y: 276.5624997504319, x: 260.31249974244486, score: 0.60498046875, name: "left_wrist" },
{ y: 279.99999975003914, x: 132.34374975706632, score: 0.4870605766773224, name: "right_wrist" },
{ y: 265.3125188252036, x: 224.68751882000163, score: 0.5830078125, name: "left_hip" },
{ y: 266.2499997516102, x: 167.81249975301373, score: 0.634765625, name: "right_hip" },
{ y: 416.24999973447143, x: 221.24999974690806, score: 0.67919921875, name: "left_knee" },
{ y: 418.43749973422155, x: 170.93749975265666, score: 0.55908203125, name: "right_knee" },
{ y: 549.6874997192251, x: 223.43751882014448, score: 0.51123046875, name: "left_ankle" },
{ y: 553.1249997188324, x: 178.59374975178187, score: 0.5869140625, name: "right_ankle" }
],
rangeHeight: 481.5357666015625,
rangeWidth: 127.82829284667969,
rangeX: 108.83674621582031,
rangeY: 72.2041015625
}`;
let sample = JSON.parse<Human>(json)!;
//当前帧动作
json =
`{
width: 480,
height: 640,
score: 0.7404499650001526,
keypoints: [{y:154.06250001297832,x:258.7499999883252,score:0.728515625,name:"nose"},
{y:143.12500001305142,x:254.37499998835446,score:0.56298828125,name:"left_eye"},
{y:143.75001908653357,x:255.937499988344,score:0.69482421875,name:"right_eye"},
{y:143.984394086532,x:229.99999998851743,score:0.43115234375,name:"left_ear"}
,{y:146.17187501303107,x:236.09374998847667,score:0.4919433891773224,name:"right_ear"},
{y:201.4062690861481,x:205.9375190621646,score:0.51416015625,name:"left_shoulder"},
{y:202.03125001265758,x:227.96874998853102,score:0.66259765625,name:"right_shoulder"},
{y:281.25001908561427,x:234.6874999884861,score:0.26416015625,name:"left_elbow"},
{y:270.6250190856853,x:254.06249998835656,score:0.278076171875,name:"right_elbow"},
{y:246.09376908584932,x:289.06249998812257,score:0.1997070610523224,name:"left_wrist"},
{y:238.43750001241418,x:300.62499998804526,score:0.50927734375,name:"right_wrist"},
{y:321.5624618648858,x:218.59376906208004,score:0.58154296875,name:"left_hip"},
{y:323.43750001184594,x:224.06249998855716,score:0.5615234375,name:"right_hip"},
{y:453.43750001097675,x:217.34376906208837,score:0.6103515625,name:"left_knee"},
{y:455.6250000109622,x:214.06249998862396,score:0.51416015625,name:"right_knee"},
{y:572.5000000101808,x:215.31249998861563,score:0.403564453125,name:"left_ankle"},
{y:593.1250000100429,x:216.0937499886104,score:0.52294921875,name:"right_ankle"}
],
rangeHeight: 481.5357666015625,
rangeWidth: 127.82829284667969,
rangeX: 108.83674621582031,
rangeY: 72.2041015625
}`
let frame = JSON.parse<Human>(json)!; //这里实际使用中取从相机或图片识别的结果
//新建比较器,比较
const poseComparer = new PoseComparer();
const result = poseComparer.compare(sample, frame);
console.log(result);
//输出结果
//{items:
// [{key:"head",score:0.4327263684686711,summary:"头部相似度"},
// {key:"trunk",score:0.8407704975917485,summary:"躯干形态相似度"},
// {key:"left_hand",score:0.2155245751055277,summary:"左手相似度"},
// {key:"right_hand",score:0.21361728579451628,summary:"左手相似度"},
// {key:"left_foot",score:0.5147016736506456,summary:"左脚相似度"},
// {key:"right_foot",score:0.5190758118853293,summary:"右脚相似度"}],
// score:0.5110266728697409
//}
三、标准动作取样辅助
为了方便开发分析姿态动作,插件工具包内还提供供了一个桌面辅助工具,可以辅助进行标准动作样本。

【一步步开发AI运动APP】八、自定义姿态动作识别检测——之姿态相似度比较的更多相关文章
- 用鸿蒙开发AI应用(八)JS框架访问内核层
目录:前言JS应用开发框架原理内置模块实现ace模块开发界面程序 前言上回说到,用C++来写UI界面的开发效率不如JS+HTML来的高,但设备开发又免不了要通过内核态来操作硬件,这里我们就要先打通从J ...
- 使用Java语言开发微信公众平台(八)——自定义菜单功能
随着上一篇文章的结束,我们已经实现了所有消息的类型的回复功能.今天,我们来学习更加高大上,也更加重要的自定义菜单功能. 一.了解自定义菜单 自定义菜单是微信公众平台最常用也是最重要的功能之一.根据微信 ...
- 一步步开发自己的博客 .NET版 剧终篇(6、响应式布局 和 自定义样式)
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做 ...
- ionic3+angular4开发混合app 之自定义组件
这里主要是记录ionic3+angular4开发混合app时自定义组件,我想自定义组件的方法和angular4应该类似,具体在纯angular4中自定义组件,暂时没有实践,个人觉得差别不大,之后实践了 ...
- 从0开始,手把手教你用Vue开发一个答题App
项目演示 项目演示 项目源码 项目源码 教程说明 本教程适合对Vue基础知识有一点了解,但不懂得综合运用,还未曾使用Vue从头开发过一个小型App的读者.本教程不对所有的Vue知识点进行讲解,而是手把 ...
- 一步步开发自己的博客 .NET版(1、基本显示)
前言 我们每个猿都有一个搭建自己独立博客的梦,我也不例外.以前想 现在想 以后也想.之所以一直迟迟没有着手,是因为难以跨出第一步.每次心里想着,等我以后技术好了再说,然后就没有然后了.以前用过word ...
- 一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器
前言 这次开发的博客主要功能或特点: 第一:可以兼容各终端,特别是手机端. 第二:到时会用到大量html5,炫啊. 第三:导入博客园的精华文章,并做分类.(不要封我) 第四:做个插件,任何网站上的技术 ...
- Senparc.Weixin.MP SDK 微信公众平台开发教程(十八):Web代理功能
在Senparc.Weixin.dll v4.5.7版本开始,我们提供了Web代理功能,以方便在受限制的局域网内的应用可以顺利调用接口. 有关的修改都在Senparc.Weixin/Utilities ...
- 闲暇时间开发的个人app
最近一段时间公司不是很忙,晚上基本没怎么加班.所以自己利用晚上在家的时间开发了一个app(奇趣营),其实自从转android开发以来,就有想过要自己开发一个app.一方面可以提升自己的经验:另一方面可 ...
- 《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示
原文:<ArcGIS Engine+C#实例开发教程>第八讲 属性数据表的查询显示 第一讲 桌面GIS应用程序框架的建立 第二讲 菜单的添加及其实现 第三讲 MapControl与Page ...
随机推荐
- MySQL-8.0.20
版本: 8.0.20 操作: Centos 7 Linux 未介绍针对数据库的详细操作,如有需求请前往 第一章 MySQL的介绍及安装 1.介绍 1.1 数据库管理系统(DBMS) RDBMS : O ...
- Ubuntu Linux部署DeepSeek(转载用于学习)
合集 - DeepSeek(4) 1.Ubuntu Linux部署DeepSeek02-06 2.Windows11本地部署DeepSeek加速02-073.DeepSeek部署本地知识库02-084 ...
- DeepSeek模型技术动态引行业关注,企业生产系统API迁移需审慎评估
在当今数字化浪潮中,人工智能技术迅猛发展,各类模型如雨后春笋般涌现,而 DeepSeek 模型凭借其独特的优势,在人工智能领域迅速崭露头角,成为备受瞩目的新星. DeepSeek 模型由杭州深度求索人 ...
- Python 潮流周刊#89:Python 3.14 的新型解释器!(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- MES生产制造管理系统-BI看板 MES大屏看板
可视化看板最主要的目的是为了将生产状况透明化,让大家能够快速了解当前的生产状况以及进度,通过大数据汇总分析,为管理层做决策提供数据支撑,看板数据必须达到以下基本要求: 数据准确--真实反映生产情况 数 ...
- 【Unity】热更新原理与Xlua配置
[Unity]热更新原理与 Xlua 配置 热更新 直接理解即是让代码可以像资源包一样被运行时更新.当然它其实还一个名称叫热修复,即实现不重新打包项目也能把 Bug 修好,这也正是它常用的地方. 原理 ...
- luogu-P10596题解
简要题意 一个有 \(N\) 个元素的集合有 \(2N\) 个不同子集(包含空集),现在要在这 \(2N\) 个集合中取出若干集合(至少一个),使得它们的交集的元素个数为 \(K\),求取法的方案数, ...
- .NET 10 首个预览版发布,跨平台开发与性能全面提升
前言 2024年2月25日,微软正式推出 .NET 10 预览版 1,标志着这一跨平台开发框架迈入新里程碑. 本次更新聚焦 JIT 编译器优化.运行时性能提升和跨平台开发体验增强,同时引入多项开发者期 ...
- 【问题解决】Jenkins使用File的exists()方法判断文件存在,一直提示不存在的问题
小剧场 最近为了给项目组提供一个能给Java程序替换前端.后端的增量的流水线,继续写上了声明式流水线. 替换增量是根据JSON配置文件去增量目录里去取再替换到对应位置的,替换前需要判断增量文件是否存在 ...
- 多智能体粒子环境(Multi-Agent Particle Env)食用指南--从入门到入土
0.项目地址: 原地址:openai/multiagent-particle-envs: Code for a multi-agent particle environment used in the ...