diff --git a/README.md b/README.md index 78b6570..2dc5f39 100644 --- a/README.md +++ b/README.md @@ -269,6 +269,10 @@ einzigen sichtbaren Insel, wird diese Insel direkt als primäres Suchziel verwendet. Dadurch scannt der Matcher denselben Bildinhalt nicht erst als vollen Beat und danach noch einmal als Segment; der Report behält trotzdem die korrekte Beat-Position und füllt echte Randlücken mit Schwarz. +Gecachte segmentierte Treffer werden ebenfalls gegen die automatisch sichtbare +Referenzdauer normalisiert, nicht gegen Schwarz-/Blendränder des gesamten Beats. +Ein korrekt gematchter kurzer Bildinhalt wird dadurch beim Report-Aufbau nicht +nachträglich als zu kurz verworfen. Zusätzlich werden sehr dunkle, kontrastarme oder noch nicht sauber auf-/abgeblendete Referenzframes aus Score, Inhalts-Reranking, Phasen-Alignment und Motion-Templates herausgenommen. Blenden sollen bestimmen, diff --git a/cli.py b/cli.py index b6691ff..3c299f5 100644 --- a/cli.py +++ b/cli.py @@ -218,7 +218,12 @@ def _normalize_cached_results(beats: list, results: list, cfg) -> list: if weighted_score < cfg.cv.deep_scan.provisional_match_threshold: continue if beat is not None and beat.duration_s > 0: - coverage = segment_duration / beat.duration_s + visible_duration = sum( + max(0.0, end_s - start_s) + for start_s, end_s in _reference_scoreable_segments(beat, cfg) + ) + coverage_target = visible_duration if visible_duration > 0 else beat.duration_s + coverage = segment_duration / coverage_target if coverage < cfg.cv.deep_scan.min_duration_coverage: continue normalized.append(replace(result, match_score=weighted_score))