You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否借助google_ml_kit实现哑铃动作计数?求技术建议

用Google ML Kit实现哑铃动作计数的可行性与技术建议

完全可以通过Google ML Kit实现哑铃动作计数,核心依赖其**Pose Detection(姿势检测)**模块——该模块能精准追踪人体关键骨骼点,足以支撑哑铃弯举、推举等动作的重复计数逻辑。结合你已有的Flutter+Node.js+MongoDB架构,以下是具体技术建议:

1. 核心模块选型与集成

直接使用Google ML Kit的Pose Detection功能,推荐选择Lite模型——它专为移动端优化,兼顾检测速度与精度,适合Flutter跨端实时场景。在Flutter中集成时:

  • 初始化Pose检测器时指定Lite模型:
final poseDetector = GoogleMlKit.vision.poseDetector(
  PoseDetectorOptions(model: PoseDetectionModel.lite),
);
  • 通过摄像头流获取每一帧图像,传入检测器得到人体关键点数据。

2. 动作计数的核心逻辑实现

以常见的哑铃弯举为例,重点追踪3组关键骨骼点:肩膀(leftShoulder/rightShoulder)、手肘(leftElbow/rightElbow)、手腕(leftWrist/rightWrist),通过角度变化判断动作周期:

步骤1:计算手肘夹角

使用三角函数计算三个点的夹角,判断手臂伸直/弯曲状态:

import 'dart:math';
import 'package:google_ml_kit/google_ml_kit.dart';

double calculateElbowAngle(PoseLandmark shoulder, PoseLandmark elbow, PoseLandmark wrist) {
  final radians = atan2(wrist.y - elbow.y, wrist.x - elbow.x) - 
                  atan2(shoulder.y - elbow.y, shoulder.x - elbow.x);
  double angle = (radians * 180 / pi).abs();
  return angle > 180 ? 360 - angle : angle;
}

步骤2:状态机计数逻辑

定义动作状态(伸直→弯曲→伸直),完成一次完整周期则计数+1:

  • 设置角度阈值:比如手臂伸直时手肘角度≥160°,弯曲时≤30°
  • 维护状态变量(如isArmStraight、isArmBent),当从弯曲状态回到伸直状态时,触发计数递增,同时重置状态避免重复计数。

3. 移动端实时性能优化

为避免Flutter应用卡顿,需优化实时检测流程:

  • 降低摄像头分辨率至720p,减少检测数据量
  • 每2-3帧执行一次姿势检测,而非逐帧检测
  • 将检测逻辑放入Isolate中执行,避免阻塞UI线程
  • 开启ML Kit的关键点追踪模式,减少重复检测的计算量

4. 误差容错处理

应对关键点检测的不稳定情况:

  • 设置角度阈值的容错区间(如弯曲阈值设为25°-35°,伸直阈值设为150°-170°)
  • 当关键骨骼点的置信度低于0.5时,暂时停止计数,直到关键点稳定
  • 加入动作防抖逻辑,避免因小幅抖动触发误计数

5. 结合现有架构扩展

将计数结果整合到你已有的系统中:

  • 在Flutter前端完成计数后,调用Node.js后端API,上传用户ID、动作类型、计数次数、时间戳等数据
  • 后端将数据存储到MongoDB,支持后续的用户动作统计、历史记录查询等功能

内容的提问来源于stack exchange,提问作者harizh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 12:10:49