[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"solution-scenes-menu":3,"tech-detail-2588":4},true,{"id":5,"title":6,"content":7,"picUrl":8,"tagIds":9,"keyWords":10,"htmlDescribe":11,"htmlUrl":12,"gmtCreate":13,"gmtModified":13,"articleInfoId":14},"2588","畅联云平台丨07-Lens与Crop跟拍几何","\u003Ch1 style=\"line-height:2\">Lens 与 Crop 跟拍几何：从人脸锚点到成片窗口\u003C\u002Fh1>\u003Cp style=\"line-height:2\">只讲坐标、公式、数值例子与跟拍几何。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">一、两种跟拍各自交付什么\u003C\u002Fh1>\u003Cp style=\"line-height:2\">模式\t观感\t几何本质\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F02\u002Fd6cce158-2046-4b05-8dc9-2b9830d40a42.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">二者共用同一套 源坐标轨迹 (cx_src, cy_src)（来自锁定后的人脸\u002F人体锚点），差异在「如何把锚点变成取样窗口」。\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F02\u002F35c98dc2-0407-4160-8683-271f5dc51d47.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：Lens 用圆心与半径定义取样；zoom 放大后再裁进圆内。\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cbr \u002F>\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">二、镜头几何模块：时间轴上的分段线性\u003C\u002Fh1>\u003Cp style=\"line-height:2\">成片时间轴用输出帧号 n（25fps）。轨迹是关键点序列\u003Cspan style=\"color:rgb(225, 60, 57)\"> [(n, value), …]\u003C\u002Fspan>。查询任意 n：\u003C\u002Fp>\u003Cp style=\"line-height:2\">任意帧 n 的值由相邻关键点线性插值得到。\u003C\u002Fp>\u003Cp style=\"line-height:2\">滤镜图里 FFmpeg \u003Cspan style=\"color:rgb(231, 95, 51)\">表达式\u003C\u002Fspan> 与此同构（分段线性表达式），保证 C++ 预览与成片一致。\u003C\u002Fp>\u003Cp style=\"line-height:2\">关键点抽稀把过密点抽到上限（路人虚化常用 24 点），避免滤镜图爆炸。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">三、锚点：脸框如何变成「该跟的点」\u003C\u002Fh1>\u003Cp style=\"line-height:2\">扫描得到的是人脸框\u003Cspan style=\"color:rgb(225, 60, 57)\"> (face_x, face_y, face_w, face_h)\u003C\u002Fspan> 与可选人体框。跟拍中心不是随便取框中心：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">轨迹用 cy：偏上半身，避免圆心掉到胸口；\u003C\u002Fli>\u003Cli style=\"line-height:2\">Lens overlay cy：有人体时锚在人体上部，圆顶高于头顶。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">人头保护区（防路人椭圆误伤、也用于几何估计）有硬约束：\u003C\u002Fp>\u003Cp style=\"line-height:2\">由脸估头高：\u003C\u002Fp>\u003Cp style=\"line-height:2\">头高 ≈ 限制在人体高度的 12%～32% 之间（由脸短边×1.38 估计）\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">人体高 800 像素、脸短边 140 时：\u003C\u002Fp>\u003Cp style=\"line-height:2\">头高估计约 193，并限制在人体高的 12%～32% 内。\u003C\u002Fp>\u003Cp style=\"line-height:2\">0.12×800 = 96；0.32×800 = 256。\u003C\u002Fp>\u003Cp style=\"line-height:2\">193.2 落在 [96,256]，取 193。若脸异常大（误检），0.32H 会盖帽，避免「头区吞掉半个身子」。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">四、Lens：圆镜取样坐标\u003C\u002Fh1>\u003Cp style=\"line-height:2\">圆镜叠加原点计算与 FFmpeg 侧圆镜 zoom 叠加坐标一致。成片侧先算：\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">zoom_x = lens_d \u002F crop_w，zoom_y = lens_d \u002F crop_h\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">（lens_d = 2 * lens_r）\u003C\u002Fspan>，再把放大图层拖到圆窗内。几何核心：\u003C\u002Fp>\u003Cpre>\u003Ccode>void lens_overlay_src_xy(int lens_r, double cx, double cy,\n double zoom_x, double zoom_y,\n int canvas_w, int canvas_h,\n int &amp;src_x, int &amp;src_y) {\n const int lens_d = lens_r * 2;\n const int ix = (int)std::floor((double)lens_r - cx * zoom_x);\n const int iy = (int)std::floor((double)lens_r - cy * zoom_y);\n const int scaled_w = (int)std::lround((double)canvas_w * zoom_x);\n const int scaled_h = (int)std::lround((double)canvas_h * zoom_y);\n \u002F\u002F clamp overlay origin so zoomed layer covers the circular window\n src_x = std::max(lens_d - scaled_w, std::min(0, ix));\n src_y = std::max(lens_d - scaled_h, std::min(0, iy));\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp style=\"line-height:2\">直觉：\u003C\u002Fp>\u003Col>\u003Cli style=\"line-height:2\">把源画布按 (zoom_x, zoom_y) 放大；\u003C\u002Fli>\u003Cli style=\"line-height:2\">希望人物锚点 (cx,cy) 落在圆镜中心；\u003C\u002Fli>\u003Cli style=\"line-height:2\">overlay 偏移把放大图「拖」到正确位置，并 clamp 防止露黑边。\u003C\u002Fli>\u003C\u002Fol>\u003Cp style=\"line-height:2\">输出侧半径有地板：圆镜半径大约不小于输出短边的 1\u002F6（且至少约 28 像素），避免远景小脸时圆镜缩成豆子。\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子（720p 输出）\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">out=1280×720，lens_r=120，zoom=1.8\u003C\u002Fspan>，锚点源坐标映射后圆心希望在输出\u003Cspan style=\"color:rgb(225, 60, 57)\"> (640,280)\u003C\u002Fspan>。\u003C\u002Fp>\u003Cp style=\"line-height:2\">放大后有效图宽 1280×1.8=2304。src_x 大致满足「圆心落在圆窗中心」，\u003C\u002Fp>\u003Cp style=\"line-height:2\">再被\u003Cspan style=\"color:rgb(225, 60, 57)\"> [lens_d - scaled_w, 0]\u003C\u002Fspan> 夹住，保证圆内总能采到像素。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">五、 Crop：移动矩形窗\u003C\u002Fh1>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F02\u002F8668cebd-32c7-4e1e-85bc-3983c1074f04.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：源图上 half_w×half_h 的窗以锚点为中心，clamp 进画幅后缩放到输出。\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cbr \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">流程：\u003C\u002Fp>\u003Col>\u003Cli style=\"line-height:2\">收集 lens 有效区间内的 raw 点；\u003C\u002Fli>\u003Cli style=\"line-height:2\">时间域高斯平滑；\u003C\u002Fli>\u003Cli style=\"line-height:2\">密采样到 25fps；\u003C\u002Fli>\u003Cli style=\"line-height:2\">把脸\u002F人装进窗；\u003C\u002Fli>\u003Cli style=\"line-height:2\">死区 + 速度门控；\u003C\u002Fli>\u003Cli style=\"line-height:2\">微位移 hold，消灭 1～2 px 残抖。\u003C\u002Fli>\u003C\u002Fol>\u003Cp style=\"line-height:2\">窗左上角：\u003C\u002Fp>\u003Cp style=\"line-height:2\">裁切窗口左上角：把中心减半宽半高后，夹紧到画面内，避免越界。\u003C\u002Fp>\u003Cp style=\"line-height:2\">clamp 会在人靠近边缘时「顶死」，若不做后处理，轨迹会出现折线拐角——这正是离线平滑与死区要抹平的对象。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">六、离线高斯平滑：公式与默认 σ\u003C\u002Fh1>\u003Cp style=\"line-height:2\">离线高斯平滑：用邻近关键点按时间距离加权平均，抑制检测抖动。\u003C\u002Fp>\u003Cp style=\"line-height:2\">默认配置：\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F02\u002Fd553dbcb-8d17-4c2f-b157-7d9116a61080.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">σ=0.72 s @25fps，半高宽时间约 1.7 s，即约 42 帧 的权重仍明显。站立微晃会被抹平；快速横穿会有拖影感——这是有意取舍。\u003C\u002Fp>\u003Cp style=\"line-height:2\">Lens σ=0.12 → 有效约 7 帧，保留更多即时位移。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">七、Crop 死区与意图门控\u003C\u002Fh1>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F02\u002F93d640df-eda9-42c1-8921-11f46aa49773.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"text-align:center;line-height:2\">\u003Cspan style=\"font-size:12px\">图：死区内冻结；超出 enter 阈值才开始跟随；速度不够则不跟。\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cbr \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">死区半径：\u003C\u002Fp>\u003Cp style=\"line-height:2\">d = max(dmin, 脸短边 × 0.45)\u003C\u002Fp>\u003Cp style=\"line-height:2\">滞回：\u003C\u002Fp>\u003Cp style=\"line-height:2\">全片位移若 ≤ d×2.20，直接冻在中心——「人几乎没动就别跟」。\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">脸短边 s=100：\u003C\u002Fp>\u003Cp style=\"line-height:2\">人原地晃 ±30 px：落在死区内，输出中心不变。横移累计 80 px 且速度超过意图阈值：开始以 最大步进 限速追随。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">八、Push-in：单人推进变焦\u003C\u002Fh1>\u003Cp style=\"line-height:2\">单人素材可走：固定锚点，zoom 从 1 拉到 最大变焦，同时保证主体不离开 crop。\u003C\u002Fp>\u003Cp style=\"line-height:2\">某输出帧 zoom z 时，源窗：\u003C\u002Fp>\u003Cp style=\"line-height:2\">放大倍率为 z 时，窗口宽高约为画面宽高除以 z；再按中心夹紧到画面内。\u003C\u002Fp>\u003Cp style=\"line-height:2\">推进时用主体框与 margin 检查主体是否仍在裁切窗内；若推进会导致出窗则跳过推进，避免「越推越把人脸裁掉」。\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>数值例子\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">1080p，z=1.6，锚点 (960,420)：\u003C\u002Fp>\u003Cp style=\"line-height:2\">x0=360, y0=82.5\u003C\u002Fp>\u003Cp style=\"line-height:2\">脸若在 y=50 且高 180，顶边可能贴窗；margin≈0.28(f_w,f_h) 会判危险。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">九、Lens \u002F Crop 轨迹构建对照\u003C\u002Fh1>\u003Cp style=\"text-align:center;line-height:2\">\u003Cimg src=\"https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F02\u002F0729075c-4a68-410a-8337-9eadb97973cc.png\" alt=\"\" loading=\"lazy\" \u002F>\u003C\u002Fp>\u003Cp style=\"line-height:2\">主角轨迹有效帧范围 取 cx\u002Fcy 点列的首尾 n，供滤镜 enable='between(n,…)'。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十、源帧号 ↔ 输出 25fps\u003C\u002Fh1>\u003Cp style=\"line-height:2\">定位结果带 源帧率（非法则 25）。输出帧：\u003C\u002Fp>\u003Cp style=\"line-height:2\">若源帧率不是 25，先把源帧号换算到 25 帧\u002F秒时间轴再查轨迹。\u003C\u002Fp>\u003Cp style=\"line-height:2\">本项目大量路径直接按 25 处理成片；扫描用源 fps 驱动 ByteTrack 。几何层用 t_sec = frame_idx \u002F fps 做高斯，再用 25fps 密采样写点列——时间在秒域平滑，索引在 25 域交付滤镜。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十一、常见几何故障与心算排查\u003C\u002Fh1>\u003Col>\u003Cli style=\"line-height:2\">圆镜裁头：overlay cy 偏下或头高估计过矮 → 查锚点函数，勿只调 zoom。\u003C\u002Fli>\u003Cli style=\"line-height:2\">贴边抖：crop clamp 引起 → 看是否绕过了死区\u002F平滑。\u003C\u002Fli>\u003Cli style=\"line-height:2\">站立仍跟拍晃：死区过小或 σ 过短 → 对照 Crop 默认 0.72 \u002F 0.45。\u003C\u002Fli>\u003Cli style=\"line-height:2\">Lens 与 Crop 选人不同心：是否混用了 face_cy 与 body_cy；Lens overlay 有人体上部锚点加权。\u003C\u002Fli>\u003C\u002Fol>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十二、公式卡\u003C\u002Fh1>\u003Cp style=\"line-height:2\">分段线性：\u003C\u002Fp>\u003Cp style=\"line-height:2\">v(n)=v0+α(v1-v0), α=(n-t0)\u002F(t1-t0)\u003C\u002Fp>\u003Cp style=\"line-height:2\">高斯：\u003C\u002Fp>\u003Cp style=\"line-height:2\">hat v_i = Σ_j w_ij v_j \u002F Σ_j w_ij，\u003C\u002Fp>\u003Cp style=\"line-height:2\">w_ij = exp(-(t_j-t_i)²\u002F(2σ²))\u003C\u002Fp>\u003Cp style=\"line-height:2\">头高上下限：人体高的 12%～32%。\u003C\u002Fp>\u003Cp style=\"line-height:2\">Crop 死区：\u003C\u002Fp>\u003Cp style=\"line-height:2\">d=max(48, 0.45×脸短边)\u003C\u002Fp>\u003Cp style=\"line-height:2\">Lens 取样偏移（概念）：\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"color:rgb(225, 60, 57)\">ix = lens_r - cx·zoom_x\u003C\u002Fspan>，再\u003Cspan style=\"color:rgb(225, 60, 57)\"> clamp 到 [lens_d-scaled_w, 0]\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">掌握以上，即可从一段\u003Cspan style=\"color:rgb(225, 60, 57)\"> cx_pts\u002Fcy_pts \u003C\u002Fspan>反推成片窗口每一帧的几何来源。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十三、锚点函数对照\u003C\u002Fh1>\u003Cp style=\"line-height:2\">本项目里几条函数决定「跟哪一点」与「圆镜采哪一块」：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">圆镜轨迹纵向取人脸 \u002F 由人脸框推圆镜 cy：轨迹 cy 偏上；\u003C\u002Fli>\u003Cli style=\"line-height:2\">Crop 装人窗锚定（人体框软约束 + 已平滑跟拍点）；\u003C\u002Fli>\u003Cli style=\"line-height:2\">圆镜叠加原点计算（见上文代码）；\u003C\u002Fli>\u003Cli style=\"line-height:2\">成片跟拍：zoom_x = lens_d \u002F crop_w（及 zoom_y 对称）。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">权重含义：轨迹更跟「已平滑的跟拍点」，人体框只做软约束，避免单帧检测框把窗猛拽。\u003C\u002Fp>\u003Cp style=\"line-height:2\">源帧 → 输出 25：做源帧索引映射到 25fps（非法 fps 按 25）。\u003C\u002Fp>\u003Cp style=\"line-height:2\">\u003Cspan style=\"font-size:19px\">\u003Cstrong>再算一遍 push-in 锚点\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Cp style=\"line-height:2\">脸 y=200,h=120：\u003C\u002Fp>\u003Cp style=\"line-height:2\">例如：人体框顶在 140、身高 360 时，跟拍中心可取约 140+252=392（偏上半身）。\u003C\u002Fp>\u003Cp style=\"line-height:2\">相对纯脸心 260，锚点下移约 132 px——推进变焦时胸口以上更稳地留在画面里。\u003C\u002Fp>\u003Chr \u002F>\u003Ch1 style=\"line-height:2\">十四、Lens 有效窗与尾 hold\u003C\u002Fh1>\u003Cp style=\"line-height:2\">离线 Pass 写出圆镜有效截止帧与圆镜结束原因。轨迹点构建止于该帧（含片尾保持秒数，出画原因可几乎为 0）。因此：\u003C\u002Fp>\u003Cul>\u003Cli style=\"line-height:2\">扫描期 Kalman 仍可能在后段给出框；\u003C\u002Fli>\u003Cli style=\"line-height:2\">成片圆镜却在有效截止后停用（enable 关掉）。\u003C\u002Fli>\u003C\u002Ful>\u003Cp style=\"line-height:2\">这是几何层与跟踪层的第二次分工：跟踪尽量不断，镜头有意识结束，避免跟错人或跟到空镜。\u003C\u002Fp>","https:\u002F\u002Fqu-link.oss-cn-hangzhou.aliyuncs.com\u002F2026\u002F09\u002F02\u002F5628a830-2d83-49c1-9080-037b6170a85e.jpg","85,84","美畅，美畅物联，畅联，畅联云平台，视频监控云平台，云视频监控，视频云平台，视频开放平台，视频感知云，视频接入网关，AIoT综合接入网关，视频中台，物联网中台，视频上云网关，Ehome，I连锁行业，智慧交通，AI算法","原创技术分享丨美畅物联向工","https:\u002F\u002Fwww.24hlink.cn\u002Ftech\u002F2588","2026-09-02 16:01:56","868"]