import cv2
import mediapipe as mp
import math

# 初始化MediaPipe的人体姿势模型
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose

# 打开输入视频文件
cap = cv2.VideoCapture('1.mp4')

# 获取输入视频的帧率和分辨率
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# 创建输出视频文件
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('2.mp4', fourcc, fps, (width, height))

# 处理视频文件中的每一帧
with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
    while cap.isOpened():
        # 读取一帧
        ret, frame = cap.read()
        if not ret:
            break

        # 将帧转换为RGB格式
        image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        # 处理人体姿势检测
        results = pose.process(image)

        # 绘制人体骨架
        mp_drawing.draw_landmarks(
            frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)
        right_knee = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_KNEE]
        right_ankle = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_ANKLE]
        right_wrist = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST]

        # 计算腿与右手的角度
        angle = math.degrees(math.atan2(right_wrist.y - right_ankle.y, right_wrist.x - right_ankle.x) -
                             math.atan2(right_knee.y - right_ankle.y, right_knee.x - right_ankle.x))

        # 在输出图片上显示角度值
        cv2.putText(image, 'Angle: {:.2f}'.format(angle), (50, 50),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

        # 将帧写入输出视频文件
        out.write(frame)

        # 显示当前帧的结果
        cv2.imshow('MediaPipe Pose Detection', frame)
        cv2.imshow('MediaPipe Pose Estimation', frame)
        # 按下q键退出

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()

代码解释:

  1. 导入必要的库: cv2 用于处理图像和视频,mediapipe 用于人体姿势检测,math 用于角度计算。
  2. 初始化 MediaPipe 人体姿势模型: 使用 mp_pose.Pose 创建模型实例,并设置 min_detection_confidencemin_tracking_confidence 参数,用于控制检测和跟踪的置信度阈值。
  3. 打开输入视频文件: 使用 cv2.VideoCapture 打开视频文件,并获取视频帧率和分辨率。
  4. 创建输出视频文件: 使用 cv2.VideoWriter 创建输出视频文件,并设置视频格式、帧率和分辨率。
  5. 处理每一帧: 循环读取视频每一帧,进行以下操作:
    • 将帧转换为 RGB 格式。
    • 使用 MediaPipe 姿势模型处理图像,得到姿势检测结果。
    • 绘制人体骨架。
    • 获取右膝、右脚踝和右手腕的关键点坐标。
    • 计算腿与右手的角度,使用 math.atan2 计算两个向量之间的角度,并使用 math.degrees 转换为角度值。
    • 在输出图片上显示角度值。
    • 将处理后的帧写入输出视频文件。
    • 显示当前帧的结果。
    • 按下 q 键退出程序。
  6. 释放资源: 循环结束后,释放视频文件和窗口资源。

运行程序:

  1. 将输入视频文件命名为 1.mp4,并将程序保存为 pose_detection.py
  2. 运行程序:python pose_detection.py

程序将读取 1.mp4 视频,进行人体姿势检测,计算腿与右手的角度,并将结果显示在输出视频文件 2.mp4 中。

注意:

  • 确保已经安装了 cv2mediapipe 库。
  • 可以根据需要修改输入视频文件路径和输出视频文件路径。
  • 可以调整 min_detection_confidencemin_tracking_confidence 参数,以获得最佳检测效果。
  • 可以修改代码,计算其他身体部位之间的角度。
  • 可以将角度值保存到文件,以便进行进一步分析。

示例:

以下是使用该程序处理视频并计算腿与右手角度的结果示例:

[插入示例图片或视频]

结论:

本代码演示了如何使用 MediaPipe 进行人体姿势检测,并计算腿与右手的角度。你可以根据需要修改代码,实现其他姿势分析功能。

应用:

人体姿势检测在许多领域都有应用,例如:

  • 医疗保健:评估患者的运动能力、康复进度等。
  • 人机交互:控制设备、游戏等。
  • 运动分析:分析运动员的运动姿势、技术等。
  • 安全监控:识别可疑行为等。

参考:

Python 使用 MediaPipe 进行人体姿势检测并计算腿与右手角度

原文地址: https://www.cveoy.top/t/topic/j9m0 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录