You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键修改说明

  1. 关键点过滤:通过TARGET_LANDMARKS定义需要保留的指尖索引,遍历关键点时仅处理该集合内的索引,直接跳过其他点,避免绘制多余白点。
  2. 自定义绘制:摒弃MediaPipe默认的draw_landmarks方法(会绘制所有关键点和连线),改用cv2.circle手动绘制指定关键点,完全控制显示内容。
  3. 文本标注:利用cv2.putText在每个关键点的上方(y坐标减10)添加指尖名称,字体、颜色和厚度可根据需求调整(比如把白色改成红色(0,0,255))。

关于指甲区域提取的补充

如果后续需要提取指甲区域,可以基于指尖关键点(如8号食指指尖)和相邻指关节关键点(如6、7号)的位置,计算指甲的大致边界:

  • 以指尖点为参考,结合指节的位置偏移,划定一个矩形区域
  • 利用OpenCV的roi功能截取该区域即可,具体偏移量可根据实际场景调整

内容的提问来源于stack exchange,提问作者Keen Alia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 13:56:39