From 151744d144d76b51da6ab2b696b325f307dc7cef Mon Sep 17 00:00:00 2001 From: PhatPhuckDave Date: Fri, 26 Sep 2025 17:56:28 +0200 Subject: [PATCH] Update --- croppa/main.py | 72 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/croppa/main.py b/croppa/main.py index cc3ec1c..3497523 100644 --- a/croppa/main.py +++ b/croppa/main.py @@ -1683,17 +1683,34 @@ 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: - # Apply motion tracking offset to the frame before template matching - # This ensures template matching works on the offset frame - offset_frame = self._apply_motion_tracking_offset(self.current_display_frame, base_pos) - if offset_frame is not None: - result = self.track_template(offset_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 offset frame space - template_offset = (center_x, center_y) + # 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: + # Apply motion tracking offset to the cropped frame + offset_frame = self._apply_motion_tracking_offset(cropped_frame, base_pos) + if offset_frame is not None: + # Track template in cropped and offset frame (much faster!) + result = self.track_template(offset_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 with offset + offset_frame = self._apply_motion_tracking_offset(self.current_display_frame, base_pos) + if offset_frame is not None: + result = self.track_template(offset_frame) + if result: + center_x, center_y, confidence = result + template_offset = (center_x, center_y) # Calculate offset from feature tracking if enabled feature_offset = None @@ -1833,13 +1850,32 @@ class VideoEditor: # Get base position for motion tracking offset base_pos = self._get_manual_tracking_position(frame_number) - # Apply motion tracking offset to the frame before template matching - offset_frame = self._apply_motion_tracking_offset(self.current_display_frame, base_pos) - if offset_frame is not None: - result = self.track_template(offset_frame) - if result: - center_x, center_y, confidence = result - return (center_x, center_y, confidence) + # 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: + # Apply motion tracking offset to the cropped frame + offset_frame = self._apply_motion_tracking_offset(cropped_frame, base_pos) + if offset_frame is not None: + # Track template in cropped and offset frame (much faster!) + result = self.track_template(offset_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 with offset + offset_frame = self._apply_motion_tracking_offset(self.current_display_frame, base_pos) + if offset_frame is not None: + result = self.track_template(offset_frame) + if result: + center_x, center_y, confidence = result + return (center_x, center_y, confidence) return None