fix: interpolated frames reuse previous composited frame, no redundant copy

The encoding loop was doing frame_lookup + copy + mask write for every
frame including interpolated gap-filler frames. Now only real
detections trigger a full composite; interpolated frames reuse the
previous frame's result (cv2.VideoWriter copies internally on write).
This commit is contained in:
Cherokee
2026-04-30 17:12:31 +08:00
parent 1ca35003ca
commit 42ba415e2c
+24 -5
View File
@@ -784,16 +784,35 @@ class VideoActorExtractor:
if not segments_data:
continue
# Collect detected frame indices for this actor (to distinguish
# real detections from interpolated gap-filler frames)
detected_indices: set = set()
for aid in identity_to_actors[actor_id]:
detected_indices.update(long_actors[aid].frame_indices)
# Convert bool-mask segments to BGR frames for encoding
# Interpolated frames reuse the previous composited frame (no copy)
segments_bgr: List[List[np.ndarray]] = []
for seg in segments_data:
bgr_frames = []
prev_composited = None
for fi, bool_mask, _ in seg:
frame_bgr = frame_lookup.get(fi)
if frame_bgr is None:
frame_bgr = np.full((img_h, img_w, 3), bg_bgr, dtype=np.uint8)
composited = frame_bgr.copy()
composited[~bool_mask] = bg_bgr
if fi in detected_indices:
frame_bgr = frame_lookup.get(fi)
if frame_bgr is None:
frame_bgr = np.full(
(img_h, img_w, 3), bg_bgr, dtype=np.uint8
)
composited = frame_bgr.copy()
composited[~bool_mask] = bg_bgr
prev_composited = composited
elif prev_composited is not None:
# Interpolated frame — reuse previous (cv2.VideoWriter
# copies internally on write)
composited = prev_composited
else:
composited = np.full((img_h, img_w, 3), bg_bgr, dtype=np.uint8)
prev_composited = composited
bgr_frames.append(composited)
segments_bgr.append(bgr_frames)