本文目录导读:

是的,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坐标)。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播