本文目录导读:

是的,MediaPipe 是 Python 中进行姿态估计的非常流行且推荐的选择之一,它由 Google 开发,专门用于构建多模态(视频、音频、传感器等)的机器学习管道。
以下是为什么 MediaPipe 是姿态估计的好选择,以及如何使用的详细介绍:
为什么选择 MediaPipe?
- 轻量且高效:可以在 CPU 上实时运行,对硬件要求较低(普通笔记本或树莓派均可)。
- 高精度:提供了 33 个关键点(Landmarks)的精确检测(包括面部、躯干、手臂、腿、手部)。
- 跨平台:支持 Windows、macOS、Linux、Android、iOS 以及 Web。
- 易于使用:API 设计简洁,几行代码即可集成。
- 提供多种模型:有 Lite(轻量)、Full(完整)和 Heavy(高精度)模型可供选择。
核心功能:它提供了什么?
MediaPipe Pose 会输出 33 个关键点(Landmarks),每个点包含 x, y, z 坐标和 visibility(可见度)分数。
0:鼻子11, 12:左右肩膀13, 14:左右手肘15, 16:左右手腕23, 24:左右髋部25, 26:左右膝盖27, 28:左右脚踝
如何安装?
pip install mediapipe opencv-python numpy
基本使用代码示例 (Python)
以下是一个从摄像头实时检测姿态并绘制骨架的示例:
import cv2
import mediapipe as mp
# 初始化 MediaPipe Pose
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(static_image_mode=False, # 视频流模式,开启连续检测
model_complexity=1, # 模型复杂度:0=Lite, 1=Full, 2=Heavy
smooth_landmarks=True, # 平滑关键点,减少抖动
enable_segmentation=False, # 是否需要人体分割
min_detection_confidence=0.5, # 检测置信度阈值
min_tracking_confidence=0.5) # 跟踪置信度阈值
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
# 打开摄像头
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, image = cap.read()
if not success:
print("无法读取摄像头画面")
break
# 注意:默认 BGR 转换为 RGB,因为 MediaPipe 需要 RGB 输入
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = pose.process(image_rgb)
# 在原始 BGR 图像上绘制结果
if results.pose_landmarks:
mp_drawing.draw_landmarks(
image,
results.pose_landmarks,
mp_pose.POSE_CONNECTIONS, # 定义哪些点之间连线
landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style()
)
cv2.imshow('MediaPipe Pose', image)
if cv2.waitKey(5) & 0xFF == 27: # 按 ESC 退出
break
cap.release()
cv2.destroyAllWindows()
pose.close()
进阶:如何获取和使用关键点坐标?
如果你需要获取某个关节的角度(例如健身动作检测),可以像下面这样提取坐标:
if results.pose_landmarks:
landmarks = results.pose_landmarks.landmark
# 获取左肩膀、左肘、左手的坐标 (归一化的 0-1)
left_shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]
left_elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]
left_wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]
# 计算肘关节角度(用于判断手臂是否伸直)
def calculate_angle(a, b, c):
import numpy as np
a = np.array(a)
b = np.array(b)
c = np.array(c)
radians = np.arctan2(c[1]-b[1], c[0]-b[0]) - np.arctan2(a[1]-b[1], a[0]-b[0])
angle = np.abs(radians*180.0/np.pi)
if angle > 180.0:
angle = 360-angle
return angle
angle = calculate_angle(left_shoulder, left_elbow, left_wrist)
print(f"左肘关节角度: {angle:.2f}°")
MediaPipe 与其他方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| MediaPipe | 轻量、实时、易用、跨平台 | 不支持3D全身姿态 (只有2.5D),多人检测性能下降 | 移动端、实时交互、简单动作识别 |
| OpenPose | 多人检测效果好,支持手、脸、脚全身 | 非常重,需要GPU,速度慢 | 科研、离线分析、需要高精度多人场景 |
| OpenCV + DNN | 无需额外库,模型可选 | 精度一般,无现成的关键点连接逻辑 | 快速原型开发 |
| MMPose (OpenMMLab) | 精度可到最高,支持多种SOTA模型 | 依赖PyTorch,部署复杂,重型方案 | 科研、前沿算法实验 |
| MoveNet (TensorFlow) | 轻量,移动端优化好 | 生态不如MediaPipe活跃 | Android/TFLite开发 |
| HRNet | 精度极高 | 极重,需要强大GPU | 学术研究、高精度离线分析 |
总结与建议
- 对于大多数 Python 用户(特别是做实时应用、原型开发、健身应用、手势控制、短视频特效):强烈推荐 MediaPipe,它在精度和速度之间取得了极好的平衡。
- 对于需要高精度或多人姿态估计的学术研究:可以考虑 MMPose 或 OpenPose。
- 如果你需要3D姿态(深度信息):MediaPipe 提供的 z 是相对深度(基于髋部中心归一化),不是真实3D坐标,此时可以考虑 BlazePose(MediaPipe的底层模型)结合其他深度估计方法,或者使用 VIBE、SPIN 等3D姿态估计模型。
“Python姿态估计用MediaPipe吗?” 答案是:是的,且非常适合,它是目前最流行的选择,除非你有非常特殊的需求(如超高精度、多人实时、或真实3D坐标)。