【一步步开发AI运动小程序】十九、运动识别中如何解析RGBA帧图片?

简介: 本文介绍了如何将相机抽取的RGBA帧图像解析为`.jpg`或`.png`格式,适用于体测、赛事等场景。首先讲解了RGBA图像结构,其为一维数组,每四个元素表示一个像素的颜色与透明度值。接着通过`uni.createOffscreenCanvas()`创建离屏画布以减少绘制干扰,并提供代码实现,将RGBA数据逐像素绘制到画布上生成图片。最后说明了为何不直接使用拍照API及图像转换的调用频率建议,强调应先暂存帧数据,运动结束后再进行转换和上传,以优化性能。

引言 最近有不少开发者向我们咨询,像体测、赛事等应用场景中,需要保存运动过程的图像,如何将相机抽取的RGBA帧图像解析成.jpg.png格式的图像?今天我们就为您介绍相应的解决方案。

一、RGBA图像结构。

RGBA图像为一维数组,每四个元素描写一个图像像素,前三元素为颜色值,第四个元素为透明度值,按列扫描顺序分布,如下图所示,为一个宽2px、高3px的结果,如下图所示:
115969-20240709101019056-2026318129.png

115969-20240709102923126-2091689550.png

二、相关API。

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

三、代码实现。

实现代码如下,抽帧代码见前面的抽帧章节。

...
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、图像转换调用频率。

由于图像转换是比较消耗计算资源的,所以建议不要在抽帧时同步调用图像转换,建议先暂存要转换的帧,等运动结束是再进行转换、上传等操作。

相关文章
|
2月前
|
人工智能 前端开发 机器人
10+热门 AI Agent 框架深度解析:谁更适合你的项目?
选型Agent框架不等于追热门!要选真正能跑得稳、适配团队能力与业务需求的框架。架构选错,轻则性能差,重则项目难推进。本文详解10大热门框架对比、5大新兴框架推荐及四步选型法,助你高效落地AI应用。
|
2月前
|
人工智能 自然语言处理 搜索推荐
从理论到应用:AI搜索MCP的最佳实践案例解析
本文深入探讨了如何通过 MCP 协议让大语言模型(LLM)高效调用外部工具,并结合多个实际场景展示了 MCP 在 AI 应用中的价值和未来潜力。
|
2月前
|
人工智能 Java 程序员
搭建AI智能体的Java神器:Google ADK深度解析
想用Java构建复杂的AI智能体?Google开源的ADK工具包来了!代码优先、模块化设计,让你像搭积木一样轻松组合智能体。从单体到多智能体系统,从简单工具到复杂编排,这篇文章带你玩转Java AI开发的全新境界。
|
3月前
|
人工智能 JavaScript 数据可视化
AI + 低代码技术揭秘(五):代码生成和解析管道
VTJ系统实现Vue单文件组件(SFC)与内部DSL双向转换,通过@vtj/parser和@vtj/coder支持代码开发与可视化低代码设计无缝集成,适用于多平台代码生成与解析。
84 0
|
4月前
|
人工智能 自然语言处理 开发者
HarmonyOS NEXT~鸿蒙开发利器:CodeGenie AI辅助编程工具全面解析
鸿蒙开发迎来新利器!DevEco CodeGenie 是华为推出的 AI 辅助编程工具,专为 HarmonyOS NEXT 开发者设计。它具备智能代码生成(支持 ArkTS 和 C++)、精准知识问答以及万能卡片生成三大核心功能,大幅提升编码效率。通过与 DeepSeek 深度整合,CodeGenie 实现流畅的问答体验,帮助开发者解决技术难题。无论是新手还是资深开发者,都能从中受益,享受更智能高效的开发过程。快来体验吧!
388 5
|
30天前
|
存储 人工智能 自然语言处理
深入解析AI智能体记忆机制:八大策略与实现方案
本文系统介绍了AI智能体8种主流记忆管理策略:从基础的全量记忆、滑动窗口,到智能的相关性过滤、摘要压缩,再到高阶的向量数据库、知识图谱,以及综合的分层记忆和类OS内存管理。详解各策略原理、代码示例、优缺点及适用场景,助你根据业务需求选择最佳方案,构建高效且个性化的AI对话系统。
|
2月前
|
敏捷开发 人工智能 自然语言处理
项目经理的智能搭档:AI项目管理软件的17种赋能方式解析
AI项目管理软件正通过17大应用场景革新传统管理方式。这类工具集成了NLP、机器学习等技术,在任务分配、风险预测等方面实现智能化,其核心优势在于自学习能力和数据驱动决策。文章详细分析了AI在项目全生命周期的赋能作用,对比了不同类型AI项目管理软件的特点,并针对敏捷和瀑布模型分别阐述了AI的应用价值。同时指出AI不会取代项目经理,而是成为提升效率的战略助手,最终提出三步走的AI工具落地策略。
439 2
|
2月前
|
人工智能 自然语言处理 语音技术
深度解析:AI语音客服系统如何重塑客户服务体验与主流解决方案探析
在数字化浪潮下,AI语音客服凭借高效、便捷、24小时在线的优势,成为企业提升服务效率、优化体验的重要工具。本文详解其核心技术、应用价值、选型要点及市场主流方案,如阿里云通义晓蜜、合力亿捷等,助力企业智能化升级。
253 1
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
AI专业术语解析
本文围绕AI领域常见专业术语展开解析,涵盖基础概念、模型与算法、数据处理、生成式人工智能、自然语言处理等多个方面。基础概念类包括人工智能、机器学习、深度学习等,详细阐述其定义、原理及应用场景。模型与算法类涉及支持向量机、决策树、生成对抗网络等。数据处理类介绍了数据标注、特征工程、模型评估等。生成式人工智能相关术语有生成式AI、文本生成、图像生成等。自然语言处理方面涵盖分词、词向量、注意力机制等。此外,还解释了大模型、小样本学习、端到端、对齐等其他专业术语,为读者理解AI领域提供了全面且深入的参考。
604 5
|
2月前
|
人工智能 搜索推荐 程序员
从产品经理视角深度解析五款热门AI产品:洞察创新与用户价值
本文从产品经理视角深度解析五款热门AI产品,包括ChatGPT、Midjourney、Notion AI、Perplexity与GitHub Copilot,剖析其成功要素与不足,总结AI产品设计的核心方法论,如用户体验优先、场景化落地、信任机制构建等,为AI时代的产品创新提供实践启示。
267 0

热门文章

最新文章

推荐镜像

更多
  • DNS