【一步步开发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>

三、注意事项

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

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

相关文章
|
6月前
|
JavaScript Java 测试技术
基于ssm+vue.js+uniapp小程序的高校体育运动会比赛系统附带文章和源代码部署视频讲解等
基于ssm+vue.js+uniapp小程序的高校体育运动会比赛系统附带文章和源代码部署视频讲解等
65 5
|
7月前
|
人工智能 小程序 前端开发
小程序源码|运动荟小程序源码模版
小程序源码|运动荟小程序源码模版
|
2月前
|
人工智能 小程序
【一步步开发AI运动小程序】二、引入插件
随着人工智能技术的发展,阿里体育等公司推出的“乐动力”、“天天跳绳”等AI运动APP广受欢迎。本文将引导您从零开始开发一个AI运动小程序,使用“云智AI运动识别小程序插件”。内容包括新建uni-app项目、配置插件、部署模型、安装依赖包、全局初始化和调用插件对象。
|
5天前
|
人工智能 小程序 IDE
【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用
随着AI技术的发展,各大厂商推出的AI运动APP如“乐动力”、“天天跳绳”等,使云上运动会、线上健身等概念大热。本文将指导你如何利用“云智AI运动识别小程序插件”,在微信小程序中实现类似功能,包括工具搭建、服务启动及数据回传等步骤,助力开发者高效开发AI运动小程序。
【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用
|
2月前
|
人工智能 小程序 搜索推荐
成功案例分享|使用AI运动识别插件+微搭,快速搭建AI美体运动小程序
今天给大家分享一个最近使用我们的“AI运动识别小程序插件”+“微搭”搭建小程序的经典案例。
成功案例分享|使用AI运动识别插件+微搭,快速搭建AI美体运动小程序
|
27天前
|
人工智能 小程序
【一步步开发AI运动小程序】五、帧图像人体识别
随着AI技术的发展,阿里体育等公司推出的AI运动APP,如“乐动力”和“天天跳绳”,使云上运动会、线上健身等概念广受欢迎。本文将引导您从零开始开发一个AI运动小程序,使用“云智AI运动识别小程序插件”。文章分为四部分:初始化人体识别功能、调用人体识别功能、人体识别结果处理以及识别结果旋转矫正。下篇将继续介绍人体骨骼图绘制。
|
28天前
|
人工智能 小程序 vr&ar
AI运动小程序开发常见问题集锦二
截至当前,我们的AI运动识别小程序插件已迭代至第23个版本,广泛应用于健身、体育、体测、AR互动等场景。本文针对近期用户咨询,汇总了常见问题,帮助用户减少开发成本,提高效率。主要涵盖计时与计数模式的区别、综合排行榜生成方法、全屏模式适配及无开发能力用户的解决方案。
|
2月前
|
人工智能 编解码 小程序
【一步步开发AI运动小程序】四、小程序如何抽帧
随着AI技术的发展,阿里体育等公司推出的“乐动力”、“天天跳绳”等APP使云上运动会、线上健身等概念备受关注。本文将引导您从零开始开发一个AI运动小程序,利用“云智AI运动识别小程序插件”。文中详细介绍了微信小程序抽帧的相关API、设置及注意事项,帮助开发者更好地实现AI运动功能。下篇将介绍人体识别技术,敬请期待。
|
2月前
|
机器学习/深度学习 人工智能 JSON
微信小程序原生AI运动(动作)检测识别解决方案
近年来,疫情限制了人们的出行,却推动了“AI运动”概念的兴起。AI运动已在运动锻炼、体育教学、线上主题活动等多个场景中广泛应用,受到互联网用户的欢迎。通过AI技术,用户可以在家中进行有效锻炼,学校也能远程监督学生的体育活动,同时,云上健身活动形式多样,适合单位组织。该方案成本低、易于集成和扩展,已成功应用于微信小程序。
|
2月前
|
机器学习/深度学习 人工智能 小程序
做AI运动小程序有哪些解决方案,如何进行选型?
随着深度学习技术的发展,AI运动应用如“天天跳绳”和“百分运动”变得流行。本文探讨了将AI运动功能引入微信小程序的可行性,并介绍了几种解决方案。实现AI运动计数的关键技术包括视频抽帧、人体检测、姿态识别等。文中详细描述了离线方案(全离线和半离线)和原生方案(自研AI引擎和成熟插件)的不同实现方式,并对各种方案进行了对比,建议优先选择成本低、体验佳的AI运动识别插件方案。

热门文章

最新文章