首次使用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
相关产品推荐
相关产品推荐

