3行代码搞定健身动作矫正:MediaPipe Python姿势检测终极实践指南

3行代码搞定健身动作矫正:MediaPipe Python姿势检测终极实践指南

【免费下载链接】mediapipe Cross-platform, customizable ML solutions for live and streaming media. 【免费下载链接】mediapipe 项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe

MediaPipe是一款跨平台的机器学习解决方案,专为实时媒体处理设计。通过其强大的姿势检测功能,我们可以轻松实现健身动作的实时矫正,帮助用户规范运动姿势,避免运动损伤。本文将带你快速掌握如何使用MediaPipe的Python API进行姿势检测与健身动作矫正。

为什么选择MediaPipe进行姿势检测?

MediaPipe提供了全面的人体姿态估计能力,能够精准识别身体关键点,包括骨骼关节位置、肢体角度等。其主要优势在于:

  • 实时性:优化的模型结构确保在普通设备上也能达到实时处理速度
  • 高精度:采用先进的机器学习算法,关键点检测准确率高
  • 轻量化:模型体积小,适合在移动设备和边缘计算环境中部署
  • 易用性:提供简洁的API接口,几行代码即可实现复杂的姿势检测功能

MediaPipe姿势检测示例 图:MediaPipe实时物体检测界面,展示了其强大的实时识别能力

快速开始:3行代码实现姿势检测

环境准备

首先,确保你已经安装了必要的依赖:

git clone https://gitcode.com/GitHub_Trending/med/mediapipe
cd mediapipe
pip install -r requirements.txt

核心代码实现

使用MediaPipe的Python API,只需几行代码即可实现姿势检测:

import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose

# 初始化姿势检测模型
with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
    # 处理图像或视频流
    results = pose.process(image)
    # 绘制检测结果
    mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

这段代码实现了三个核心功能:初始化姿势检测模型、处理图像获取姿势数据、绘制骨骼关键点。通过这些关键点数据,我们可以进一步分析人体姿势。

健身动作矫正的实现原理

关键点检测

MediaPipe能够检测人体的33个关键点,包括头部、躯干、四肢等主要关节位置。这些关键点的坐标信息为姿势分析提供了基础数据:

面部关键点检测 图:MediaPipe面部关键点检测示例,展示了精准的特征点识别能力

角度计算

通过关键点坐标,我们可以计算出各个关节的角度,如肘关节、膝关节等。以肘关节角度计算为例:

def calculate_angle(a, b, c):
    """
    计算三点构成的角度
    a, b, c: 三个点的坐标 (x, y)
    """
    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

姿势判断与矫正提示

通过预设的标准动作角度范围,我们可以判断用户的动作是否标准,并给出相应的矫正提示:

# 计算肘关节角度
elbow_angle = calculate_angle(shoulder, elbow, wrist)

# 判断是否在标准范围内
if elbow_angle < 80 or elbow_angle > 100:
    print("肘关节角度不正确,请调整手臂弯曲程度")

实战案例:俯卧撑姿势矫正

完整代码实现

下面是一个完整的俯卧撑姿势矫正程序:

import cv2
import mediapipe as mp
import numpy as np

mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose

def calculate_angle(a, b, c):
    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

# 实时视频处理
cap = cv2.VideoCapture(0)
with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
    while cap.isOpened():
        ret, frame = cap.read()
        
        # 处理图像
        image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        image.flags.writeable = False
        results = pose.process(image)
        
        # 绘制结果
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
        
        # 提取关键点
        try:
            landmarks = results.pose_landmarks.landmark
            
            # 获取关键关节点
            shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
                        landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]
            elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x,
                    landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]
            wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x,
                    landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]
            
            # 计算角度
            angle = calculate_angle(shoulder, elbow, wrist)
            
            # 显示角度
            cv2.putText(image, f'Elbow Angle: {angle:.2f}', 
                        tuple(np.multiply(elbow, [640, 480]).astype(int)),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)
            
            # 姿势判断
            if angle > 160:
                cv2.putText(image, '手臂太直', (50, 50), 
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
            elif angle < 90:
                cv2.putText(image, '手臂弯曲过度', (50, 50), 
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
            else:
                cv2.putText(image, '姿势正确', (50, 50), 
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
                
        except:
            pass
        
        cv2.imshow('MediaPipe 俯卧撑姿势矫正', image)
        
        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

关键点分析

在俯卧撑姿势矫正中,我们主要关注以下几个关键点:

  1. 肩部:确保身体成一直线,不要耸肩或含胸
  2. 肘部:弯曲角度应在90-160度之间,避免过度弯曲或过直
  3. 髋部:保持身体成一直线,不要塌腰或撅臀

通过实时监测这些关键点的位置和角度,程序可以及时给出姿势矫正提示。

高级应用:自定义动作矫正

MediaPipe不仅可以用于俯卧撑姿势矫正,还可以扩展到其他健身动作,如深蹲、平板支撑等。你可以通过以下步骤实现自定义动作矫正:

  1. 收集标准动作数据:录制标准动作视频,提取关键点坐标
  2. 定义角度范围:根据专业指导确定每个动作的标准角度范围
  3. 开发判断逻辑:编写代码判断用户动作是否在标准范围内
  4. 提供矫正反馈:设计直观的反馈机制,如文字提示、声音提醒等

手势识别示例 图:MediaPipe手势识别示例,展示了其对复杂手部动作的识别能力

总结与扩展

通过本文的介绍,你已经了解了如何使用MediaPipe实现健身动作矫正。MediaPipe的强大之处在于其简单易用的API和高性能的姿态估计算法,让复杂的计算机视觉任务变得触手可及。

除了健身动作矫正,MediaPipe还可以应用于:

  • 舞蹈动作教学与纠正
  • 康复训练监测
  • 运动表现分析
  • 虚拟现实交互

如果你想深入学习MediaPipe,可以参考官方文档:docs/getting_started/python.md,里面提供了更详细的API说明和示例代码。

现在,你已经掌握了使用MediaPipe进行姿势检测的基本方法,快去开发属于你自己的健身辅助应用吧!💪

【免费下载链接】mediapipe Cross-platform, customizable ML solutions for live and streaming media. 【免费下载链接】mediapipe 项目地址: https://gitcode.com/GitHub_Trending/med/mediapipe

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值