【一步步开发AI运动APP】十二、自定义扩展新运动项目2

简介: 本文介绍如何基于uni-app运动识别插件实现“双手并举”自定义扩展运动,涵盖动作拆解、姿态检测规则构建及运动分析器代码实现,助力开发者打造个性化AI运动APP。

之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今天开始我们将为您分享新系列【一步步开发AI运动APP】的博文,带您开发性能更强、体验更好的AI运动APP。

上一篇为您介绍了uni-app版运动识别插件的自定义扩展运动的基本架构、与小程序版运动识别插件的运动扩展差异,本篇我们就以双手并举为例带你来实现一个扩展运动。

一、动作姿态拆解

image.png

如上图所示,这个运动主要为手部摆动动,包含2个分动作姿态,起始动作姿态1为双手垂放于左右两侧站立,结束动作姿态2双手举过头顶撑直为结束动作,完成动作2时计数加一,如此反复运动。

二、定义运动检测规则

接下来我们为这两个拆解姿态分别构建检测规则,检测规则及自定义姿态的检测可以参考本系列博文的前面章节及插件的pose-calc指南文档。

  • 先构建动作姿态1手垂于两侧并站立的动作的检测规则:

    {
         
       name: '双手下垂',
       calc: '$and',
           rules: [{
         
               name: '站立姿态',
               calc: 'stand',
               offset: 25
           }, {
         
               name: '左腋夹角',
               calc: 'match-angle',
               angleKey: 'left_shoulder',
               secondKey: 'left_hip',
               thirdKey: 'left_wrist',
               angle: 30,
               offset: 30
           }, {
         
               name: '左手下垂',
               calc: 'vertical',
               upperKey: 'left_shoulder',
               centerKey: 'left_elbow',
               lowerKey: 'left_wrist',
               offset: 25
           }, {
         
               name: '右腋夹角',
               calc: 'match-angle',
               angleKey: 'right_shoulder',
               secondKey: 'right_hip',
               thirdKey: 'right_wrist',
               angle: 30,
               offset: 30
           }, {
         
               name: '右手下垂',
               calc: 'vertical',
               upperKey: 'right_shoulder',
               centerKey: 'right_elbow',
               lowerKey: 'right_wrist',
               offset: 25
           }]
    }
    
  • 再构建动作姿态2双手举过头顶伸直站立的检测规则:

    {
         
      name: '双手上举',
      calc: '$and',
      rules: [{
         
          name: '左手上举',
          calc: 'position',
          referenceKey: 'left_eye',
          positionKey: 'left_wrist',
          position: 'top',
          relaxed: true
      }, {
         
          name: '右手上举',
          calc: 'position',
          referenceKey: 'right_eye',
          positionKey: 'right_wrist',
          position: 'top',
          relaxed: true
      }]
    }
    

三、实现运动分析器

定义好动作姿态检测规则后,我们便可以实现此扩展运动的运动分析器了,完整代码如下:

/**
 * 双手并举运动分析器
 */
export class BothHandsUpSport {
   

    context = null;
    calculator = null; //ICalculator
    stateTran = -1;

    /**
     * 初始化运动分析器
     */
    constructor() {
   
        this.calculator = createCalculator();

        this.buildRules();
        const that = this;
        this.context = createExtendSportContext({
   
            key: 'both-hands-up',
            name: '自定义-双手并举',
            tickMode: true,
            view: 'front_back',
            start: () => that.start(),
            // reset: this.reset,
            // stop: this.stop,
            pushing: human => that.pushing(human)
        });
    }

    buildRules() {
   
        this.rules = {
   };
        this.rules.ups = {
   
            name: '双手上举',
            calc: '$and',
            rules: [{
   
                name: '左手上举',
                calc: 'position',
                referenceKey: 'left_eye',
                positionKey: 'left_wrist',
                position: 'top',
                relaxed: true
            }, {
   
                name: '右手上举',
                calc: 'position',
                referenceKey: 'right_eye',
                positionKey: 'right_wrist',
                position: 'top',
                relaxed: true
            }]
        };

        this.rules.downs = {
   
            name: '双手下垂',
            calc: '$and',
            rules: [{
   
                name: '站立姿态',
                calc: 'stand',
                offset: 25
            }, {
   
                name: '左腋夹角',
                calc: 'match-angle',
                angleKey: 'left_shoulder',
                secondKey: 'left_hip',
                thirdKey: 'left_wrist',
                angle: 30,
                offset: 30
            }, {
   
                name: '左手下垂',
                calc: 'vertical',
                upperKey: 'left_shoulder',
                centerKey: 'left_elbow',
                lowerKey: 'left_wrist',
                offset: 25
            }, {
   
                name: '右腋夹角',
                calc: 'match-angle',
                angleKey: 'right_shoulder',
                secondKey: 'right_hip',
                thirdKey: 'right_wrist',
                angle: 30,
                offset: 30
            }, {
   
                name: '右手下垂',
                calc: 'vertical',
                upperKey: 'right_shoulder',
                centerKey: 'right_elbow',
                lowerKey: 'right_wrist',
                offset: 25
            }]
        };
    }

    start() {
   
        this.stateTran = -1;
        console.log('运动启动', this);
    }

    pushing(fragment) {
   

        if (fragment.isNobody) {
   
            console.log('未识别到人体');
            return;
        }

        const human = fragment.human;
        if (this.stateTran != 1 && this.calculator.calculating(human, this.rules.downs)) {
   
            this.stateTran = 1;
            return;
        }

        if (this.stateTran == 1 && this.calculator.calculating(human, this.rules.ups)) {
   
            this.stateTran = 2;
            this.context.countTimes();
            this.context.emitTick(1);
        }
    }

    /**
     * 获取当前扩展运动的原生分析器实例
     * @returns 原生运动分析器实例
     */
    getSportInstance() {
   
        return this.context.getSport();
    }

    /**
     * 获取当前扩展运动描述
     * 
     * @returns  运动描述条目实例
     */
    static getDescriptor() {
   
        let item = {
   
            key: 'both-hands-up',
            name: '自定义-双手并举'
        };

        return item;
    }
}

好了,本节就为您介绍到这,下一节我们将为您介绍将实现的自定义扩展运动列表的维护,敬请期待...

image.png

相关文章
|
2月前
|
人工智能 安全 API
20 万奖金池就位!Higress AI 网关开发挑战赛参赛指南
本次赛事共设三大赛题方向,参赛者可以任选一个方向参赛。本文是对每个赛题方向的参赛指南。
359 24
|
2月前
|
人工智能 运维 安全
加速智能体开发:从 Serverless 运行时到 Serverless AI 运行时
在云计算与人工智能深度融合的背景下,Serverless 技术作为云原生架构的集大成者,正加速向 AI 原生架构演进。阿里云函数计算(FC)率先提出并实践“Serverless AI 运行时”概念,通过技术创新与生态联动,为智能体(Agent)开发提供高效、安全、低成本的基础设施支持。本文从技术演进路径、核心能力及未来展望三方面解析 Serverless AI 的突破性价值。
|
2月前
|
存储 人工智能 前端开发
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
本文介绍如何利用Qoder、阿里云ADB Supabase和通义千问图像编辑模型,快速搭建AI手办生图Flutter应用。无需传统后端,实现从前端生成到数据存储、AI服务集成的全链路敏捷开发,展现Vibe Coding的高效实践。
Qoder + ADB Supabase :5分钟GET超火AI手办生图APP
|
2月前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
4219 63
|
人工智能 自然语言处理 前端开发
产品经理也能“开发”需求?淘宝信息流从需求到上线的AI端到端实践
淘宝推荐信息流业务,常年被“需求多、技术栈杂、协作慢”困扰,需求上线周期动辄一周。WaterFlow——一套 AI 驱动的端到端开发新实践,让部分需求两天内上线,甚至产品经理也能“自产自销”需求。短短数月,已落地 30+ 需求、自动生成 5.4 万行代码,大幅提升研发效率。接下来,我们将揭秘它是如何落地并改变协作模式的。
498 37
产品经理也能“开发”需求?淘宝信息流从需求到上线的AI端到端实践
app开发的一些思路
<p><br></p> <p><br></p> <p></p> <h3 style="margin:0px; padding:0px; border:0px; vertical-align:baseline; clear:both; font-weight:normal; list-style:none; color:rgb(102,102,102); font-family:宋体;
3175 0
x3d
小型app开发的思路
前提: 1. 性能不是最重要; 2. 人手少; 3. 速度要快;   结论: 1. 混合式 2. 减少app的复杂程度 3. 追求性能   (博客,尽量让自己每天写一点,短一点都可以)
x3d
636 0
|
2月前
|
缓存 移动开发 JavaScript
如何优化UniApp开发的App的启动速度?
如何优化UniApp开发的App的启动速度?
611 139
|
2月前
|
移动开发 JavaScript weex
UniApp开发的App在启动速度方面有哪些优势和劣势?
UniApp开发的App在启动速度方面有哪些优势和劣势?
367 137