Refactor template management in VideoEditor to improve tracking functionality

This commit removes the direct storage of the tracking template and introduces a method to recreate the template from the specified region when needed. It enhances the template tracking logic by ensuring that the template is dynamically generated based on the current frame and region, improving accuracy and usability. Debug messages have been added to assist in tracking the template recreation process.
This commit is contained in:
2025-09-26 14:31:35 +02:00
parent c08d5c5999
commit 048e8ef033

View File

@@ -931,7 +931,6 @@ class VideoEditor:
'tracking_points': {str(k): v for k, v in self.tracking_points.items()}, 'tracking_points': {str(k): v for k, v in self.tracking_points.items()},
'feature_tracker': self.feature_tracker.get_state_dict(), 'feature_tracker': self.feature_tracker.get_state_dict(),
'template_matching_enabled': self.template_matching_enabled, 'template_matching_enabled': self.template_matching_enabled,
'tracking_template': self.tracking_template,
'template_region': self.template_region 'template_region': self.template_region
} }
@@ -1023,10 +1022,10 @@ class VideoEditor:
# Load template matching state # Load template matching state
if 'template_matching_enabled' in state: if 'template_matching_enabled' in state:
self.template_matching_enabled = state['template_matching_enabled'] self.template_matching_enabled = state['template_matching_enabled']
if 'tracking_template' in state and state['tracking_template'] is not None: if 'template_region' in state and state['template_region'] is not None:
self.tracking_template = state['tracking_template']
if 'template_region' in state:
self.template_region = state['template_region'] self.template_region = state['template_region']
# Recreate template from region when needed
self.tracking_template = None # Will be recreated on first use
# Validate cut markers against current video length # Validate cut markers against current video length
if self.cut_start_frame is not None and self.cut_start_frame >= self.total_frames: if self.cut_start_frame is not None and self.cut_start_frame >= self.total_frames:
@@ -2146,7 +2145,11 @@ class VideoEditor:
def track_template(self, frame): def track_template(self, frame):
"""Track the template in the current frame""" """Track the template in the current frame"""
if self.tracking_template is None: if self.tracking_template is None:
return None # Try to recreate template from saved region
if self.template_region is not None:
self._recreate_template_from_region(frame)
if self.tracking_template is None:
return None
try: try:
# Convert to grayscale # Convert to grayscale
@@ -2178,6 +2181,37 @@ class VideoEditor:
print(f"Error in template tracking: {e}") print(f"Error in template tracking: {e}")
return None return None
def _recreate_template_from_region(self, frame):
"""Recreate template from saved region coordinates"""
try:
if self.template_region is None:
return False
x, y, w, h = self.template_region
print(f"DEBUG: Recreating template from region ({x}, {y}, {w}, {h})")
# Ensure region is within frame bounds
if (x >= 0 and y >= 0 and
x + w <= frame.shape[1] and
y + h <= frame.shape[0]):
# Extract template from frame
template = frame[y:y+h, x:x+w]
if template.size > 0:
self.tracking_template = template.copy()
print(f"DEBUG: Template recreated with size {template.shape}")
return True
else:
print("DEBUG: Template region too small")
return False
else:
print("DEBUG: Template region outside frame bounds")
return False
except Exception as e:
print(f"Error recreating template: {e}")
return False
def _set_template_from_region(self, screen_rect): def _set_template_from_region(self, screen_rect):
"""Set template from selected region""" """Set template from selected region"""
x, y, w, h = screen_rect x, y, w, h = screen_rect