Running Form Tech:使用 DIY AI 分析改善你的步态
发布: (2026年1月5日 GMT+8 09:15)
4 min read
原文: Dev.to
Source: Dev.to
常见生物力学错误
1. 步幅过大
着地时膝盖伸直会把冲击波传递到整条腿。这可以通过 胫骨角度 来衡量:理想状态是胫骨接近垂直,而前倾的角度则表明着地方式抵消了你的动能。如果胫骨角度超过约 15°,跑者很可能出现了步幅过大。
2. 过度垂直振荡
髋部的垂直位移(通常为 5–10 cm)可以显示你是“弹跳”而不是向前推进。大的振荡会浪费能量并增加关节负荷。
视频采集要求
为了获得可靠的数据,请录制满足以下条件的侧面视角视频:
- 侧面视角 – 相机应垂直于跑步机或跑道。
- 稳固支撑 – 使用三脚架或其他固定支架,以防止相机抖动,这会影响表观的“髋部高度”。
- 关节可见 – 穿着贴身衣物,使 AI 能清晰看到髋部、膝盖和踝关节的标记点。
- 光线均匀 – 避免出现严重阴影,以免干扰姿态估计算法。
实现概览
- 姿态估计 – 使用 Python 及 OpenCV、MediaPipe 等库,在每帧中检测 33 个身体关键点。
- 滑动窗口 – 创建一个帧的移动窗口,跟踪踝关节的最低点;这近似于脚掌着地的瞬间。
- 角度计算 – 在识别出的着地点帧,计算膝盖与踝关节之间的角度,以得到胫骨角度。
- 弹跳测量 – 记录每一步周期内髋部的最大和最小 Y 坐标。将像素差转换为厘米(使用已知参考物进行校准),以量化垂直振荡。
# Example: calculate shin angle using MediaPipe landmarks
import cv2
import mediapipe as mp
import numpy as np
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(
static_image_mode=False,
model_complexity=1,
enable_segmentation=False,
min_detection_confidence=0.5,
)
def shin_angle(landmarks):
# landmarks: list of PoseLandmark objects
knee = np.array([
landmarks[mp_pose.PoseLandmark.LEFT_KNEE].x,
landmarks[mp_pose.PoseLandmark.LEFT_KNEE].y,
])
ankle = np.array([
landmarks[mp_pose.PoseLandmark.LEFT_ANKLE].x,
landmarks[mp_pose.PoseLandmark.LEFT_ANKLE].y,
])
shin_vec = ankle - knee
angle = np.degrees(np.arctan2(shin_vec[1], shin_vec[0]))
return abs(angle)
# Process video frames...
实用技巧
- 监测胫骨角度 – 目标是接近垂直的着地(偏差 ≤ 15°),以降低关节冲击。
- 减少弹跳 – 将垂直能量转化为前进动力,提高效率。
- 利用数据 – 使用视频反馈将主观的“感觉”转化为客观的生物力学指标。
如果你是开发者或技术型跑者,想自己动手构建此工具,可在 WellAlly 的完整指南中找到全部 Python 代码和教程。