手部检测绘制脚本报错:'numpy.ndarray' object has no attribute 'multi_hand_landmarks'
问题解决:AttributeError: 'numpy.ndarray' object has no attribute 'multi_hand_landmarks'
错误核心原因是你直接将OpenCV读取的图像(numpy数组)赋值给了results,但numpy数组并不具备MediaPipe手部检测模型的multi_hand_landmarks属性——你漏掉了用MediaPipe的手部模型处理图像的关键步骤。
以下是修正后的完整代码,关键修改点已标注:
import cv2 import mediapipe as mp cap = cv2.VideoCapture(2) hands = mp.solutions.hands draw = mp.solutions.drawing_utils # 初始化MediaPipe手部检测模型实例 mp_hands = hands.Hands( static_image_mode=False, # 视频流动态跟踪模式 max_num_hands=2, # 最多检测2只手 min_detection_confidence=0.5 # 检测置信度阈值 ) while True: if cv2.waitKey(1) & 0xFF == 27: break success, image = cap.read() if not success: # 增加读取成功判断,避免摄像头故障报错 continue image = cv2.flip(image, 1) # 关键修改:用MediaPipe模型处理图像 # OpenCV读入的是BGR格式,MediaPipe要求输入RGB格式,需转换 image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 处理图像得到手部检测结果 results = mp_hands.process(image_rgb) # 先判断是否检测到手,避免None类型报错 if results.multi_hand_landmarks: for handLms in results.multi_hand_landmarks: for id, lm in enumerate(handLms.landmarks): h, w, c = image.shape cx, cy = int(lm.x * w), int(lm.y * h) # 绘制手部关键点(可根据需求调整样式) cv2.circle(image, (cx, cy), 5, (255,0,0), cv2.FILLED) # 绘制手部骨架连线 draw.draw_landmarks(image, handLms, hands.HAND_CONNECTIONS) cv2.imshow("Hand", image) # 退出时释放资源 cap.release() cv2.destroyAllWindows()
关键修改说明:
- 初始化
mp_hands实例:这是MediaPipe手部检测的核心处理对象,负责分析图像并返回检测结果。 - 图像格式转换:MediaPipe仅支持RGB格式输入,需将OpenCV默认的BGR格式转换为RGB。
- 增加非空判断:当未检测到手时,
results.multi_hand_landmarks为None,直接循环会触发报错,需先判断。 - 补充关键点绘制:原代码仅计算了关键点坐标,未实际绘制,这里添加了圆形关键点绘制逻辑。
内容的提问来源于stack exchange,提问作者wiliam bruno
相关产品推荐
相关产品推荐

