Python Mediapipe Holistic仅绘制手臂姿态问题求助
只绘制MediaPipe Holistic中的手臂部位
要实现只绘制手臂、排除其他身体部位的需求,核心是自定义姿态关键点的连接列表,替代默认的全身连接。以下是具体实现步骤和代码:
1. 明确手臂相关的姿态关键点
MediaPipe Holistic的Pose模块中,手臂的核心关键点及对应关系:
- 右侧手臂:右肩 → 右肘 → 右手腕
- 左侧手臂:左肩 → 左肘 → 左手腕
对应的关键点枚举值(也可直接用索引数字):
mp_holistic.PoseLandmark.RIGHT_SHOULDER(索引12)mp_holistic.PoseLandmark.RIGHT_ELBOW(索引14)mp_holistic.PoseLandmark.RIGHT_WRIST(索引16)mp_holistic.PoseLandmark.LEFT_SHOULDER(索引11)mp_holistic.PoseLandmark.LEFT_ELBOW(索引13)mp_holistic.PoseLandmark.LEFT_WRIST(索引15)
2. 自定义手臂连接列表
创建仅包含手臂部位的连接关系,替代默认的mp_holistic.POSE_CONNECTIONS:
ARM_CONNECTIONS = [ (mp_holistic.PoseLandmark.RIGHT_SHOULDER, mp_holistic.PoseLandmark.RIGHT_ELBOW), (mp_holistic.PoseLandmark.RIGHT_ELBOW, mp_holistic.PoseLandmark.RIGHT_WRIST), (mp_holistic.PoseLandmark.LEFT_SHOULDER, mp_holistic.PoseLandmark.LEFT_ELBOW), (mp_holistic.PoseLandmark.LEFT_ELBOW, mp_holistic.PoseLandmark.LEFT_WRIST) ]
3. 完整代码示例
import cv2 import mediapipe as mp # 初始化MediaPipe模块 mp_holistic = mp.solutions.holistic mp_drawing = mp.solutions.drawing_utils # 自定义手臂连接 ARM_CONNECTIONS = [ (mp_holistic.PoseLandmark.RIGHT_SHOULDER, mp_holistic.PoseLandmark.RIGHT_ELBOW), (mp_holistic.PoseLandmark.RIGHT_ELBOW, mp_holistic.PoseLandmark.RIGHT_WRIST), (mp_holistic.PoseLandmark.LEFT_SHOULDER, mp_holistic.PoseLandmark.LEFT_ELBOW), (mp_holistic.PoseLandmark.LEFT_ELBOW, mp_holistic.PoseLandmark.LEFT_WRIST) ] # 处理视频流 cap = cv2.VideoCapture(0) with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic: while cap.isOpened(): ret, frame = cap.read() if not ret: break # 图像格式转换(MediaPipe要求RGB输入) image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = holistic.process(image) image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) # 仅绘制手臂的关键点和连接 mp_drawing.draw_landmarks( image, results.pose_landmarks, connections=ARM_CONNECTIONS, # 自定义关键点样式 landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255, 0, 0), thickness=2, circle_radius=4), # 自定义连接线条样式 connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2) ) cv2.imshow('Arm Only Visualization', image) if cv2.waitKey(10) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
可选:包含手部绘制
如果需要连着手部一起绘制,可在上述代码中添加手部的绘制逻辑:
# 绘制右手关键点及连接 if results.right_hand_landmarks: mp_drawing.draw_landmarks( image, results.right_hand_landmarks, mp_holistic.HAND_CONNECTIONS, landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255, 0, 0), thickness=2, circle_radius=3), connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2) ) # 绘制左手关键点及连接 if results.left_hand_landmarks: mp_drawing.draw_landmarks( image, results.left_hand_landmarks, mp_holistic.HAND_CONNECTIONS, landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255, 0, 0), thickness=2, circle_radius=3), connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2) )
内容的提问来源于stack exchange,提问作者Abu Bakar BSA
相关产品推荐
相关产品推荐

