属性错误:'NormalizedLandmark' 对象没有名为 'landmark' 的属性

后端开发 2026-07-09

我有一个 NormalizedLandmark 对象,没有属性 landmark,但无法解析。我正在尝试将其转换为元组、列表。

错误输出:

Exception has occurred: AttributeError  
'NormalizedLandmark' object has no attribute 'landmark'  
    `for  hand_point in hand_landmark.landmark:`  
AttributeError: 'NormalizedLandmark' object has no attribute 'landmark'

在分享之前,我已经在 错误区域 试过这段代码

if LastLandmarks:
    for hand_landmark in LastLandmarks:
        for hand_point in hand_landmark:
            print(f"POINT: {hand_point.x:.2f}  {hand_point.y:.2f}  {hand_point.z:.2f}")

代码

import numpy as np 
from time import time
import cv2 
import mediapipe as mp 
from mediapipe.tasks.python import vision
from mediapipe.tasks import python


LastLandmarks=None

BaseOptions=mp.tasks.BaseOptions
HandLandmarker= mp.tasks.vision.HandLandmarker
HandLandmarkerResult=mp.tasks.vision.HandLandmarkerResult
HandLandmarkerOptions=mp.tasks.vision.HandLandmarkerOptions
VisionRunningMode=mp.tasks.vision.RunningMode


def print_results(result:HandLandmarkerResult,image:mp.Image,timestamp_ms: int):
    global LastLandmarks
    if result and result.hand_landmarks:
        LastLandmarks=result.hand_landmarks[0]
        print("HAND_LANDMARK_LENGTH: ",len(LastLandmarks))


_options=HandLandmarkerOptions(
    base_options=BaseOptions(model_asset_path="./hand_landmarker.task"),
    running_mode=VisionRunningMode.LIVE_STREAM,
    result_callback=print_results
)

cam=cv2.VideoCapture(0)

with HandLandmarker.create_from_options(_options) as landmarker:
    while cam.isOpened():
        isFrame,frame=cam.read()
        if not isFrame:break

        frame=cv2.flip(frame,1)
        rgb_frame=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
        h,w,_f=frame.shape

        mediapipe_image=mp.Image(mp.ImageFormat.SRGB,rgb_frame)
        timestamp_ms=int(time()*1000)
        landmarker.detect_async(mediapipe_image,timestamp_ms)
        if LastLandmarks:
#ERROR AREA
            for hand_landmark in LastLandmarks:
                for  hand_point in hand_landmark.landmark:
                    print(f"POINT: {hand_point.x:.2f}  {hand_point.y:.2f}  {hand_point.z:.2f}")
#ERROR AREA END
        cv2.putText(frame,"ESC to exit",(15,25),cv2.FONT_HERSHEY_PLAIN,0.9,(0,0,0),1)
        if cv2.waitKey(5)&0xFF==27:break
        cv2.imshow("HAND",frame)

解决方案

hand_landmarkNormalizedLandmark,并且它没有 landmark,因为它是一个带有 x,y,z 的单一 point,你必须直接使用它(不带内层 for 循环):

if LastLandmarks:
    for hand_landmark in LastLandmarks:
        print(f"POINT: {hand_landmark.x:.2f}  {hand_landmark.y:.2f}  {hand_landmark.z:.2f}")
        cv2.circle(frame, (int(hand_landmark.x * w), int(hand_landmark.y * h)), 2, (255, 0, 0), 2)

或者在 print_results() 中,你应该把完整的 result 赋给它

    LastLandmarks = result   # .hand_landmarks[0]

然后你就可以拥有嵌套的 for-循环(但需要 .hand_landmarks 代替 .landmarks

if LastLandmarks:
    for hand_landmarks in LastLandmarks.hand_landmarks:
        for hand_point in hand_landmarks:
            print(f"POINT: {hand_point.x:.2f}  {hand_point.y:.2f}  {hand_point.z:.2f}")
            cv2.circle(frame, (int(hand_point.x * w), int(hand_point.y * h)), 2, (255, 0, 0), 2)

文档 NormalizedLandmark


enter image description here


顺便说一句:

同样的函数,但使用mediapipe绘制点和连接:

# def print_results(result: HandLandmarkerResult, image: mp.Image, timestamp_ms: int):
# ...
#         last_landmarks = result.hand_landmarks[0]

# - added -
HandLandmarksConnections = mp.tasks.vision.HandLandmarksConnections
mp_drawing = mp.tasks.vision.drawing_utils
mp_drawing_styles = mp.tasks.vision.drawing_styles


   if last_landmarks:

        # --- cv2 ---
        # for hand_landmark in last_landmarks:
        #     print(f"POINT: {hand_landmark.x:.2f}  {hand_landmark.y:.2f}  {hand_landmark.z:.2f}")
        #     cv2.circle(frame, (int(hand_landmark.x * w), int(hand_landmark.y * h)), 2, (255, 0, 0), 2)

        # --- mp ---
        mp_drawing.draw_landmarks(
            frame,  # <-- numpy.array(), not mediapipe_image
            last_landmarks, # .hand_landmarks[0],
            HandLandmarksConnections.HAND_CONNECTIONS,
            mp_drawing_styles.get_default_hand_landmarks_style(),
            mp_drawing_styles.get_default_hand_connections_style(),
        )

enter image description here

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章