属性错误:'NormalizedLandmark' 对象没有名为 'landmark' 的属性
我有一个 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_landmark 是 NormalizedLandmark,并且它没有 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)
顺便说一句:
同样的函数,但使用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(),
)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

