import cv2 import time from PIL import Image from inference import predict CONF_THRESHOLD = 0.6 DECAY_SECONDS = 2.0 current_emotion = None last_confident_ts = None cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) cv2.namedWindow("Emotion Debug View", cv2.WINDOW_NORMAL) print("Press 'q' to quit") while True: ret, frame = cap.read() if not ret: print("Failed to grab frame") break rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) pil_img = Image.fromarray(rgb) result = predict(pil_img) now = time.time() if result["confidence"] >= CONF_THRESHOLD: current_emotion = result["emotion"] last_confident_ts = now else: if last_confident_ts and (now - last_confident_ts > DECAY_SECONDS): current_emotion = None conf = round(result["confidence"], 2) label = f"{current_emotion if current_emotion else 'UNKNOWN'} | conf={conf}" state = "STABLE" if current_emotion else "DECAYED" cv2.putText( frame, f"State: {state} | {label}", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0) if current_emotion else (0, 0, 255), 2 ) cv2.imshow("Emotion Debug View", frame) if cv2.waitKey(1) & 0xFF == ord("q"): break cap.release() cv2.destroyAllWindows()