import torch
from torch.serialization import add_safe_globals
from models.yolo import Model  # 這行要在 yolov5 專案目錄中執行
import cv2

add_safe_globals([Model])  # 允許 PyTorch 安全地載入 YOLOv5 模型類別

# 從 PyTorch Hub 加載 YOLOv5 模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')

# 初始化攝影機
cap = cv2.VideoCapture(0)

if not cap.isOpened():
    print('請檢查攝影機，無法開啟')
    exit()

# 設定影像解析度
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

while True:
    # 從攝影機讀取影像
    ret, frame = cap.read()
    if not ret:
        print('無法取得影像')
        break

    # OpenCV 的影像格式為 BGR，需要轉換為 RGB
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # 使用 YOLOv5 模型進行偵測
    results = model(rgb_frame)

    # 獲取辨識後的影像與標註資訊
    output_frame = results.render()[0]  # 在影像上繪製標註

    # 顯示影像
    bgr_frame = cv2.cvtColor(output_frame, cv2.COLOR_RGB2BGR)
    cv2.imshow('YOLOv5 Detection', bgr_frame)

    # 按下 'q' 鍵退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放攝影機並關閉視窗
cap.release()
cv2.destroyAllWindows()