
路人头部椭圆虚化观测、排主角、椭圆 mask 与一次 FFmpeg 合成本文讲清非主角脸如何变成有限条 椭圆虚化轨迹再经crop → boxblur → geq(alpha) → overlay叠回成片且与 Lens/Crop 合并进同一滤镜图与跟拍同一遍转码完成避免二次解码。图轴对齐椭圆半轴由脸框与 pad 决定外为清晰内为模糊。1. 观测从哪来other_face_obs扫描阶段在人体检测与 ByteTrack 之外收集 非主角脸观测写入路径包括检测帧上对非主角人体 ROI 跑 SCRFDfor_stranger_blurtrueROI 阈值放宽离线从 ByteTrack 历史回填再剥一次主角丢掉闪现。最小脸尺寸与占比短边至少约 16 px且不超过画幅短边约 26%。连续帧间隙容忍与检测步长挂钩stride3 时隔帧观测仍可串成一条路人轨。2. 排除主角三道闸图任一闸命中则该观测不得进入虚化轨迹。2.1 track_id若byte_track_id hero_byte_track_id直接排除。这是最干净的信号。2.2 thumb 相似度锁定阈值常见为 0.32。轨迹级若多点 拇指图相似度 达到「像主角」比例整轨丢弃。2.3 几何 IoU / 重叠输出空间椭圆与主角保护区 IoU 过高 → 丢弃该关键点。源空间也有类似保护。策略宁可漏糊路人不可误伤主角。3. 椭圆参数半轴与 pad≈1.08脸框(x,y,w,h)→ 输出椭圆默认face_pad ≈ 1.08椭圆半轴a ≈ 脸宽/2×1.08b ≈ 脸高/2×1.08。相对轴对齐脸框面积放大 1.08²≈1.17约 17%盖住发际与下巴外缘。椭圆方程patch 局部坐标圆心在(a,b)v ((X-a)/a)² ((Y-b)/b)²v ≤ 1完全在椭圆内1 v ≤ 1f羽化带其它透明。数值例子脸 80×100pad1.08外接矩形约 86×108。高分检测det_score ≥ 0.50还会再外扩cover expand再乘 margin1.05确保糊区盖住源脸。由人体估头时宽向也用 1.08与虚化 pad 同数量级语义一致「头比脸略宽」。4. 聚类、排序与「约 4 条」按时空邻近串轨再排序取显著轨。硬上限 32。成片滤镜每个椭圆要split crop boxblur geq overlay节点线性膨胀。实务经验与科普约定同时服务约 4 条显著路人轨 已够店内/合影场景更短的路过会被排序挤掉。最短连续min_consec2避免单帧闪糊。尾部 hold离开后继续糊约tail_hold6源帧≈0.24 s 25防止人刚出框椭圆瞬间消失。5. 中心平滑与半轴稳定路人轨迹高斯 σCrop 约 0.18 sLens 约 0.12 s稠密观测更短。半轴若帧间跳变超过半轴跳变切断比例稀疏 0.15 / 稠密 0.28切断为新 segment避免一个巨大椭圆跨剧变。实务技巧segment 内对 semi 取较大稳定值中心仍跟随——消除「呼吸感」。6. Alpha 合成公式图椭圆内用模糊图外保留清晰图边缘羽化过渡。逐像素 alpha∈[0,1] 由椭圆geq给出存成 0255 再归一化。羽化宽度feather_px默认常为 1。本项目实现std::stringellipse_alpha_geq_expr(intsemi_a,intsemi_b,intfeather_px){conststd::string v((X-a)*(X-a)/a2(Y-b)*(Y-b)/b2);// conceptualif(feather_px0)returnif(lte(v,1),255,0);returnif(lte(v,1),255, if(lte(v,1f), floor(255*(1f-v)/f), 0));}7. FFmpeg 滤镜串boxblur geq overlay追加路人虚化滤镜与滤镜构建同构逐步split一路做补丁一路保持清晰底crop按椭圆外接矩形从当前位置裁出boxblur用 boxblur 滤镜表达式半径受限时链式多次近似更强糊geq写椭圆 alphaoverlay贴回enable限制活跃帧区间。中心用分段线性任意输出帧的中心由关键点序列做分段线性插值得到。点列常关键点抽稀到约 24 点。数值例子算力粗估1080p254 条椭圆各平均半轴 50→补丁约 100×100每帧 4 次小图 boxblur overlay远小于全图糊滤镜图节点约 4×(splitcropblurgeqoverlay)≈20 个标签。若强行上 20 条长轨字符串与图编译时间会明显变差——这是「约 4 条」的工程动机。8. 与 Lens/Crop 合并为一遍在 lens/crop 滤镜末尾若有路人轨则先formatyuv420p[vfocus]再串 stranger blur最终[vout]。即跟拍几何与路人虚化同一滤镜图、一次解码一次编码。合并出片若分步也可能先 focus 再 blur 独立转码优先路径是 merged one-pass。映射注意路人椭圆必须变到 输出坐标系。Lens 下要乘 zoom 并减 overlay 偏移Crop 下要减窗原点再乘缩放。专门做这件事——在源坐标糊一发再拉伸椭圆会错位。9. 覆盖率与丢弃椭圆落到输出后与有效画布或 crop 内框交集比例过低则丢点避免糊在黑边/画外。高分检测强制扩椭圆det_score 0.50时 cover expandmargin 1.05。10. GPU 路径对照用同一套按帧取椭圆轨迹取圆心半轴在 CUDA 上做 ROI blur feather mask。参数语义与 FFmpeg 一致radius / power / feather。调试可用叠加视频画椭圆轨迹验证。11. 参数表参数典型值过强过弱face_pad1.08肩颈被糊发际清晰一圈blur radius518受 boxblur 上限链式光晕脏仍可辨认feather13 px边缘发雾剪纸硬边max tracks实务 ~4 / 硬顶 32滤镜爆炸漏糊min consec2—闪一下糊一下thumb 排除≥0.32 像主角路人漏糊误伤主角12. 端到端心算例场景1280×72025crop 跟拍路人脸源框 60×70窗缩放后输出脸约 72×84pad1.08例如脸宽 72、脸高 84半轴 a≈39、b≈45。椭圆内像素约 πab≈5510。boxblur luma_radius5、power1局部足够毁容级模糊主角若 IoU 重叠被 guard 掉则该关键点不入轨。时间观测在 frame 100、103、106stride3max_gap 与 stride 挂钩可聚成一条平滑 σ0.18 s 后写入圆心点列成片 n 从对应 25fps 索引启用到尾 hold。13. 公式卡椭圆((X−cx)/a)² ((Y−cy)/b)² ≤ 1pad半轴公式a脸宽/2×padb脸高/2×padpad≈1.08。合成椭圆内取 blur外取 sharp羽化带线性过渡。排除主角逻辑或排除主角跟踪号相同或相似度够高或与主角框重叠过大——任一成立就不虚化。合并把观测清洗、椭圆几何、滤镜串三件事分开调试路人虚化问题通常一次就能定位到层。14. 输出坐标映射为何不能在源图糊完再拉伸Lens 下源脸 (f_x,f_y,f_w,f_h) 到输出椭圆核心步骤计算当前帧英雄圆心(hero_cx, hero_cy)与 zoom用与成片相同的圆镜叠加原点计算得到放大图层偏移把脸中心变到放大图层坐标再变到圆镜 canvas最后到输出 overlay 位置半轴乘zoom * pad。Crop 下若同时做了裁切/缩放椭圆中心与半轴都要变换到最终输出坐标系。若错误地「源图椭圆 → 整帧 scale」窗在移动时路人会相对主角滑动出现「糊斑追错人」。因此构建时就按输出 n 采样映射写入的圆心点列已是输出像素。