基于 MediaPipe + Three.js 的实时姿态可视化前端

这是一套前端实时姿态捕获与 3D 可视化的 DEMO,特点是启动快、UI 现代、渲染稳定,同时对设备性能与网络情况做了多处优化。

预览地址

技术栈与核心依赖

  • 框架与工程:Vite + React + TypeScript
  • 实时姿态识别:MediaPipe Tasks Vision(PoseLandmarker)
  • 三维渲染:Three.js(OrbitControls 动态导入)
  • UI/样式:现代玻璃拟态风格 + 自定义 Loading

功能总览

  • 实时相机捕获与姿态识别(身体骨架)
  • 三维骨架可视化(颜色分区、发光、光照增强)
  • 角度信息面板(可自动隐藏,仅在有数据时显示)
  • 全局加载遮罩(等待 MediaPipe + Three.js 完成)
  • 手动启动/停止相机控制(支持自动启动模式)

关键模块与结构

  • src/components/CameraCapture/CameraCapture.tsx
    • 负责相机权限、视频流、MediaPipe 推理、数据结构转换
    • 提供 onPoseDetection, onReady, onStarted, onStopped
    • 支持按钮控制“启动相机/停止相机”
  • src/components/PoseVisualizer/PoseVisualizer.tsx
    • Three.js 场景、光照与骨架渲染
    • 动态导入 OrbitControls,限制旋转角度,不卡交互
    • angle-display 面板:仅在有数据时显示,避免遮挡
  • src/App.tsx
    • 负责两个模块组合 + 全局加载遮罩

MediaPipe 接入要点

  • 预加载
    • 启动时预创建 PoseLandmarker,后续组件共享,减少首次推理延迟
  • 推理节流
    • 使用 requestAnimationFrame,同时用 33ms 限制至 ~30FPS,减轻负载
  • 结果转换
    • results.landmarks 转为统一 PoseData,包含 landmarksconnections

示例(推理节流核心逻辑片段):

const now = performance.now();
const elapsed = now - lastDetectTimeRef.current;
if (elapsed >= 33) {lastDetectTimeRef.current = now;const poseResults = poseLandmarkerRef.current.detectForVideo(videoEl, now);// 转换数据后 onPoseDetection(poseData)
}

Three.js 可视化策略

  • 场景与光照
    • AmbientLight + DirectionalLight + PointLight 增强立体感
    • 关闭阴影、降低 pixelRatio,保性能稳定
  • 骨架渲染
    • 关节点使用不同尺寸与颜色分区,提升可视效果
    • 线条色彩柔和(透明度 0.8),避免视觉噪声
  • 交互限制
    • OrbitControls 限制旋转范围,支持小幅观察,不允许拖拽离场景

UI/交互设计

  • 全局 Loading 遮罩
    • 等 MediaPipe + Three.js 均完成后自动消失
  • 手动相机控制
    • 顶部按钮:启动/停止
    • 卸载时清理流与动画帧,避免内存泄漏
  • 角度信息条 angle-display
    • 仅在有角度数据时展示;否则隐藏,不遮挡画面
    • 背景为浅色玻璃风格,支持移动端可读性

性能优化清单

  • MediaPipe
    • 预加载模型,避免首帧等待
    • 推理节流至 ~30FPS
  • Three.js
    • 关闭阴影、降低抗锯齿与像素密度上限
    • 节省几何细分(SphereGeometry 16/16)
  • 网络与构建
    • Vite 插件移除第三方 sourcemap 注释,避免控制台噪音
    • 手动切换为本地模型与本地 wasm(可选,弱网/内网环境)

常见问题与排查

  • 模型/wasm 拉取失败
    • 检查 CDN 可访问性,或改为本地:将模型放到 public/models/pose_landmarker_lite.task
    • wasm 路径:默认 CDN。如需离线,将 @mediapipe/tasks-vision/wasm 同名文件复制至 public/mediapipe/wasm/,并修改 FilesetResolver.forVisionTasks('/mediapipe/wasm')
  • 扩展拦截 fetch
    • 使用无痕窗口或禁用拦截扩展
    • DevTools Network 查看失败 URL

体验与易用性

  • 打开即用(默认自动启动相机);也支持手动控制
  • 视觉现代化:玻璃面板、渐变、光效与动效
  • 移动端自适应:容器尺寸与文本字号优化

可继续演进的方向

  • 角度计算实现(肩/肘/膝等)并在面板展示历史曲线
  • 录制模式:保存姿态数据或渲染视频
  • 更多皮肤主题(暗/亮主题切换)
  • 多模型支持(如 Holistic / Hands / Face)可开关切换
  • 性能自适应(根据设备性能自动降低几何细分与像素比)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/94566.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/94566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【分布式技术】Kafka 数据积压全面解析:原因、诊断与解决方案

Kafka 数据积压全面解析:原因、诊断与解决方案Kafka 数据积压深度解析与解决方案全景指南一、数据积压核心原因矩阵二、生产者侧问题深度解析1. 突发流量洪峰2. 大消息阻塞管道三、消费者侧问题深度解析1. 消费能力不足2. 消费逻辑阻塞四、Broker集群问题深度解析1.…

企业云办公安全指南:如何构建高效无忧的云办公环境?

2025年,全球化协作与混合办公已成为企业运营的常态。越来越多的企业将业务迁移至云端,云办公在提升灵活性与效率的同时,也带来了新的安全挑战——数据泄露、内部威胁、网络攻击等风险无处不在,每一个环节都可能成为企业核心资产的…

Thingsboard 租户管理员权限,增加租户普通用户权限

在 ThingsBoard CE(社区版)中,租户管理员拥有对规则链、客户、资产、设备、仪表板等资源的全面管理权限。如果你想为租户创建一个普通用户,并限制其不能操作规则链、高级功能、安全设置等,可以通过以下步骤实现&#x…

【笔记】大模型业务场景流程综述

前言 大模型是指具有大规模参数和复杂计算结构的深度学习模型,这些模型通常由众多神经网络构建而成,拥有数十亿甚至数千亿个参数。本章将围绕大模型概念及特点展开,介绍模型算法的分类、典型大模型及应用、大模型训练流程和大模型业务流程。 目标 学完本课程后,您将能够…

【两数相互求余等于输入两数】2022-10-20

缘由关于#c#的问题:这个应该按照怎么个思路来写:想老半天莫得思路想法-编程语言-CSDN问答 void 两数相互求余等于输入两数() {//缘由https://ask.csdn.net/questions/7813625int a 0, b 0, x 0, y 0;cin >> a >> b;if (a > b)x a, y…

Linux系统调优

目录 1.CPU 负载查看 1.1.使用 uptime 查看系统负载 1.2.使用 top 按 CPU 使用率排序 1.3.使用 ps 查看 CPU 使用最多的进程 1.4.使用 mpstat 查看 CPU 详细状态 1.5.查看 /proc/meminfo 获取详细内存信息 2查看内存运行状态 2.1.使用 free 查看内存使用 1.CPU 负载查看…

AtCoder Beginner Contest 420

比赛链接如下: AtCoder Beginner Contest 420 - AtCoder A - What month is it? Problem Statement You are given integers X and Y between 1 and 12, inclusive. Find what month it will be Y months after month X (for example, month 1 is January). Cons…

Python算法-贪心算法(Greedy Algorithm)

Python算法:贪心算法(Greedy Algorithm)深度解析 引言 贪心算法(Greedy Algorithm)是计算机科学中最基础的算法设计思想之一,其核心在于通过局部最优选择逐步构建全局最优解。尽管它并不总能保证得到绝对最…

告别臃肿与广告:精选9款安卓电视桌面Launcher,还你清爽高效体验 (2025版)

[实测] 9款优秀安卓电视桌面Launcher推荐:告别原生臃肿,重塑清爽TV体验 引言:当前智能电视桌面的痛点 目前市面上许多智能电视或电视盒子的原生桌面(Launcher)系统,为了商业推广和内容聚合,往…

Docker Desktop紧急修复CVSS9.3高危容器逃逸漏洞

Docker公司修复了Windows和macOS版Docker Desktop应用程序中的一个高危漏洞(CVE-2025-9074,CVSS评分9.3),攻击者可能利用该漏洞突破容器隔离限制。漏洞技术细节根据Docker官方文档披露,恶意容器能够访问Docker引擎并在…

携程旅游的 AI 网关落地实践

原创 董艺荃 Higress 2025年08月21日 16:32 陕西本文整理自携程旅游研发总监董艺荃在2025中国可信云大会上的分享,董艺荃 GitHub ID CH3CHO,同时也是 Higress 的 Maintainer。分享内容分为以下4部分。01 大规模应用 AI 技术过程中遇到了哪些问题02 网关…

CloudBase云开发MCP + CodeBuddy IDE:打造智能化全栈理财助手的完整实践

CloudBase云开发MCP CodeBuddy IDE:打造智能化全栈理财助手的完整实践 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵&#x…

ESP8266学习

一,连接Wifi1.Esp8266连接手机热点ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"手机查看连接信息2.Esp8266连接手机热点进入透传模式ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"ATCIPMUX0 ATCIPSTART"TCP&qu…

Mac安装mitmproxy及操作对监控的请求

在 macOS 上安装和配置 mitmproxy 是一个相对简单的过程,可以使用常见的包管理工具如 Homebrew 或直接通过 Python 的包管理工具 pip。以下是详细的安装步骤: 方法一:使用 Homebrew 安装 Homebrew 是 macOS 上流行的包管理工具。它可以快速安…

c++ 数据结构-堆、优先队列 小总结

之前学习了一些堆、优先队列的知识点,在此做一个小总结。堆(Heap)堆(Heap)是一种特殊的完全二叉树数据结构,具有以下重要特性:结构特性堆是一棵完全二叉树,即除了最后一层外&#xf…

编写Linux下usb设备驱动方法:probe函数中要进行的工作

一. 简介 前一篇文章简单学习了 Linux下usb设备驱动实现流程,文章如下: 编写Linux下usb设备驱动方法:usb设备驱动实现流程-CSDN博客 本文来学习一下 usb设备驱动的 probe函数要完成的任务。 当usb主控制器检测到设备与 驱动相匹配时&…

动态规划:为什么暴力算法会有重复子问题

第一步:先明确 “子问题” 和 “重复子问题” 的定义 在算法中,“子问题” 不是泛指 “小一点的问题”,而是具有明确 “状态参数” 的、可独立求解的问题单元。 状态参数:描述子问题核心信息的变量(比如 01 背包中的 “…

【网络】添加路由时,via和dev参数作用、直连路由

文章目录概述1、带via1.1 添加路由前的初始状态1.2. 执行添加路由的命令1.3. 添加路由后的状态2、不带 via (使用设备接口),直连3、带via还是不带via ?4、dev xx的作用4.1 命令中带via时,建议不带 dev eth0 (让系统自动判断)4.2 命令中带via&#xff0c…

云原生---企业级Kubernetes

一、Kubernetes介绍 1.简介 kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能: 自我修复:一旦某一个容器…

无人机三维路径规划首选算法:RRT_

无人机三维路径规划首选算法:RRT* 要判断哪种算法更适合无人机三维路径规划,需先明确无人机三维路径规划的核心需求,再结合各算法的底层逻辑与特性进行匹配。以下先梳理核心需求,再逐一分析算法特性,最终通过对比得出结…