做隐私脱敏工具时,人脸动态跟踪的实现在多个环节容易出问题。我整理几条踩过的坑和对应的处理思路。
一、转场导致遮罩"活"在新画面上
采样帧在真实切点上的灰度直方图差异值实测约0.17(阈值通常设在0.4),HSV变化约0.3(阈值0.72),均低于硬切判据。丢检后追踪按MAX_MISSED=20步继续外推,12fps采样下会产生约1.3秒的误遮挡。
解法是在不改动原判据的前提下加一层软判据检测遮罩是否该延续,多路投票决定终止外推;或者用ffmpeg select=gt(scene,0.2)独立核实效。这两条判据职责分开:一个管追踪状态清空,一个管遮罩绘制。
二、人物刚入画时的隐私窗口期
淡入机制让首帧alpha只有1/3,加上fps抽样(25fps每80ms采一帧),人脸露出后有130-160ms的遮挡不足。淡入不能直接去掉------它是靠半透明压住误检帧闪烁的。
改成事后回填:检测次数大于等于6的轨迹才会回填,把开头半透明帧抬到满遮罩,段起点往前延一个采样步,同时加三重收口防止把淡出误补。
三、追踪器重启后ID撞号
硬切时追踪器track id从1重新编号,而轨迹过期只在活跃状态里删除、段数据保留。新tid=1的轨道覆盖掉老tid=1的数据时,一段长达4.6秒的脸最终输出为零帧。
解法是安置而非合并:被顶下来的旧轨换一个不会冲突的新key保留。下游用时间二分插值取位,要求每个key是单调的,把两条轨倒进同一列表会让遮挡在两人脸之间跳。
额外踩点:macOS上setCurrentItem会同时触发异步加载和同步等待回调,导致主线程死锁;用cv2做VideoCapture时默认后端是AVFoundation,会在主线程派发回调,所以后台读取要强制指定FFmpeg后端。