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

首次使用MediaPipe遇KeyError:(3,4),手部地标绘制失败求助

MediaPipe手部地标绘制KeyError问题解决

问题情况

首次使用MediaPipe实现手部地标显示功能,抬手时程序直接崩溃,报错KeyError: (3, 4)。

错误信息

Traceback (most recent call last):
  File "/Users/anirudhakumar/PycharmProjects/SignLanguageDetector /test_classifier.py", line 22, in <module>
    mp_drawing.draw_landmarks(frame,
  File "/Users/anirudhakumar/PycharmProjects/SignLanguageDetector /venv/lib/python3.11/site-packages/mediapipe/python/solutions/drawing_utils.py", line 177, in draw_landmarks
    drawing_spec = connection_drawing_spec[connection] if isinstance(
                   ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
KeyError: (3, 4)

出错代码

while True:
    ret, frame = capture.read()

    frame_RGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # MediaPipe需要RGB格式图像

    results = hands.process(frame_RGB)  # 检测手部地标

    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            mp_drawing.draw_landmarks(frame,
                                      hand_landmarks,
                                      mp_hands.HAND_CONNECTIONS,
                                      mp_drawing_styles.get_default_hand_landmarks_style(),
                                      mp_drawing_styles.get_default_hand_landmarks_style())

    cv2.imshow('frame', frame)
    cv2.waitKey(25)

capture.release()
cv2.destroyAllWindows()

问题原因及修正

错误根源是调用mp_drawing.draw_landmarks()时参数用错了:

  • 第四个参数是手部地标点的样式,用get_default_hand_landmarks_style()没问题
  • 第五个参数是手部地标连接线条的样式,你错误地传入了地标点样式,导致程序找不到对应连接(3,4)的样式配置,抛出KeyError。

修正后的代码:

while True:
    ret, frame = capture.read()

    frame_RGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # MediaPipe需要RGB格式图像

    results = hands.process(frame_RGB)  # 检测手部地标

    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            mp_drawing.draw_landmarks(frame,
                                      hand_landmarks,
                                      mp_hands.HAND_CONNECTIONS,
                                      mp_drawing_styles.get_default_hand_landmarks_style(),
                                      # 替换为连接线条的默认样式
                                      mp_drawing_styles.get_default_hand_connections_style())

    cv2.imshow('frame', frame)
    cv2.waitKey(25)

capture.release()
cv2.destroyAllWindows()

内容的提问来源于stack exchange,提问作者Anirudha Kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:02