【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?
引言 最近有不少开发者向我们咨询,像体测、赛事等应用场景中,需要保存运动过程的图像,如何将相机抽取的RGBA帧图像解析成
.jpg或.png格式的图像?今天我们就为您介绍相应的解决方案。
一、RGBA图像结构。
RGBA图像为一维数组,每四个元素描写一个图像像素,前三元素为颜色值,第四个元素为透明度值,按列扫描顺序分布,如下图所示,为一个宽2px、高3px的结果,如下图所示:


二、相关API。
根据上面的图像结构,我们把相应的像素点在canvas上画出来即可。为了减少绘制时对界面的干扰,我们使用uni.createOffsetScreen()创建离屏画布绘制。

三、代码实现。
实现代码如下,抽帧代码见前面的抽帧章节。
...
onCameraReady(e) {
const context = wx.createCameraContext();
const listener = context.onCameraFrame(frame => {
this.parseToJpeg(frame);
});
listener.start();
}
parseToJpeg(){
const canvas = uni.createOffscreenCanvas({
width: frame.width,
height: frame.height,
type: '2d'
});
let offset = 0;
let gl = canvas.getContext('2d');
const buffer = frame.data;
for (let y = 0; y < frame.height; y++) {
for (let x = 0; x < frame.width; x++) {
let r = buffer[offset].toString(16).padStart(2, '0');
let g = buffer[offset + 1].toString(16).padStart(2, '0');
let b = buffer[offset + 2].toString(16).padStart(2, '0');
let a = buffer[offset + 3].toString(16).padStart(2, '0');
let color = `#${r}${g}${b}${a}`;
//console.log(color, offset);
gl.fillStyle = color;
gl.fillRect(x, y, 1, 1);
offset += 4;
}
}
}
...
四、后记
4.1、为什么不直接使用拍照API?
这主要出于两个原因,一是在抽帧的同时无法调用
CameraContext.takePhoto()API进行拍照; 二是由于抽帧是异步的,所以无法同步调用,可能会导致识别时机的图像与拍摄的一不致。
4.2、图像转换调用频率。
由于图像转换是比较消耗计算资源的,所以建议不要在抽帧时同步调用图像转换,建议先暂存要转换的帧,等运动结束是再进行转换、上传等操作。
【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?的更多相关文章
- 开发一个微信小程序教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可. 2.注册成功后进入首页,在 小程序发布流程->小程序 ...
- 开发一个微信小程序项目教程
一.注册小程序账号 1.进入微信公众平台(https://mp.weixin.qq.com/),注册小程序账号,根据提示填写对应的信息即可.2.注册成功后进入首页,在 小程序发布流程->小程序开 ...
- 微信开发(2)---微信小程序开发实战part1
微信开发现在来说,简单可以概括为两部分,微信公众号和微信小程序. 微信公众号的技术已经非常成熟.分为服务号和订阅号.简单的.可以弄一个个人订阅号,在编辑模式下就可以实现推送图文.自动回复.自定义菜单的 ...
- 如何快速地开发一个微信小程序
如何快速地开发一个微信小程序呢?我觉得作为初学者,最好能有一个模板,然后改这个模板. 同样作为初学者,刚开始的时候我有下面的几个问题,后来通过问同学,我弄清楚了. 微信小程序可以连接MySQL或者Sq ...
- Java可视化日历(Date类、DATe Format类、Calendar类综合运用),开发可视化日历小程序
Java时间日期类综合运用,开发可视化日历小程序 由键盘输入指定格式的日期,打印这个月的日历 1.代码 import java.text.DateFormat; import java.text.Pa ...
- 全栈开发工程师微信小程序-中(下)
全栈开发工程师微信小程序-中(下) 微信小程序视图层 wxml用于描述页面的结构,wxss用于描述页面的样式,组件用于视图的基本组成单元. // 绑定数据 index.wxml <view> ...
- 全栈开发工程师微信小程序-中(中)
全栈开发工程师微信小程序-中(中) 开放能力 open-data 用于展示微信开放的数据 type 开放数据类型 open-gid 当 type="groupName" 时生效, ...
- 全栈开发工程师微信小程序-中
全栈开发工程师微信小程序-中 多媒体及其他的组件 navigator 页面链接 target 在哪个目标上发生跳转,默认当前小程序,可选值self/miniProgram url 当前小程序内的跳转链 ...
- 全栈开发工程师微信小程序-上(下)
全栈开发工程师微信小程序-上(下) icon 图标 success, success_no_circle, info, warn, waiting, cancel, download, search, ...
- 全栈开发工程师微信小程序-上(中)
全栈开发工程师微信小程序-上(中) width: 750rpx; 750rpx代表与屏幕等宽,rpx的缩写responsive pixel,这个单位是可以根据屏幕大小进行自适应调整的像素单位. 小程序 ...
随机推荐
- 运行 Java 程序
Java 程序实际上就是我们编译好的 Java 类文件.运行 Java 程序就是运行 Java 类的 main 函数. 编译并运行 Java 文件 源文件: package com.example; ...
- WiFi基础(二):最新WiFi信道、无线OSI模型与802.11b/g/n
liwen01 2024.09.01 前言 最近十几年,通信技术发展迅猛,通信标准更新频繁,有的设备还在使用 802.11/b/g/n 协议,有的已支持到 WiFi6.WiFi7. 而国内有关无线 W ...
- JavaScript – Promise
前言 我学 Promise 的时候, 那时还没有 es6. 曾经还自己实现过. 但时隔多年, 现在 es6 的 promise 已经很完善了. 这篇作为一个简单的复习. (毕竟我已经 1 年多没有写 ...
- ASP.NET Core – Razor Pages Routing
前言 之前有提过, MVC 和 Razor Pages 最大的区别就在 Routing 上. Razor Pages 的结构是 route, page, model route match to pa ...
- 一文搞定WeakHashMap
写在前面 在缓存场景下,由于内存是有限的,不能缓存所有对象,因此就需要一定的删除机制,淘汰掉一些对象.这个时候可能很快就想到了各种Cache数据过期策略,目前也有一些优秀的包提供了功能丰富的Cache ...
- JAVAEE——tomcat安装
一.下载 1.网址:Tomcat官网 选择版本:点击左边Download下的which version,根据Supported Java Versions来选择合适的Tomcat版本 下载软件:点击左 ...
- QT网络编程之如何使用QT6框架QTcpServer和QTcpSocket网络编程实现变长数据包收发:以用户注册和登录为实例讲解
QT网络编程之如何使用QT6框架QTcpServer和QTcpSocket网络编程实现变长数据包收发:以用户注册和登录为实例讲解 简介 本文将介绍如何使用QT6框架QTcpServer和QTcpSoc ...
- SpringBoot+Docker +Nginx 部署前后端项目
部署SpringBoot项目(通关版) 一.概述 使用 java -jar 命令直接部署项目的JAR包和使用Docker制作镜像进行部署是两种常见的部署方式.以下是对这两种方式的概述和简要的优劣势分析 ...
- 【USB3.0协议学习】Topic2·USB3.0的LTSSM分析
一.什么是LTSSM,处于USB层次中的哪个位置? LTSSM是链路训练状态机的简称,位于USB3.0协议的link layer,共有12种状态,在链路的两端,也就是Downstream port和U ...
- USB gadget functionfs
FunctionFS (Function Filesystem) 是 Linux USB Gadget 框架的一部分,专门用于从用户空间实现和控制自定义的 USB 功能.它提供了一种文件系统接口,使用 ...