Python 人体姿态识别:绘制骨架并计算关节角度
Python 人体姿态识别:绘制骨架并计算关节角度
本文介绍如何使用 MediaPipe 在 Python 中进行人体姿态识别,绘制人体骨架,并计算左肩、左肘和左手腕之间的角度。
import mediapipe as mp
import cv2
# 初始化 MediaPipe 姿态估计模型
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()
# 初始化绘图工具
mp_drawing = mp.solutions.drawing_utils
# 加载视频或图像
cap = cv2.VideoCapture(0)
while True:
# 读取视频帧或图像
success, frame = cap.read()
if not success:
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]
# 获取左膝、左踝和左手腕关键点的信息
left_knee = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_KNEE]
left_ankle = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_ANKLE]
left_wrist = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST]
# 获取左肩、左肘和左手腕的角度
left_shoulder = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER]
left_elbow = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW]
left_wrist_angle = calculate_angle(left_shoulder, left_elbow, left_wrist)
# 显示结果
cv2.imshow('Pose Estimation', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
# 计算三个关键点之间的角度函数
def calculate_angle(a, b, c):
# 计算向量
ba = [b.x - a.x, b.y - a.y]
bc = [c.x - b.x, c.y - b.y]
# 计算向量点积
dot_product = ba[0] * bc[0] + ba[1] * bc[1]
# 计算向量模长
magnitude_ba = (ba[0]**2 + ba[1]**2)**0.5
magnitude_bc = (bc[0]**2 + bc[1]**2)**0.5
# 计算角度
angle = np.arccos(dot_product / (magnitude_ba * magnitude_bc))
angle = np.degrees(angle)
return angle
代码说明:
- 导入必要的库,包括 mediapipe, cv2, numpy。
- 初始化 MediaPipe 姿态估计模型和绘图工具。
- 加载视频或图像,并循环处理每一帧。
- 将图像转换为 RGB 格式,并使用 MediaPipe 模型进行姿态估计。
- 绘制人体骨架。
- 获取左右膝盖、左右踝关节、左右手腕的关键点信息。
- 获取左肩、左肘和左手腕关键点,并使用
calculate_angle()函数计算角度。 - 显示结果,并监听键盘输入。
- 释放资源。
角度计算函数 calculate_angle():
- 计算向量 ba 和 bc。
- 计算向量点积。
- 计算向量模长。
- 计算角度,并将其转换为角度制。
通过以上代码,我们可以成功绘制人体骨架,并计算左肩、左肘和左手腕之间的角度,为进一步的动作识别和分析提供基础。
原文地址: https://www.cveoy.top/t/topic/kdTm 著作权归作者所有。请勿转载和采集!