共计 2127 个字符,预计需要花费 6 分钟才能阅读完成。
1. 竞赛题目与技术要求
2025 年高教社杯数学建模竞赛 E 题要求开发 AI 辅助智能体测系统,核心需求包括:

- 动作识别:准确识别俯卧撑、引体向上等体测动作
- 自动计数:统计规范动作的完成次数
- 标准度评估:量化分析动作完成质量(如关节角度、速度等)
2. 技术方案选型
2.1 传统传感器方案
- 优势:
- 直接测量物理量(如加速度、角速度)
-
受环境光线干扰小
-
劣势:
- 需要佩戴设备,影响测试自然性
- 不同动作需要不同传感器配置
- 设备成本高,难以大规模应用
2.2 计算机视觉方案
- 优势:
- 非接触式测量,用户体验好
- 单摄像头即可支持多种动作检测
-
硬件成本低(普通摄像头即可)
-
挑战:
- 需要处理复杂背景干扰
- 对光照条件敏感
- 计算复杂度较高
3. 核心实现方案
3.1 姿态估计算法选型
推荐使用 OpenPose 算法,其优势包括:
- 开源且社区支持完善
- 支持多人实时检测
- 提供 18 个关键点输出(足够用于体测动作分析)
# OpenPose 关键点索引示例
# 0: 鼻子 1: 颈部 2: 右肩 3: 右肘 4: 右手腕 5: 左肩...
KEYPOINTS = {
"nose":0, "neck":1,
"r_shoulder":2, "r_elbow":3, "r_wrist":4,
"l_shoulder":5, "l_elbow":6, "l_wrist":7
}
3.2 动作分析模型
关节角度计算
使用向量法计算关键关节角度:
- 提取相邻关键点坐标
- 构建肢体向量(如上臂向量 = 肘部坐标 - 肩部坐标)
- 通过向量点积公式计算夹角
import numpy as np
def calculate_angle(a,b,c):
"""计算三个关键点之间的夹角"""
ba = a - b
bc = c - b
cosine = np.dot(ba, bc) / (np.linalg.norm(ba)*np.linalg.norm(bc))
return np.degrees(np.arccos(cosine))
动作计数逻辑
以俯卧撑为例的计数算法:
- 持续监测肘关节角度变化
- 当角度 <90°时标记为下潜阶段
- 当角度恢复 >160°时完成计数
- 添加滞后阈值防止抖动误判
3.3 完整实现代码
import cv2
import numpy as np
from openpose import OpenPose # 假设已封装 OpenPose 接口
# 初始化模型
op = OpenPose(model_path='pose_model.pb')
# 视频处理主循环
cap = cv2.VideoCapture(0)
counter = 0
stage = None # 'down' or 'up'
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 姿态估计
keypoints = op.detect(frame)
# 提取关键点
try:
shoulder = keypoints[KEYPOINTS['r_shoulder']]
elbow = keypoints[KEYPOINTS['r_elbow']]
wrist = keypoints[KEYPOINTS['r_wrist']]
# 计算肘关节角度
angle = calculate_angle(shoulder, elbow, wrist)
# 俯卧撑计数逻辑
if angle < 90:
stage = "down"
if angle > 160 and stage == 'down':
stage = "up"
counter += 1
print(f"Count: {counter}")
# 可视化
cv2.putText(frame, f"Count: {counter}", (50,50),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 2)
cv2.putText(frame, f"Angle: {angle:.1f}", (50,100),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
except:
pass
cv2.imshow('AI Fitness Test', frame)
if cv2.waitKey(10) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
4. 性能优化策略
4.1 模型轻量化
- 使用 MobileNet 作为 OpenPose 的 backbone
- 量化模型参数(FP32→INT8)
- 裁剪非必要输出层
4.2 多人并行处理
- 采用异步推理管道
- 使用跟踪算法维持 ID 一致性
- 区域提议网络 (ROI) 减少计算量
5. 避坑指南
5.1 光照干扰解决方案
- 实时白平衡调整
- 背景减除算法
- 红外摄像头备用方案
5.2 动作判定阈值
- 俯卧撑:下潜角度 90±5°,恢复角度 160±5°
- 引体向上:下巴过杠 + 肘部伸直
- 需根据实际测试数据校准
6. 方案扩展思考
该框架可扩展至其他体测项目:
- 立定跳远:通过起跳 / 落地时刻的质心变化测距
- 坐位体前屈:测量指尖与脚掌的相对位移
- 仰卧起坐:监测肩部与髋部的距离变化
建议改进方向:
- 加入惯性测量单元 (IMU) 数据融合
- 开发异常动作检测模型
- 设计个性化训练建议系统
7. 总结
本文实现了基于计算机视觉的智能体测系统核心功能,重点解决了动作识别、计数和质量评估三大挑战。实际部署时建议:
- 使用 1080p 以上分辨率摄像头
- 确保测试区域光照均匀
- 针对不同体型调整参数阈值
期待同学们在竞赛中进一步优化本方案,创造更出色的作品!
正文完
发表至: 未分类
近一天内
