import cv2
from ultralytics import YOLO

# Load YOLO model
model = YOLO("yolov8m.pt")

# Initialize webcam with error handling
cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("Error: Cannot open webcam."); exit()
cap.set(3, 1280); cap.set(4, 720)

all_detected = set()
print("Starting live detection... Press 'q' to quit.")

while True:
    success, frame = cap.read()
    if not success: print("Frame grab failed."); break

    for r in model(frame, stream=True):
        for box in r.boxes:
            cls, conf = int(box.cls[0]), float(box.conf[0])
            x1,y1,x2,y2 = map(int, box.xyxy[0])
            name = model.names[cls]; all_detected.add(name)
            cv2.rectangle(frame, (x1,y1), (x2,y2), (0,255,0), 2)
            cv2.putText(frame, f"{name} {conf:.2f}", (x1,y1-5),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,0), 2)

    cv2.imshow("YOLOv8 Live", frame)
    if cv2.waitKey(1) & 0xFF == ord("q"): break

cap.release(); cv2.destroyAllWindows()
print("\nDetected objects:", ", ".join(sorted(all_detected)) or "None")