之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今天开始我们将为您分享新系列【一步步开发AI运动APP】的博文,带您开发性能更强、体验更好的AI运动APP。
一、什么是姿态相似度比较
上一篇为您介绍了通过配置检测规则,来实现自定义姿态动作的检测分析,基于规则配置的姿态动作检测,需要开发者仔细分析动作再编写规则,工作量相对较大。为减轻开发者的工作量,插件姿态识别引擎pose-calc
还提供了一个姿态相似度比较器
,能对两个人体结构的进行比较,给出两上姿态的整体和分部相似度评分。
二、姿态比较能力调用示例
姿态比较器实例的创建在uni-app
和uni-app x
框架下略有不同,请参考API文档。
javascript
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
//}
三、标准动作取样辅助
为了方便开发者分析姿态动作,插件工具包内还提供了一个桌面辅助工具,可以辅助标准动作样本提取。