YOLOv8GarbageClassification / realtime_detect.py
kendrickfff's picture
Update realtime_detect.py
1ff6035 verified
Raw
History Blame Contribute Delete
2.26 kB
import tkinter as tk
from tkinter import Label, Button
import cv2
from PIL import Image, ImageTk
import threading
from ultralytics import YOLO
class WasteDetectorApp:
def __init__(self, window):
self.window = window
self.window.title("Waste Detection Camera App")
self.model = YOLO("best.pt")
self.cap = None
self.running = False
self.writer = None
self.label = Label(window)
self.label.pack()
self.start_button = Button(window, text="Start Detection & Save", command=self.start_detection)
self.start_button.pack(pady=5)
self.stop_button = Button(window, text="Stop", command=self.stop_detection)
self.stop_button.pack(pady=5)
def start_detection(self):
if not self.running:
self.cap = cv2.VideoCapture(0)
self.running = True
# Set up video writer
fourcc = cv2.VideoWriter_fourcc(*'XVID')
fps = 20.0
width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
self.writer = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))
threading.Thread(target=self.detect_loop, daemon=True).start()
def stop_detection(self):
self.running = False
if self.cap:
self.cap.release()
if self.writer:
self.writer.release()
self.label.config(image='')
def detect_loop(self):
while self.running:
ret, frame = self.cap.read()
if not ret:
break
results = self.model.predict(frame, verbose=False)
annotated_frame = results[0].plot()
# Write to video file
self.writer.write(annotated_frame)
# Display to GUI
img_rgb = cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)
img_pil = Image.fromarray(img_rgb)
imgtk = ImageTk.PhotoImage(image=img_pil)
self.label.imgtk = imgtk
self.label.configure(image=imgtk)
self.cap.release()
self.writer.release()
if __name__ == "__main__":
root = tk.Tk()
app = WasteDetectorApp(root)
root.mainloop()