diff --git a/frigate/data_processing/real_time/custom_classification.py b/frigate/data_processing/real_time/custom_classification.py index f05ba8105..2dae9f0b7 100644 --- a/frigate/data_processing/real_time/custom_classification.py +++ b/frigate/data_processing/real_time/custom_classification.py @@ -229,30 +229,34 @@ class CustomStateClassificationProcessor(RealTimeProcessorApi): if not should_run: return - x, y, x2, y2 = calculate_region( - frame.shape, - crop[0], - crop[1], - crop[2], - crop[3], - 224, - 1.0, - ) - rgb = cv2.cvtColor(frame, cv2.COLOR_YUV2RGB_I420) - frame = rgb[ - y:y2, - x:x2, - ] + height, width = rgb.shape[:2] - if frame.shape != (224, 224): - try: - resized_frame = cv2.resize(frame, (224, 224)) - except Exception: - logger.warning("Failed to resize image for state classification") - return - else: - resized_frame = frame + # Convert normalized crop coordinates to pixel values + x1 = int(camera_config.crop[0] * width) + y1 = int(camera_config.crop[1] * height) + x2 = int(camera_config.crop[2] * width) + y2 = int(camera_config.crop[3] * height) + + # Clip coordinates to frame boundaries + x1 = max(0, min(x1, width)) + y1 = max(0, min(y1, height)) + x2 = max(0, min(x2, width)) + y2 = max(0, min(y2, height)) + + if x2 <= x1 or y2 <= y1: + logger.warning( + f"Invalid crop coordinates for {camera}: [{x1}, {y1}, {x2}, {y2}]" + ) + return + + frame = rgb[y1:y2, x1:x2] + + try: + resized_frame = cv2.resize(frame, (224, 224)) + except Exception: + logger.warning("Failed to resize image for state classification") + return if self.interpreter is None: # When interpreter is None, always save (score is 0.0, which is < 1.0)