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

如何使用MediaPipe移除特定手部关键点(去除拇指关键点)

问题原因

你自定义连接列表后仍能看到拇指关键点圆点,是因为mp.solutions.drawing_utils.draw_landmarks的connections参数仅控制关键点之间的连线渲染逻辑,默认会绘制手部检测输出的全部21个关键点的标记圆点,不会随你自定义的连接列表自动过滤无连接的关键点。

MediaPipe手部关键点中,拇指对应的ID为1、2、3、4(0为手腕点,5-20为其余四指关键点),只要针对性屏蔽这几个ID的圆点绘制即可。

需要移除的拇指关键点标记点

实现方案

改造成本最低的方式是给landmark_drawing_spec传入和关键点数量等长的样式列表,单独控制每个关键点的绘制规则,不需要修改模型推理逻辑,也不用自己手写绘制循环。

核心修改点:

  • 给需要显示的关键点配置你原本的圆点样式
  • 给需要隐藏的拇指关键点配置半径为0的圆点样式,渲染时会直接跳过这些点的绘制
  • 顺手修复原代码中重复翻转图像、未释放窗口的小问题

修改后的完整可运行代码:

import cv2
import mediapipe as mp

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
# 自定义的无拇指骨骼连接
handConnection = [(5, 9), (10, 11), (5, 6), (15, 16), (13, 17), (18, 19),
            (6, 7), (0, 17), (9, 10), (0, 5), (14, 15),
            (11, 12), (19, 20), (9, 13), (17, 18), (13, 14), (7, 8)]
# 需要隐藏的拇指关键点ID集合
HIDE_LANDMARK_IDS = {1, 2, 3, 4}

cap = cv2.VideoCapture(1)

def main():
    hands = mp_hands.Hands(
        min_detection_confidence=0.7, min_tracking_confidence=0.7)
    # 正常显示的关键点样式
    normal_landmark_spec = mp_drawing.DrawingSpec(thickness=5, circle_radius=5)
    # 隐藏关键点的样式:圆点半径设为0,不渲染
    hidden_landmark_spec = mp_drawing.DrawingSpec(circle_radius=0)
    # 生成21个关键点对应的样式列表,索引对应关键点ID
    landmark_spec_list = [
        hidden_landmark_spec if idx in HIDE_LANDMARK_IDS else normal_landmark_spec
        for idx in range(21)
    ]
    hand_connection_drawing_spec = mp_drawing.DrawingSpec(thickness=10, circle_radius=10)

    while cap.isOpened():
        ret, image = cap.read()
        if not ret:
            break
        # 修复原代码重复翻转问题
        image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
        image.flags.writeable = False
        results_hand = hands.process(image)
        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
        if results_hand.multi_hand_landmarks:
            for hand_landmarks in results_hand.multi_hand_landmarks:
                mp_drawing.draw_landmarks(
                    image=image,
                    landmark_list=hand_landmarks,
                    connections=handConnection,
                    landmark_drawing_spec=landmark_spec_list,
                    connection_drawing_spec=hand_connection_drawing_spec)

        keypress = cv2.waitKey(1)
        if keypress == ord('c'):
            break
        cv2.imshow("Img", image)

    hands.close()
    cap.release()
    cv2.destroyAllWindows()

main()

如果后续需要隐藏其他关键点,直接把对应ID加入HIDE_LANDMARK_IDS集合即可,不需要修改其他逻辑。

内容的提问来源于stack exchange,提问作者Binuka Kamesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:24:20