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:
@@ -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:
|
||||||
@@ -2145,6 +2144,10 @@ 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:
|
||||||
|
# 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:
|
if self.tracking_template is None:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@@ -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
|
||||||
|
Reference in New Issue
Block a user