如何在MediaPipe中仅显示指定手部关键点并添加文本标注
解决方案
核心修改思路
要实现仅显示指定手部关键点、移除多余白点并添加文本标注,只需在原有代码基础上做以下几点调整:
- 过滤保留索引为4、8、12、16、20的指尖关键点,忽略其他所有关键点
- 手动绘制指定关键点的白点
- 在每个关键点上方添加对应指尖的文本标注
修改后的完整代码
import cv2 import mediapipe as mp # 初始化MediaPipe手部检测模块 mp_hands = mp.solutions.hands hands = mp_hands.Hands( static_image_mode=False, max_num_hands=2, min_detection_confidence=0.5 ) # 打开摄像头 cap = cv2.VideoCapture(0) # 定义需要保留的指尖关键点索引及对应名称 TARGET_LANDMARKS = [4, 8, 12, 16, 20] LANDMARK_LABELS = { 4: "拇指", 8: "食指", 12: "中指", 16: "无名指", 20: "小指" } while cap.isOpened(): success, frame = cap.read() if not success: break # 镜像翻转帧并转为RGB格式(MediaPipe要求输入为RGB) frame = cv2.flip(frame, 1) rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 检测手部关键点 results = hands.process(rgb_frame) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # 遍历所有关键点,仅处理目标索引的点 for idx, landmark in enumerate(hand_landmarks.landmark): if idx in TARGET_LANDMARKS: # 将归一化坐标转为图像像素坐标 h, w, _ = frame.shape pixel_x = int(landmark.x * w) pixel_y = int(landmark.y * h) # 绘制白色关键点(半径5,实心) cv2.circle(frame, (pixel_x, pixel_y), 5, (255, 255, 255), -1) # 在关键点上方10像素处添加文本标注 cv2.putText( frame, LANDMARK_LABELS[idx], (pixel_x, pixel_y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2 ) # 显示处理后的画面 cv2.imshow("Fingertip Landmarks", frame) if cv2.waitKey(5) & 0xFF == 27: break # 释放资源 cap.release() cv2.destroyAllWindows()
关键修改说明
- 关键点过滤:通过
TARGET_LANDMARKS定义需要保留的指尖索引,遍历关键点时仅处理该集合内的索引,直接跳过其他点,避免绘制多余白点。 - 自定义绘制:摒弃MediaPipe默认的
draw_landmarks方法(会绘制所有关键点和连线),改用cv2.circle手动绘制指定关键点,完全控制显示内容。 - 文本标注:利用
cv2.putText在每个关键点的上方(y坐标减10)添加指尖名称,字体、颜色和厚度可根据需求调整(比如把白色改成红色(0,0,255))。
关于指甲区域提取的补充
如果后续需要提取指甲区域,可以基于指尖关键点(如8号食指指尖)和相邻指关节关键点(如6、7号)的位置,计算指甲的大致边界:
- 以指尖点为参考,结合指节的位置偏移,划定一个矩形区域
- 利用OpenCV的
roi功能截取该区域即可,具体偏移量可根据实际场景调整
内容的提问来源于stack exchange,提问作者Keen Alia
相关产品推荐
相关产品推荐

