Python OpenCV 和 MediaPipe 人体姿势检测 - 计算腿与手角度
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()
代码解释:
- 导入库: 导入 OpenCV (cv2)、MediaPipe (mp) 和 math 库。
- 初始化 MediaPipe 姿势模型: 创建
mp_drawing和mp_pose对象,用于绘制骨架和处理姿势检测。 - 打开视频文件: 使用
cv2.VideoCapture()打开输入视频文件。 - 获取视频信息: 获取视频的帧率、宽度和高度。
- 创建输出视频文件: 使用
cv2.VideoWriter()创建输出视频文件,并设置编解码器、帧率和分辨率。 - 处理视频帧: 进入
with mp_pose.Pose(...)上下文管理器,以使用 MediaPipe 姿势模型处理视频帧。 - 读取帧: 使用
cap.read()读取视频的一帧。 - 转换为 RGB 格式: 使用
cv2.cvtColor()将帧转换为 RGB 格式。 - 处理姿势检测: 使用
pose.process()处理视频帧以进行人体姿势检测。 - 绘制骨架: 使用
mp_drawing.draw_landmarks()绘制检测到的关键点和连接线。 - 计算角度: 如果检测到人体,则提取右膝、右踝和右手关键点坐标,并计算右腿与右手的角度。
- 显示角度: 在视频帧上显示计算得到的角度值。
- 写入视频文件: 将处理后的帧写入输出视频文件。
- 显示结果: 使用
cv2.imshow()显示当前帧的结果。 - 退出: 按下
q键退出程序。 - 释放资源: 释放视频文件和窗口资源。
代码改进:
- 添加检测不到人体的处理: 如果
results.pose_landmarks为空,则在视频帧上显示 'No person detected' 的提示信息。 - 改进角度计算: 使用
math.degrees()将弧度转换为角度,以便更容易理解角度信息。 - 更清晰的代码结构: 将角度计算和显示部分封装到
if results.pose_landmarks:条件语句中,以便更清晰地展示代码逻辑。
运行代码:
- 将代码保存为
.py文件,例如pose_angle.py。 - 安装必要的库:
pip install opencv-python mediapipe
- 运行代码:
python pose_angle.py
注意:
- 将代码中的
'1.mp4'替换为你的输入视频文件路径。 - 将代码中的
'2.mp4'替换为你的输出视频文件路径。
希望这段代码能够帮助你理解如何使用 OpenCV 和 MediaPipe 进行人体姿势检测并计算角度。如果还有其他问题,请随时提问。', 'url': 'https://blog.csdn.net/qq_43149453/article/details/129284488
原文地址: https://www.cveoy.top/t/topic/j9sp 著作权归作者所有。请勿转载和采集!