You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
A burned-in overlay is segmented as foreground, and no setting can exclude it #80
A burned-in overlay is read as foreground and survives into the cutout. On a
Twitch clip with a chat box composited into the bottom-left of the frame, the
segmenter keeps the chat as a hard-edged rectangular block in every frame, so
the exported loop carries a slab of chat text next to the subject. Burned-in
logos, alert boxes and webcam frames have the same shape of problem.
The user has no setting that addresses it. Crop cuts from the frame edges, and
the overlay sits in front of the subject's chest for part of the clip, so
cropping it away takes the subject with it.
What does not work
Keeping only the largest connected alpha component was measured on the clip
above at four timestamps and is not the answer:
The chat block touches the subject's shoulder, so at one sample it is 100 % of
the same component and stays exactly where it was.
At two other samples the filter instead deletes the subject's own raised hand,
which is genuinely detached from the body in the mask.
A share threshold does not rescue it, because the failure is that the wanted and
unwanted regions are one component.
Proposal
An exclusion region: one rectangle the user drags over the overlay, forced to
alpha 0 after segmentation. A burned-in overlay stays in the same place for the
whole clip, so a single rectangle covers the entire video, and the result is
predictable rather than model-dependent.
Lives with the other cleanup controls, next to the alpha threshold and
padding, and is off until a rectangle exists.
The rubber-band interaction is already implemented for crop in src/matteloop/ui/crop_canvas.py; this should reuse it rather than grow a
second selection widget.
The rectangle belongs in FramingSpec alongside the existing framing values,
so it takes part in the fingerprint and a change invalidates the cut the same
way a crop change does.
Automatic detection was considered and rejected for now: an overlay is not
reliably static (chat text scrolls) and a genuinely motionless subject would be
eaten by a variance test.
Parked, not abandoned — labelled deferred and unassigned so nobody assumes it is being worked on.
The work exists on feat/issue-80-exclusion-regions (PR #166, now a draft) and is green, but does not behave correctly in real use: the cutout does not match what the region appears to select. The mapping itself is measured correct and auto-trim was off, so the two obvious explanations are ruled out; the defect was not found before the pause.
PR #166 carries the full state, what was measured, and what to do first when resuming.
Activity
🐛 fix(exclusions): answer the third review
✨ feat(ui): add source context menu
smb commentedon Sep 12, 2026
Parked, not abandoned — labelled
deferredand unassigned so nobody assumes it is being worked on.The work exists on
feat/issue-80-exclusion-regions(PR #166, now a draft) and is green, but does not behave correctly in real use: the cutout does not match what the region appears to select. The mapping itself is measured correct and auto-trim was off, so the two obvious explanations are ruled out; the defect was not found before the pause.PR #166 carries the full state, what was measured, and what to do first when resuming.
🐛 fix(exclusions): sync region gestures
🐛 fix(context-menu): validate live actions
📝 docs(exclusions): clarify menu emissions
🐛 fix(context-menu): retain region identity
🐛 fix(exclusions): show effective areas
🐛 fix(inspector): show region bounds
🐛 fix(i18n): translate the readout as sentences
📝 docs(design): plan pre-model exclusion regions
✨ feat(cuts): key pre-model regions
✨ feat(inspector): show pre-model mode
⚙️ config(guardrails): allow the pre-model call site