【一步步开发AI运动小程序】八、利用body-calc进行姿态识别
2023-05-26 12:05:20
博客园 2023-05-26 12:05:20
【资料图】
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的“乐动力”、“天天跳绳”AI运动APP,让云上运动会、线上运动会、健身打卡、AI体育指导等概念空前火热。那么,能否将这些在APP成功应用的场景搬上小程序,分享这些概念的红利呢?本系列文章就带您一步一步从零开始开发一个AI运动小程序,本系列文章将使用“云智AI运动识别小程序插件”,请先行在微信服务市场或官网了解详情。
人体姿态检测能力是插件的核心功能之一,插件为您封装好了基本的人体检测及逻辑运算检测规则。
插件提供了:肢体角度匹配
、平行检测
、垂直检测
、视角检查
、站立检查
、卧躺检查
、人体范围检查
、点位碰撞
等检测规则,详情参考api-docs
文档。
插件提供了:$or
、$and
两个逻辑运算器,详情参考api-docs
文档。
每条检测规则都是一个Object
对象,其中name
和calc
属性为必填,其它参数参考具体的检测规则,如:
//这是一个检查人体是否的检测const rule = { name: "人体站立状态要求", //必填,本规则自定义名称 calc: "stand", //必填,要执行的规则计算器名称 offset : 15 //选填,规则的允许偏差范围};//规则嵌套,利用$or和$and逻辑规则进行多规嵌套const rules = { name: "右侧站立检查", calc: "$and", rules: [{ name: "侧面视角",calc: "camera-view",position: "right" }, rule]};
所有的人体检测规则,有calc.Calculator
负责执行。
const AiSport = requirePlugin("aiSport");const humanDetection = AiSport.humanDetection;const Calculator = AiSport.calc.Calculator;const rule = { name: "人体站立状态要求", calc: "stand", offset : 15};const calculator = new Calculator();//抽帧const context = wx.createCameraContext();const listener = context.onCameraFrame((frame) => {const iamge = {width: Number(frame.width),height: Number(frame.height),rawData: frame.data};//人体识别humanDetection.detectionAsync(image).then(human=>{//对人体识别结果,进行单规则姿态检测console.log(calculator.calculating(human, rule));//返回值:true-通过;false-不通过});});listener.start();
下面带您来做一个马步蹲的姿态检查实战,如下图所示:
const AiSport = requirePlugin("aiSport");const humanDetection = AiSport.humanDetection;const Calculator = AiSport.calc.Calculator;//下肢要求const foot = {name: "脚90度检测",calc: "$or",rules: [{name: "左脚90度弯曲",calc: "match-angle",angleKey: "left_knee",secondKey: "left_hip",thirdKey: "left_ankle",angle: 90,offset: 25}, {name: "右脚90度弯曲",calc: "match-angle",angleKey: "right_knee",secondKey: "right_hip",thirdKey: "right_ankle",angle: 90,offset: 25}]};const arm = {name: "手臂180度检测",calc: "$or",rules: [{name: "左手180度伸直",calc: "match-angle",angleKey: "left_elbow",secondKey: "left_shoulder",thirdKey: "left_wrist",angle: 180,offset: 25}, {name: "右手180度伸直",calc: "match-angle",angleKey: "right_elbow",secondKey: "right_shoulder",thirdKey: "right_wrist",angle: 180,offset: 25}]};const shoulder = {name: "腋下夹角90度检测",calc: "$or",rules: [{name: "左腋90度",calc: "match-angle",angleKey: "left_shoulder",secondKey: "left_elbow",thirdKey: "left_hip",angle: 90,offset: 25}, {name: "右腋90度",calc: "match-angle",angleKey: "right_shoulder",secondKey: "right_elbow",thirdKey: "right_hip",angle: 90,offset: 25}]};const rule = {name: "马步蹲姿势检查",calc: "$and",rules: [{name: "全身进入图像范围内检查",calc: "whole"}, foot, arm, shoulder]};//抽帧const context = wx.createCameraContext();const listener = context.onCameraFrame((frame) => {const iamge = {width: Number(frame.width),height: Number(frame.height),rawData: frame.data};//人体识别humanDetection.detectionAsync(image).then(human=>{//执行检测console.log(calculator.calculating(human, rule));});});listener.start();
body-calc
的检测规则都是对象化,所以开发者实际应用中可以考虑采用JSON方式持久化,放置在后端,便于运动、姿态的检测更新、配置化等。
下篇将为您介运动调试分析工具的使用,敬请期待...