[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"solution-scenes-menu":3,"tech-detail-2591":4},true,{"id":5,"title":6,"content":7,"picUrl":8,"tagIds":9,"keyWords":10,"htmlDescribe":11,"htmlUrl":12,"gmtCreate":13,"gmtModified":13,"articleInfoId":14},"2591","畅联云平台丨08-路人头部椭圆虚化","\u003Ch1 style=\"line-height:2\">路人头部椭圆虚化：观测、排主角、椭圆 mask 与一次 FFmpeg 合成\u003C\u002Fh1>\u003Cp style=\"line-height:2\">本文讲清：非主角脸如何变成有限条 椭圆虚化轨迹，再经 crop → boxblur → geq(alpha) → overlay 叠回成片，且与 Lens\u002FCrop 合并进同一滤镜图，与跟拍同一遍转码完成，避免二次解码。\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F03\u002Fdc32f982-5c01-48d3-aa94-56e6b7cd60ef.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：轴对齐椭圆半轴由脸框与 pad 决定；外为清晰，内为模糊。\u003C\u002Fspan>\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">一、观测从哪来：other_face_obs\u003C\u002Fh1>\u003Cp style=\"line-height:2\">扫描阶段，在人体检测与 \u003Cspan style=\"color:rgb(225, 60, 57)\">ByteTrack\u003C\u002Fspan>  之外，收集 非主角脸观测：\u003C\u002Fp>\u003Cp style=\"line-height:2\">写入路径包括：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">检测帧上，对非主角人体 ROI 跑 SCRFD（for_stranger_blur=true，ROI 阈值放宽）；\u003C\u002Fli>\u003Cli style=\"line-height:2\">离线从 ByteTrack 历史回填；\u003C\u002Fli>\u003Cli style=\"line-height:2\">再剥一次主角；\u003C\u002Fli>\u003Cli style=\"line-height:2\">丢掉闪现。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">最小脸尺寸与占比：短边至少约 16 px，且不超过画幅短边约 26%。\u003C\u002Fp>\u003Cp style=\"line-height:2\">连续帧间隙容忍与检测步长挂钩：\u003C\u002Fp>\u003Cp style=\"line-height:2\">stride=3 时，隔帧观测仍可串成一条路人轨。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">二、排除主角：三道闸\u003C\u002Fh1>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F03\u002F0f8fd308-251f-477a-8644-2f49ca9641ef.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：任一闸命中则该观测不得进入虚化轨迹。\u003C\u002Fspan>\u003C\u002Fp>\u003Ch2 style=\"line-height:2\">2.1 track_id\u003C\u002Fh2>\u003Cp style=\"line-height:2\">若 \u003Cspan style=\"color:rgb(225, 60, 57)\">byte_track_id == hero_byte_track_id\u003C\u002Fspan>，直接排除。这是最干净的信号。\u003C\u002Fp>\u003Ch2 style=\"line-height:2\">2.2 thumb 相似度\u003C\u002Fh2>\u003Cp style=\"line-height:2\">锁定阈值常见为 0.32。\u003C\u002Fp>\u003Cp style=\"line-height:2\">轨迹级：若多点 拇指图相似度 达到「像主角」比例，整轨丢弃。\u003C\u002Fp>\u003Ch2 style=\"line-height:2\">2.3 几何 IoU \u002F 重叠\u003C\u002Fh2>\u003Cp style=\"line-height:2\">输出空间椭圆与主角保护区 IoU 过高 → 丢弃该关键点。\u003C\u002Fp>\u003Cp style=\"line-height:2\">源空间也有类 似保护。\u003C\u002Fp>\u003Cp style=\"line-height:2\">策略：宁可漏糊路人，不可误伤主角。\u003C\u002Fp>\u003Ch1 style=\"line-height:2\">三、椭圆参数：半轴与 pad≈1.08\u003C\u002Fh1>\u003Cp style=\"line-height:2\">脸框\u003Cspan style=\"color:rgb(225, 60, 57)\"> (x,y,w,h) \u003C\u002Fspan>→ 输出椭圆，默认\u003Cspan style=\"color:rgb(225, 60, 57)\"> face_pad ≈ 1.08\u003C\u002Fspan>：\u003C\u002Fp>\u003Cp style=\"line-height:2\">椭圆半轴：a ≈ 脸宽\u002F2×1.08，b ≈ 脸高\u002F2×1.08。\u003C\u002Fp>\u003Cp style=\"line-height:2\">相对轴对齐脸框，面积放大 1.08²≈1.17（约 +17%），盖住发际与下巴外缘。\u003C\u002Fp>\u003Cp style=\"line-height:2\">椭圆方程（patch 局部坐标，圆心在\u003Cspan style=\"color:rgb(225, 60, 57)\"> (a,b)\u003C\u002Fspan>）：\u003C\u002Fp>\u003Cp style=\"line-height:2\">v = ((X-a)\u002Fa)² + ((Y-b)\u002Fb)²\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">v ≤ 1：完全在椭圆内；\u003C\u002Fli>\u003Cli style=\"line-height:2\">1 &lt; v ≤ 1+f：羽化带；\u003C\u002Fli>\u003Cli style=\"line-height:2\">其它：透明。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">脸 80×100，pad=1.08：\u003C\u002Fp>\u003Cp style=\"line-height:2\">外接矩形约 86×108。高分检测（det_score ≥ 0.50）还会再外扩（cover expand），再乘 margin=1.05，确保糊区盖住源脸。\u003C\u002Fp>\u003Cp style=\"line-height:2\">由人体估头时，宽向也用 1.08：\u003C\u002Fp>\u003Cp style=\"line-height:2\">与虚化 pad 同数量级，语义一致：「头比脸略宽」。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">四、聚类、排序与「约 4 条」\u003C\u002Fh1>\u003Cp style=\"line-height:2\">按时空邻近串轨；再排序取显著轨。\u003C\u002Fp>\u003Cp style=\"line-height:2\">硬上限 32。成片滤镜每个椭圆要\u003Cspan style=\"color:rgb(225, 60, 57)\"> split + crop + boxblur + geq + overlay\u003C\u002Fspan>，节点线性膨胀。实务经验与科普约定：同时服务约 4 条显著路人轨 已够店内\u002F合影场景；更短的路过会被排序挤掉。\u003C\u002Fp>\u003Cp style=\"line-height:2\">最短连续：\u003Cspan style=\"color:rgb(225, 60, 57)\">min_consec=2\u003C\u002Fspan>，避免单帧闪糊。\u003C\u002Fp>\u003Cp style=\"line-height:2\">尾部 hold：离开后继续糊约\u003Cspan style=\"color:rgb(225, 60, 57)\"> tail_hold=6 \u003C\u002Fspan>源帧（≈0.24 s @25），防止人刚出框椭圆瞬间消失。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">五、中心平滑与半轴稳定\u003C\u002Fh1>\u003Cp style=\"line-height:2\">路人轨迹高斯 σ：Crop 约 0.18 s，Lens 约 0.12 s（稠密观测更短）。\u003C\u002Fp>\u003Cp style=\"line-height:2\">半轴若帧间跳变超过半轴跳变切断比例（稀疏 0.15 \u002F 稠密 0.28），切断为新 segment，避免一个巨大椭圆跨剧变。\u003C\u002Fp>\u003Cp style=\"line-height:2\">实务技巧：segment 内对 semi 取较大稳定值，中心仍跟随——消除「呼吸感」。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">六、 Alpha 合成公式\u003C\u002Fh1>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F03\u002F20e03790-0c3b-4d35-bc52-b337f2ad05f9.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：椭圆内用模糊图，外保留清晰图，边缘羽化过渡。\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">逐像素 alpha∈[0,1] 由椭圆 \u003Cspan style=\"color:rgb(225, 60, 57)\">geq \u003C\u002Fspan>给出（存成 0～255 再归一化）。\u003C\u002Fp>\u003Cp style=\"line-height:2\">羽化宽度\u003Cspan style=\"color:rgb(225, 60, 57)\"> feather_px\u003C\u002Fspan>（默认常为 1）。本项目实现：\u003C\u002Fp>\u003Cpre>\u003Ccode>std::string ellipse_alpha_geq_expr(int semi_a, int semi_b, int feather_px) {\n const std::string v = \"((X-a)*(X-a)\u002Fa2+(Y-b)*(Y-b)\u002Fb2)\"; \u002F\u002F conceptual\n if (feather_px &lt;= 0) return \"if(lte(\" + v + \",1),255,0)\";\n return \"if(lte(v,1),255, if(lte(v,1+f), floor(255*(1+f-v)\u002Ff), 0))\";\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">七、FFmpeg 滤镜串：boxblur + geq + overlay\u003C\u002Fh1>\u003Cp style=\"line-height:2\">追加路人虚化滤镜（与滤镜构建同构）逐步：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">split：一路做补丁，一路保持清晰底；\u003C\u002Fli>\u003Cli style=\"line-height:2\">crop：按椭圆外接矩形从当前位置裁出；\u003C\u002Fli>\u003Cli style=\"line-height:2\">boxblur：用 boxblur 滤镜表达式（半径受限时链式多次近似更强糊）；\u003C\u002Fli>\u003Cli style=\"line-height:2\">geq：写椭圆 alpha；\u003C\u002Fli>\u003Cli style=\"line-height:2\">overlay：贴回，enable 限制活跃帧区间。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">中心用分段线性：\u003C\u002Fp>\u003Cp style=\"line-height:2\">任意输出帧的中心，由关键点序列做分段线性插值得到。\u003C\u002Fp>\u003Cp style=\"line-height:2\">点列常关键点抽稀到约 24 点。\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子：算力粗估\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">1080p25，4 条椭圆，各平均半轴 50→补丁约 100×100：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">每帧 4 次小图 boxblur + overlay，远小于全图糊；\u003C\u002Fli>\u003Cli style=\"line-height:2\">滤镜图节点约 4×(split+crop+blur+geq+overlay)≈20+ 个标签。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">若强行上 20 条长轨，\u003Cspan style=\"color:rgb(225, 60, 57)\">字符串\u003C\u002Fspan> 与图编译时间会明显变差——这是「约 4 条」的工程动机。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">八、与 Lens\u002FCrop 合并为一遍\u003C\u002Fh1>\u003Cp style=\"line-height:2\">在 lens\u002Fcrop 滤镜末尾：若有路人轨则先\u003Cspan style=\"color:rgb(225, 60, 57)\"> format=yuv420p[vfocus]\u003C\u002Fspan>，再串 stranger blur，最终\u003Cspan style=\"color:rgb(225, 60, 57)\"> [vout]\u003C\u002Fspan>。\u003C\u002Fp>\u003Cp style=\"line-height:2\">即：跟拍几何与路人虚化同一滤镜图、一次解码一次编码。\u003C\u002Fp>\u003Cp style=\"line-height:2\">合并出片若分步，也可能先 focus 再 blur 独立转码；优先路径是 merged one-pass。\u003C\u002Fp>\u003Cp style=\"line-height:2\">映射注意：路人椭圆必须变到 输出坐标系。Lens 下要乘 zoom 并减 overlay 偏移；Crop 下要减窗原点再乘缩放。专门做这件事——在源坐标糊一发再拉伸，椭圆会错位。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">九、覆盖率与丢弃\u003C\u002Fh1>\u003Cp style=\"line-height:2\">椭圆落到输出后，与有效画布（或 crop 内框）交集比例过低则丢点，避免糊在黑边\u002F画外。\u003C\u002Fp>\u003Cp style=\"line-height:2\">高分检测强制扩椭圆：\u003Cspan style=\"color:rgb(225, 60, 57)\">det_score &gt;= 0.50 \u003C\u002Fspan>时 cover expand（margin 1.05）。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十、GPU 路径对照\u003C\u002Fh1>\u003Cp style=\"line-height:2\">用同一套按帧取椭圆轨迹取圆心半轴，在\u003Cspan style=\"color:rgb(225, 60, 57)\"> CUDA\u003C\u002Fspan>  上做 ROI blur + feather mask。参数语义与 FFmpeg 一致：radius \u002F power \u002F feather。调试可用叠加视频画椭圆轨迹验证。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十一、参数表\u003C\u002Fh1>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F03\u002F5c87bf42-3290-4fc3-976b-7259236d4112.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十二、 端到端心算例\u003C\u002Fh1>\u003Cp style=\"line-height:2\">场景：1280×720@25，crop 跟拍，路人脸源框 60×70，窗缩放后输出脸约 72×84，pad=1.08：\u003C\u002Fp>\u003Cp style=\"line-height:2\">例如脸宽 72、脸高 84：半轴 a≈39、b≈45。\u003C\u002Fp>\u003Cp style=\"line-height:2\">椭圆内像素约 πab≈5510。boxblur luma_radius=5、power=1，局部足够毁容级模糊；主角若 IoU 重叠被 guard 掉，则该关键点不入轨。\u003C\u002Fp>\u003Cp style=\"line-height:2\">时间：观测在 frame 100、103、106（stride=3），max_gap 与 stride 挂钩，可聚成一条；平滑 σ=0.18 s 后写入圆心点列；成片 n 从对应 25fps 索引启用到尾 hold。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十三、公式卡\u003C\u002Fh1>\u003Cp style=\"line-height:2\">椭圆：\u003C\u002Fp>\u003Cp style=\"line-height:2\">((X−cx)\u002Fa)² + ((Y−cy)\u002Fb)² ≤ 1\u003C\u002Fp>\u003Cp style=\"line-height:2\">pad：\u003C\u002Fp>\u003Cp style=\"line-height:2\">半轴公式：a=脸宽\u002F2×pad，b=脸高\u002F2×pad，pad≈1.08。\u003C\u002Fp>\u003Cp style=\"line-height:2\">合成：椭圆内取 blur，外取 sharp，羽化带线性过渡。\u003C\u002Fp>\u003Cp style=\"line-height:2\">排除主角（逻辑或）：\u003C\u002Fp>\u003Cp style=\"line-height:2\">排除主角：跟踪号相同，或相似度够高，或与主角框重叠过大——任一成立就不虚化。\u003C\u002Fp>\u003Cp style=\"line-height:2\">合并：\u003C\u002Fp>\u003Cp style=\"line-height:2\">把观测清洗、椭圆几何、滤镜串三件事分开调试，路人虚化问题通常一次就能定位到层。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十四、输出坐标映射：为何不能在源图糊完再拉伸\u003C\u002Fh1>\u003Cp style=\"line-height:2\">Lens 下源脸 (f_x,f_y,f_w,f_h) 到输出椭圆，核心步骤：\u003C\u002Fp>\u003Col>\u003Cli style=\"line-height:2\">计算当前帧英雄圆心\u003Cspan style=\"color:rgb(225, 60, 57)\"> (hero_cx, hero_cy)\u003C\u002Fspan> 与 zoom；\u003C\u002Fli>\u003Cli style=\"line-height:2\">用与成片相同的圆镜叠加原点计算得到放大图层偏移；\u003C\u002Fli>\u003Cli style=\"line-height:2\">把脸中心变到放大图层坐标，再变到圆镜 canvas，最后到输出 overlay 位置；\u003C\u002Fli>\u003Cli style=\"line-height:2\">半轴乘 \u003Cspan style=\"color:rgb(225, 60, 57)\">zoom * pad\u003C\u002Fspan>。\u003C\u002Fli>\u003C\u002Fol>\u003Cp style=\"line-height:2\">Crop 下：\u003C\u002Fp>\u003Cp style=\"line-height:2\">若同时做了裁切\u002F缩放，椭圆中心与半轴都要变换到最终输出坐标系。\u003C\u002Fp>\u003Cp style=\"line-height:2\">若错误地「源图椭圆 → 整帧 scale」，窗在移动时路人会相对主角滑动，出现「糊斑追错人」。因此构建时就按输出 n 采样映射，写入的圆心点列已是输出像素。\u003C\u002Fp>","https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F03\u002Fb52166ea-b0bd-4d06-b2a8-353f96ef8077.jpg","85,84","美畅，美畅物联，畅联，畅联云平台，视频监控云平台，云视频监控，视频云平台，视频开放平台，视频感知云，视频接入网关，AIoT综合接入网关，视频中台，物联网中台，视频上云网关，Ehome，I连锁行业，智慧交通，AI算法","原创技术分享丨美畅物联向工","https:\u002F\u002Fwww.24hlink.cn\u002Ftech\u002F2591","2026-09-03 16:37:38","869"]