胡杨河市网站建设_网站建设公司_版式布局_seo优化
2026/1/15 18:01:43 网站建设 项目流程

MediaPipe Pose完整教程:从安装到高级应用

1. 引言

1.1 学习目标

本文将带你全面掌握MediaPipe Pose的使用方法,涵盖从环境搭建、基础检测、WebUI集成到高级姿态分析的完整流程。学完本教程后,你将能够:

  • 在本地快速部署 MediaPipe Pose 模型
  • 实现图像与视频中的人体骨骼关键点检测
  • 构建可视化 Web 界面进行实时姿态展示
  • 基于关键点数据开发进阶应用(如动作识别、姿态评分)

本教程特别适合计算机视觉初学者、AI 应用开发者以及健身/运动科技领域的技术探索者。

1.2 前置知识

建议具备以下基础: - Python 编程经验(熟悉函数与类) - 基本了解 OpenCV 和图像处理概念 - 了解 HTTP 服务与前端交互原理(非必须)

1.3 教程价值

不同于碎片化教程,本文提供端到端可运行方案,所有代码均经过验证,并针对 CPU 场景优化。无论你是想快速验证原型,还是构建稳定本地服务,都能从中获得实用指导。


2. 环境准备与安装

2.1 安装 MediaPipe

MediaPipe 是 Google 开源的跨平台机器学习框架,支持多种预训练模型。我们使用其mediapipe.solutions.pose模块实现人体姿态估计。

pip install mediapipe opencv-python flask numpy

✅ 推荐使用 Python 3.8+ 环境,避免版本兼容问题。

2.2 验证安装

运行以下代码测试是否安装成功:

import cv2 import mediapipe as mp mp_pose = mp.solutions.pose pose = mp_pose.Pose(static_image_mode=True) # 读取测试图片 image = cv2.imread("test.jpg") rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = pose.process(rgb_image) if results.pose_landmarks: print("✅ 姿态检测成功!共检测到", len(results.pose_landmarks.landmark), "个关键点") else: print("❌ 未检测到人体") pose.close()

若输出“姿态检测成功”,说明环境已就绪。


3. 核心功能实现

3.1 关键点检测原理

MediaPipe Pose 使用轻量级 CNN 模型在图像中定位人体,并输出33 个标准化的 3D 关键点坐标(x, y, z, visibility)。这些点覆盖:

  • 面部:眼睛、耳朵、嘴
  • 躯干:肩膀、髋部、脊柱
  • 四肢:肘、腕、膝、踝等

每个关键点以归一化坐标表示(0~1),便于适配不同分辨率图像。

3.2 图像姿态检测完整代码

import cv2 import mediapipe as mp import numpy as np def detect_pose_in_image(image_path): # 初始化模型 mp_drawing = mp.solutions.drawing_utils mp_pose = mp.solutions.pose # 加载图像 image = cv2.imread(image_path) image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) with mp_pose.Pose( static_image_mode=True, model_complexity=1, # 模型复杂度:0(轻量)/1(中)/2(重) enable_segmentation=False, # 是否启用身体分割 min_detection_confidence=0.5 ) as pose: # 执行检测 results = pose.process(image_rgb) if not results.pose_landmarks: print("⚠️ 未检测到人体") return None # 绘制骨架连接图 annotated_image = image.copy() mp_drawing.draw_landmarks( annotated_image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS, landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255, 0, 0), thickness=2, circle_radius=2), connection_drawing_spec=mp_drawing.DrawingSpec(color=(255, 255, 255), thickness=2) ) # 保存结果 cv2.imwrite("output_pose.jpg", annotated_image) print("✅ 骨骼图已保存至 output_pose.jpg") # 提取关键点数据 landmarks = [] for lm in results.pose_landmarks.landmark: landmarks.append({ 'x': lm.x, 'y': lm.y, 'z': lm.z, 'visibility': lm.visibility }) return landmarks # 调用示例 landmarks = detect_pose_in_image("person.jpg") if landmarks: print(f"共提取 {len(landmarks)} 个关键点,例如手肘位置: x={landmarks[14]['x']:.3f}")

🔍代码解析: -model_complexity=1平衡精度与速度,适合 CPU 推理 -POSE_CONNECTIONS自动定义骨骼连线规则 - 输出为字典列表,便于后续分析


3.3 视频流实时检测

扩展至摄像头或视频文件处理:

def real_time_pose_estimation(): mp_drawing = mp.solutions.drawing_utils mp_pose = mp.solutions.pose cap = cv2.VideoCapture(0) # 可替换为视频路径 with mp_pose.Pose( static_image_mode=False, model_complexity=1, min_detection_confidence=0.5, min_tracking_confidence=0.5 ) as pose: while cap.isOpened(): success, frame = cap.read() if not success: break image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = pose.process(image_rgb) # 绘制结果 if results.pose_landmarks: mp_drawing.draw_landmarks( frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS, landmark_drawing_spec=mp_drawing.DrawingSpec(color=(0, 0, 255), thickness=2, circle_radius=2), connection_drawing_spec=mp_drawing.DrawingSpec(color=(255, 255, 255), thickness=2) ) cv2.imshow('MediaPipe Pose', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() # 启动实时检测 real_time_pose_estimation()

性能提示:在普通 CPU 上可达 15-25 FPS,满足多数实时场景需求。


4. WebUI 集成与可视化服务

4.1 构建 Flask Web 服务

我们将封装一个简单的 Web 接口,支持上传图片并返回带骨骼标注的结果。

from flask import Flask, request, send_file, render_template_string import os app = Flask(__name__) UPLOAD_FOLDER = 'uploads' os.makedirs(UPLOAD_FOLDER, exist_ok=True) HTML_TEMPLATE = ''' <!DOCTYPE html> <html> <head><title>MediaPipe Pose WebUI</title></head> <body> <h2>上传人像照片进行骨骼关键点检测</h2> <form method="post" enctype="multipart/form-data"> <input type="file" name="file" accept="image/*" required> <input type="submit" value="上传并检测"> </form> </body> </html> ''' @app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': file = request.files['file'] if file: filepath = os.path.join(UPLOAD_FOLDER, file.filename) file.save(filepath) # 调用检测函数(复用前面定义的 detect_pose_in_image) detect_pose_in_image(filepath) return send_file("output_pose.jpg", mimetype='image/jpeg') return render_template_string(HTML_TEMPLATE) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=False)

4.2 运行 Web 服务

python web_app.py

访问http://localhost:5000即可使用图形界面上传图片,系统自动返回标注后的骨骼图。

🎨视觉说明: -红点:关节位置(如手肘、膝盖) -白线:骨骼连接关系 - 所有处理均在本地完成,无隐私泄露风险


5. 高级应用拓展

5.1 动作角度计算(用于健身指导)

我们可以利用关键点坐标计算关节角度,判断动作标准性。例如计算肘部弯曲角度

import math def calculate_angle(a, b, c): """计算三点形成的角度(a-b-c)""" ba = np.array([a['x'] - b['x'], a['y'] - b['y']]) bc = np.array([c['x'] - b['x'], c['y'] - b['y']]) cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc)) angle = np.arccos(cosine_angle) return math.degrees(angle) # 示例:计算左臂角度(肩-肘-腕) if landmarks: shoulder = landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value] elbow = landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value] wrist = landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value] angle = calculate_angle(shoulder, elbow, wrist) print(f"左臂弯曲角度: {angle:.1f}°")

💡 应用场景:俯卧撑、深蹲等动作规范性评分系统。


5.2 姿态相似度比对

可用于舞蹈教学、康复训练等场景,比较两个姿态的相似度:

from scipy.spatial.distance import cosine def pose_similarity(pose1, pose2, threshold=0.9): """基于余弦相似度比较两个姿态""" vec1 = [p['x'] + p['y'] for p in pose1] # 简化为二维特征向量 vec2 = [p['x'] + p['y'] for p in pose2] similarity = 1 - cosine(vec1, vec2) return similarity > threshold, similarity # 示例:比对两张图片的姿态 # landmarks1 = detect_pose_in_image("pose1.jpg") # landmarks2 = detect_pose_in_image("pose2.jpg") # is_similar, score = pose_similarity(landmarks1, landmarks2) # print(f"姿态相似: {is_similar}, 相似度: {score:.3f}")

⚠️ 注意:实际项目中应使用更复杂的特征提取方式(如 Procrustes 分析)提升准确性。


6. 总结

6.1 核心收获回顾

通过本文,我们完成了从零开始构建 MediaPipe Pose 应用的全过程:

  • ✅ 成功安装并验证了 MediaPipe 环境
  • ✅ 实现了图像与视频中的高精度 33 关键点检测
  • ✅ 构建了本地 WebUI 服务,支持直观可视化
  • ✅ 掌握了动作角度计算与姿态比对等进阶技巧

该项目完全运行于 CPU,无需 GPU 或外部 API,具备高稳定性、低延迟、强隐私保护三大优势,非常适合嵌入式设备、教育产品和企业内部系统。

6.2 最佳实践建议

  1. 模型选择:优先使用model_complexity=1,兼顾精度与性能
  2. 输入预处理:确保人物处于画面中心,避免遮挡
  3. 结果过滤:根据visibility字段剔除低置信度关键点
  4. 批量处理:对视频帧序列添加跟踪逻辑,减少抖动

6.3 下一步学习路径

  • 尝试 MediaPipe Holistic 模型(整合姿态、手势、面部)
  • 结合 TensorFlow Lite 部署到移动端
  • 开发完整的健身动作评分 App

💡获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询