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)

        # 计算腿与右手的角度
        if results.pose_landmarks:
            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)
        else:
            cv2.putText(image, 'No person detected', (50, 50),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

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

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

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

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

代码解释:

  1. 导入库: 导入 OpenCV (cv2)、MediaPipe (mp) 和 math 库。
  2. 初始化 MediaPipe 姿势模型: 创建 mp_drawingmp_pose 对象,用于绘制骨架和处理姿势检测。
  3. 打开视频文件: 使用 cv2.VideoCapture() 打开输入视频文件。
  4. 获取视频信息: 获取视频的帧率、宽度和高度。
  5. 创建输出视频文件: 使用 cv2.VideoWriter() 创建输出视频文件,并设置编解码器、帧率和分辨率。
  6. 处理视频帧: 进入 with mp_pose.Pose(...) 上下文管理器,以使用 MediaPipe 姿势模型处理视频帧。
  7. 读取帧: 使用 cap.read() 读取视频的一帧。
  8. 转换为 RGB 格式: 使用 cv2.cvtColor() 将帧转换为 RGB 格式。
  9. 处理姿势检测: 使用 pose.process() 处理视频帧以进行人体姿势检测。
  10. 绘制骨架: 使用 mp_drawing.draw_landmarks() 绘制检测到的关键点和连接线。
  11. 计算角度: 如果检测到人体,则提取右膝、右踝和右手关键点坐标,并计算右腿与右手的角度。
  12. 显示角度: 在视频帧上显示计算得到的角度值。
  13. 写入视频文件: 将处理后的帧写入输出视频文件。
  14. 显示结果: 使用 cv2.imshow() 显示当前帧的结果。
  15. 退出: 按下 q 键退出程序。
  16. 释放资源: 释放视频文件和窗口资源。

代码改进:

  1. 添加检测不到人体的处理: 如果 results.pose_landmarks 为空,则在视频帧上显示 'No person detected' 的提示信息。
  2. 改进角度计算: 使用 math.degrees() 将弧度转换为角度,以便更容易理解角度信息。
  3. 更清晰的代码结构: 将角度计算和显示部分封装到 if results.pose_landmarks: 条件语句中,以便更清晰地展示代码逻辑。

运行代码:

  1. 将代码保存为 .py 文件,例如 pose_angle.py
  2. 安装必要的库:
pip install opencv-python mediapipe
  1. 运行代码:
python pose_angle.py

注意:

  1. 将代码中的 '1.mp4' 替换为你的输入视频文件路径。
  2. 将代码中的 '2.mp4' 替换为你的输出视频文件路径。

希望这段代码能够帮助你理解如何使用 OpenCV 和 MediaPipe 进行人体姿势检测并计算角度。如果还有其他问题,请随时提问。', 'url': 'https://blog.csdn.net/qq_43149453/article/details/129284488

Python OpenCV 和 MediaPipe 人体姿势检测 - 计算腿与手角度

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

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