Per-platform colour-border sensitivity (Teams violet, Meet glow)
Cross-platform research (Grant) flagged that the colour-border cue differs by app; checking the real brand colours against the detector found a concrete bug: the global 0.5 saturation threshold MISSES Teams' violet ring (#6264A7 ≈ 0.41, light variants ~0.27) entirely and Meet's lighter blue glow (#8ab4f8 ≈ 0.44). Those adapters would have detected nothing. - FrameSampler.saturatedPoints: add a tunable threshold + optional hue-band gate (degrees) so a lowered threshold doesn't pick up warm video. - GridCallAnalyzer.Config: colorSaturation / colorMinBrightness / colorHueRange, plumbed to the colour-border path (defaults preserve prior behaviour). - MeetAdapter sat→0.35 (catch the glow); TeamsAdapter sat→0.22 + hue 215–275° (catch the faint violet, reject other colours); ZoomAdapter sat 0.45 + hue 40–150° (vivid green/yellow). Values are first-pass pending real-fixture calibration; the hue gate is the main calibration lever. Tests: Teams now detects the faint violet ring and rejects a green one; Meet/Zoom vivid cases still pass. 27/27 XCTest.
This commit is contained in:
@@ -27,6 +27,14 @@ struct GridCallAnalyzer {
|
||||
var nameAnchor: NameAnchor = .bottomCenter
|
||||
var detectColoredBorder = true
|
||||
var detectWhiteBorder = true
|
||||
// Coloured-border sensitivity. Default 0.5 suits vivid rings (Zoom green/
|
||||
// yellow); lower it for muted accent rings (Teams violet ≈ 0.41, Meet's
|
||||
// light-blue glow ≈ 0.44). `colorHueRange` (degrees) optionally pins the
|
||||
// ring's hue so a low threshold doesn't catch warm video — set per platform
|
||||
// once calibrated against real screenshots.
|
||||
var colorSaturation: Double = 0.5
|
||||
var colorMinBrightness: Double = 60
|
||||
var colorHueRange: ClosedRange<Double>? = nil
|
||||
var minTextConfidence: Float = 0.3
|
||||
var maxNameLength = 40
|
||||
var minHighlightPoints = 6
|
||||
@@ -58,7 +66,11 @@ struct GridCallAnalyzer {
|
||||
|
||||
// Highlight pixels: coloured (saturated) and/or white (thin near-white).
|
||||
var highlight: [CGPoint] = []
|
||||
if config.detectColoredBorder { highlight += sampler.saturatedPoints() }
|
||||
if config.detectColoredBorder {
|
||||
highlight += sampler.saturatedPoints(threshold: config.colorSaturation,
|
||||
minBrightness: config.colorMinBrightness,
|
||||
hueRange: config.colorHueRange)
|
||||
}
|
||||
if config.detectWhiteBorder { highlight += sampler.thinWhitePoints() }
|
||||
|
||||
// Drop points inside any name-text region so the white name itself doesn't count.
|
||||
|
||||
Reference in New Issue
Block a user