绘制关键点时出错: ‘NormalizedLandmark’ object has no attribute 'HasField’import cv2
import mediapipe as mp
from datetime import datetime
def add_overlay(frame, text, position, color=(0, 255, 0)):
"""添加文本叠加层"""
cv2.putText(frame, text, position,
cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2)
def show_frame(frame, window_name='Pose Detection'):
if frame is None or frame.size == 0:
print("警告:收到空帧,跳过显示")
return False
"""显示帧并处理键盘事件"""
cv2.imshow(window_name, frame)
key = cv2.waitKey(1)
if key == ord('q') or key == 27:
print("检测到退出指令")
return True
elif cv2.getWindowProperty(window_name, cv2.WND_PROP_VISIBLE) < 1:
print("窗口被手动关闭")
return True
return False
class ResultVisualizer:
def __init__(self):
self._pose_landmark_drawing_spec = mp.solutions.drawing_utils.DrawingSpec(
color=(0, 255, 0), thickness=2, circle_radius=2)
self._pose_connection_drawing_spec = mp.solutions.drawing_utils.DrawingSpec(
color=(0, 0, 255), thickness=2)
self._last_time = cv2.getTickCount()
self._frame_count = 0
def draw_landmarks(self, frame, landmarks):
try:
# 检查 landmarks 是否有 landmark 属性
if hasattr(landmarks, 'landmark'):
mp.solutions.drawing_utils.draw_landmarks(
frame,
landmarks,
mp.solutions.pose.POSE_CONNECTIONS,
self._pose_landmark_drawing_spec,
self._pose_connection_drawing_spec)
return frame
except Exception as e:
print(f"绘制关键点时出错: {str(e)}")
return frame
def calculate_fps(self):
current_time = cv2.getTickCount()
elapsed_time = (current_time - self._last_time) / cv2.getTickFrequency()
self._frame_count += 1
if elapsed_time > 1:
fps = self._frame_count / elapsed_time
self._last_time = current_time
self._frame_count = 0
return fps
return 0