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

手部检测绘制脚本报错:'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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:45:06