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

本文涉及的产品
视觉智能开放平台,视频通用资源包5000点
视觉智能开放平台,图像通用资源包5000点
视觉智能开放平台,分割抠图1万点
简介: 随着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>
AI 代码解读

三、注意事项

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

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

目录
打赏
0
2
2
0
129
分享
相关文章
重磅发布:VTJ.PRO 赋能若依(RuoYi)「AI + 低代码」能力,企业级开发效率跃升 300%
VTJ.PRO 与若依(RuoYi)深度集成,融合双向代码穿梭、AI智能引擎及多模态渲染技术,打造“设计即生产”新体验。支持可视化开发、AI生成代码、旧组件重构,提升企业开发效率,助力数字化转型。
115 29
程序员必收藏!Github 167000+ star 的自主AI agent,全自动AI助手,全面覆盖开发效率场景
AutoGPT 是基于 GPT-4 的开源自主 AI 智能代理,全面覆盖开发效率场景。支持任务自动拆解、多轮反馈、插件扩展与记忆管理,具备持续执行能力,适合自动化测试、CI/CD、Web 数据抓取等任务。GitHub 超 176K Star,是当前最热门的 AI Agent 开源项目之一,提供 CLI 与 GUI 双界面,助力开发者提升工作效率。
130 1
VTJ.PRO:打破次元壁!AI驱动 + 双向代码自由穿梭,重新定义Vue高效开发!
VTJ.PRO推出“双向代码转换引擎”,实现可视化设计与手写代码无缝切换,真正践行“设计即代码,代码即设计”。支持Vue3组件一键生成、源码反向解析,兼顾开发自由度与效率,助力快速原型验证与项目迭代。
42 0
高校实验实训课程开发:基于现有的硬件基础和开源能力研发最前沿的AI实验课程
更多基于学校现有硬件基础:企业需求场景的开发和发展,更加注重上层数据和应用,各类工具软件的出现,极大提升了各类硬件的应用价值。我们看到各类硬件厂商,想方设法把硬件卖给学校,但是很多硬件不是在那里尘封,就是寥寥无几的使用场景,我们希望基于学校现有的硬件基础去开发更多面向不同行业或专业的实验实训课程,物尽其用。基于学校现有的硬件,集约开发,极大降低硬件投入成本。
47 7
AI大模型运维开发探索第五篇:GitOps 智能体
本文探讨了如何结合 Manus 的智能体设计理念与 GitOps 持续集成技术,构建低成本、高扩展性的智能体系统。通过借鉴 Manus 的沙箱机制与操作系统交互思路,利用 Git 作为智能体的记忆存储与任务调度核心,实现了推理过程可视化、自进化能力强的智能体架构。文章还分享了具体落地实践与优化经验,展示了其与 Manus 相当的功能表现,并提供了开源代码供进一步探索。
185 20
智能体(AI Agent)开发实战之【LangChain】(四)结合大模型基于RAG实现本地知识库问答和纠错
本文介绍如何基于RAG实现知识库问答系统的输入内容纠错功能。通过加载本地知识库、构建向量数据库,结合大语言模型对输入文本进行检索比对与纠错优化,提升问答准确性。
Apipost vs Apifox:AI 能力决定 API 开发管理工具的真正价值
2025年,AI技术深度融入企业运营,提升生产力与竞争力。在API开发工具领域,Apipost与Apifox在AI能力上有显著差异。Apipost实现AI全流程覆盖,从文档生成、测试、开发辅助到协作优化,大幅提升效率并降低维护成本;而Apifox主要聚焦文档优化,功能较基础。在团队协作、安全合规、企业适配等方面,Apipost亦表现更优,尤其适合追求高效、安全与全流程自动化的团队。
63 1
陪练,代练,护航,代打小程序源码/前端UNIAPP-VUE2.0开发 后端Thinkphp6管理/具备家政服务的综合型平台
这款APP通过技术创新,将代练、家政、娱乐社交等场景融合,打造“全能型生活服务生态圈”。以代练为切入点,提供模块化代码支持快速搭建平台,结合智能匹配与技能审核机制,拓展家政服务和商业管理功能。技术架构具备高安全性和扩展性,支持多业务复用,如押金冻结、录屏监控等功能跨领域应用。商业模式多元,包括交易抽成、增值服务及广告联名,同时设计跨领域积分体系提升用户粘性,实现生态共生与B端赋能。
271 13
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
thinkphp+uniapp开发的多端商城系统源码/H5/小程序/APP支持DIY模板直播分销
214 0
在线课堂+工具组件小程序uniapp移动端源码
在线课堂+工具组件小程序uniapp移动端源码
174 0
在线课堂+工具组件小程序uniapp移动端源码

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等