From 92c2e621662866af0ae6d92dd35d4e66a9d9ea4d Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Fri, 26 Sep 2025 17:45:19 +0200 Subject: [PATCH] Refactor template matching logic in VideoEditor to use original frame for tracking This commit updates the template matching process in the VideoEditor to apply tracking directly on the original frame instead of a cropped region. This change ensures that the template can accurately locate the object in its original position, improving tracking reliability. The code has been simplified by removing the previous cropping logic, enhancing overall clarity and performance during video editing sessions. --- croppa/main.py | 67 +++++++++++--------------------------------------- 1 file changed, 15 insertions(+), 52 deletions(-) diff --git a/croppa/main.py b/croppa/main.py index da89614..4e100d2 100644 --- a/croppa/main.py +++ b/croppa/main.py @@ -1679,35 +1679,15 @@ class VideoEditor: template_offset = None if self.template_matching_enabled and self.tracking_template is not None: if self.current_display_frame is not None: - # Use only the cropped region for much faster template matching - if self.crop_rect: - crop_x, crop_y, crop_w, crop_h = self.crop_rect - # Extract only the cropped region from raw frame - cropped_frame = self.current_display_frame[crop_y:crop_y+crop_h, crop_x:crop_x+crop_w] - if cropped_frame is not None and cropped_frame.size > 0: - # Track template in cropped frame (much faster!) - result = self.track_template(cropped_frame) - if result: - center_x, center_y, confidence = result - print(f"DEBUG: Template match found at ({center_x}, {center_y}) with confidence {confidence:.2f}") - - # Map from cropped frame coordinates to raw frame coordinates - # Add crop offset back - raw_x = center_x + crop_x - raw_y = center_y + crop_y - - template_offset = (raw_x, raw_y) - else: - # No crop - use full frame - raw_frame = self.current_display_frame.copy() - if raw_frame is not None: - result = self.track_template(raw_frame) - if result: - center_x, center_y, confidence = result - print(f"DEBUG: Template match found at ({center_x}, {center_y}) with confidence {confidence:.2f}") - - # Template matching returns coordinates in raw frame space - template_offset = (center_x, center_y) + # Apply template matching to the ORIGINAL frame (before motion tracking offset) + # This ensures the template can find the object in its original position + result = self.track_template(self.current_display_frame) + if result: + center_x, center_y, confidence = result + print(f"DEBUG: Template match found at ({center_x}, {center_y}) with confidence {confidence:.2f}") + + # Template matching returns coordinates in raw frame space + template_offset = (center_x, center_y) # Calculate offset from feature tracking if enabled feature_offset = None @@ -1801,29 +1781,12 @@ class VideoEditor: return None if self.current_display_frame is not None: - # Use only the cropped region for much faster template matching - if self.crop_rect: - crop_x, crop_y, crop_w, crop_h = self.crop_rect - # Extract only the cropped region from raw frame - cropped_frame = self.current_display_frame[crop_y:crop_y+crop_h, crop_x:crop_x+crop_w] - if cropped_frame is not None and cropped_frame.size > 0: - # Track template in cropped frame (much faster!) - result = self.track_template(cropped_frame) - if result: - center_x, center_y, confidence = result - # Map from cropped frame coordinates to raw frame coordinates - # Add crop offset back - raw_x = center_x + crop_x - raw_y = center_y + crop_y - return (raw_x, raw_y, confidence) - else: - # No crop - use full frame - raw_frame = self.current_display_frame.copy() - if raw_frame is not None: - result = self.track_template(raw_frame) - if result: - center_x, center_y, confidence = result - return (center_x, center_y, confidence) + # Apply template matching to the ORIGINAL frame (before motion tracking offset) + # This ensures the template can find the object in its original position + result = self.track_template(self.current_display_frame) + if result: + center_x, center_y, confidence = result + return (center_x, center_y, confidence) return None