如何使用MediaPipe仅绘制身体关键点及连接,排除面部关键点与连接
如何用MediaPipe仅绘制身体关键点及连接(移除面部关键点)
要实现只绘制身体的关键点和连接,你需要自定义过滤面部的关键点ID和对应的连接关系——因为MediaPipe Pose默认包含了头部/面部的标记点(ID 0-10)。以下是修改后的代码和说明:
核心思路
MediaPipe Pose的面部关键点ID范围是0-10(包含鼻子、眼睛、耳朵等),我们只保留从11开始的身体部位关键点,并过滤掉涉及面部的连接关系。
修改后的完整代码
import cv2 import mediapipe as mp mpDraw = mp.solutions.drawing_utils mpPose = mp.solutions.pose pose = mpPose.Pose() # 定义要保留的身体关键点ID(排除面部0-10) BODY_LANDMARKS_IDS = list(range(11, 33)) # 过滤出仅涉及身体关键点的连接关系 BODY_CONNECTIONS = [conn for conn in mpPose.POSE_CONNECTIONS if conn[0] in BODY_LANDMARKS_IDS and conn[1] in BODY_LANDMARKS_IDS] # 自定义绘制样式(可选,调整关键点和连线的视觉效果) landmark_style = mpDraw.DrawingSpec(color=(0,255,0), thickness=2, circle_radius=3) connection_style = mpDraw.DrawingSpec(color=(255,0,0), thickness=2) cap = cv2.VideoCapture("segment4_pumping_and_foiling.mp4") while True: success, img = cap.read() if not success: break # 视频读取完毕后退出循环 results = pose.process(img) if results.pose_landmarks: # 仅绘制身体关键点和对应连接 mpDraw.draw_landmarks( img, results.pose_landmarks, BODY_CONNECTIONS, landmark_drawing_spec=landmark_style, connection_drawing_spec=connection_style ) cv2.imshow("video", img) if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() cap.release()
关键改动说明
- 过滤关键点ID:
BODY_LANDMARKS_IDS明确列出了所有身体部位的关键点ID,直接排除了0-10的面部标记。 - 过滤连接关系:
BODY_CONNECTIONS从MediaPipe默认的POSE_CONNECTIONS中筛选出仅涉及身体关键点的连接,确保不会绘制面部相关的连线。 - 冗余代码清理:你原代码中导入的
from cvzone.PoseModule import PoseDetector并未实际使用,已直接删除。
内容的提问来源于stack exchange,提问作者Luis Delbergue Chico
相关产品推荐
相关产品推荐

