公司动态

07-Lens与Crop跟拍几何

📅 2026/8/19 12:32:50
07-Lens与Crop跟拍几何
Lens 与 Crop 跟拍几何从人脸锚点到成片窗口只讲坐标、公式、数值例子与跟拍几何。1. 两种跟拍各自交付什么模式观感几何本质Lens全画幅背景 圆形放大镜罩住主角在输出画布上 overlay 一块圆形取样窗Crop画面本身跟着人平移/变焦源图上取随时间移动的矩形窗再缩放到输出二者共用同一套 源坐标轨迹(cx_src, cy_src)来自锁定后的人脸/人体锚点差异在「如何把锚点变成取样窗口」。图Lens 用圆心与半径定义取样zoom 放大后再裁进圆内。2. 镜头几何模块时间轴上的分段线性成片时间轴用输出帧号 n25fps。轨迹是关键点序列[(n, value), …]。查询任意 n任意帧 n 的值由相邻关键点线性插值得到。滤镜图里 FFmpeg 表达式与此同构分段线性表达式保证 C 预览与成片一致。关键点抽稀把过密点抽到上限路人虚化常用 24 点避免滤镜图爆炸。3. 锚点脸框如何变成「该跟的点」扫描得到的是人脸框(face_x, face_y, face_w, face_h)与可选人体框。跟拍中心不是随便取框中心轨迹用 cy偏上半身避免圆心掉到胸口Lens overlay cy有人体时锚在人体上部圆顶高于头顶。人头保护区防路人椭圆误伤、也用于几何估计有硬约束由脸估头高头高 ≈ 限制在人体高度的 12%32% 之间由脸短边×1.38 估计数值例子人体高 800 像素、脸短边 140 时头高估计约 193并限制在人体高的 12%32% 内。0.12×800 960.32×800 256。193.2 落在 [96,256]取 193。若脸异常大误检0.32H 会盖帽避免「头区吞掉半个身子」。4. Lens圆镜取样坐标圆镜叠加原点计算与 FFmpeg 侧圆镜 zoom 叠加坐标一致。成片侧先算zoom_x lens_d / crop_wzoom_y lens_d / crop_hlens_d 2 * lens_r再把放大图层拖到圆窗内。几何核心voidlens_overlay_src_xy(intlens_r,doublecx,doublecy,doublezoom_x,doublezoom_y,intcanvas_w,intcanvas_h,intsrc_x,intsrc_y){constintlens_dlens_r*2;constintix(int)std::floor((double)lens_r-cx*zoom_x);constintiy(int)std::floor((double)lens_r-cy*zoom_y);constintscaled_w(int)std::lround((double)canvas_w*zoom_x);constintscaled_h(int)std::lround((double)canvas_h*zoom_y);// clamp overlay origin so zoomed layer covers the circular windowsrc_xstd::max(lens_d-scaled_w,std::min(0,ix));src_ystd::max(lens_d-scaled_h,std::min(0,iy));}直觉把源画布按(zoom_x, zoom_y)放大希望人物锚点(cx,cy)落在圆镜中心overlay 偏移把放大图「拖」到正确位置并 clamp 防止露黑边。输出侧半径有地板圆镜半径大约不小于输出短边的 1/6且至少约 28 像素避免远景小脸时圆镜缩成豆子。数值例子720p 输出out1280×720lens_r120zoom1.8锚点源坐标映射后圆心希望在输出(640,280)。放大后有效图宽 1280×1.82304。src_x大致满足「圆心落在圆窗中心」再被[lens_d - scaled_w, 0]夹住保证圆内总能采到像素。5. Crop移动矩形窗图源图上 half_w×half_h 的窗以锚点为中心clamp 进画幅后缩放到输出。流程收集 lens 有效区间内的 raw 点时间域高斯平滑密采样到 25fps把脸/人装进窗死区 速度门控微位移 hold消灭 12 px 残抖。窗左上角裁切窗口左上角把中心减半宽半高后夹紧到画面内避免越界。clamp 会在人靠近边缘时「顶死」若不做后处理轨迹会出现折线拐角——这正是离线平滑与死区要抹平的对象。6. 离线高斯平滑公式与默认 σ离线高斯平滑用邻近关键点按时间距离加权平均抑制检测抖动。默认配置模式平滑时间常数含义Lens0.12较短跟手Crop0.72很长像稳定器数值例子σ0.72 s 25fps半高宽时间约 1.7 s即约 42 帧 的权重仍明显。站立微晃会被抹平快速横穿会有拖影感——这是有意取舍。Lens σ0.12 → 有效约 7 帧保留更多即时位移。7. Crop 死区与意图门控图死区内冻结超出 enter 阈值才开始跟随速度不够则不跟。死区半径d max(dmin, 脸短边 × 0.45)滞回全片位移若 ≤ d×2.20直接冻在中心——「人几乎没动就别跟」。数值例子脸短边 s100人原地晃 ±30 px落在死区内输出中心不变。横移累计 80 px 且速度超过意图阈值开始以 最大步进 限速追随。8. Push-in单人推进变焦单人素材可走固定锚点zoom 从 1 拉到 最大变焦同时保证主体不离开 crop。某输出帧 zoom z 时源窗放大倍率为 z 时窗口宽高约为画面宽高除以 z再按中心夹紧到画面内。推进时用主体框与 margin 检查主体是否仍在裁切窗内若推进会导致出窗则跳过推进避免「越推越把人脸裁掉」。数值例子1080pz1.6锚点 (960,420)x0360, y082.5脸若在 y50 且高 180顶边可能贴窗margin≈0.28(f_w,f_h) 会判危险。9. Lens / Crop 轨迹构建对照步骤LensCropraw 点脸/人锚点序列同有效终点圆镜有效截止帧同高斯 σ0.120.72死区弱 / follow_weight 混合强意图门控向前外推可选 retro默认 prepend输出overlay 圆心序列crop 中心序列主角轨迹有效帧范围 取 cx/cy 点列的首尾 n供滤镜enablebetween(n,…)。10. 源帧号 ↔ 输出 25fps定位结果带 源帧率非法则 25。输出帧若源帧率不是 25先把源帧号换算到 25 帧/秒时间轴再查轨迹。本项目大量路径直接按 25 处理成片扫描用源 fps 驱动 ByteTrack。几何层用t_sec frame_idx / fps做高斯再用 25fps 密采样写点列——时间在秒域平滑索引在 25 域交付滤镜。11. 常见几何故障与心算排查圆镜裁头overlay cy 偏下或头高估计过矮 → 查锚点函数勿只调 zoom。贴边抖crop clamp 引起 → 看是否绕过了死区/平滑。站立仍跟拍晃死区过小或 σ 过短 → 对照 Crop 默认 0.72 / 0.45。Lens 与 Crop 选人不同心是否混用了 face_cy 与 body_cyLens overlay 有人体上部锚点加权。12. 公式卡分段线性v(n)v0α(v1-v0), α(n-t0)/(t1-t0)高斯hat v_i Σ_j w_ij v_j / Σ_j w_ijw_ij exp(-(t_j-t_i)²/(2σ²))头高上下限人体高的 12%32%。Crop 死区dmax(48, 0.45×脸短边)Lens 取样偏移概念ix lens_r - cx·zoom_x再 clamp 到[lens_d-scaled_w, 0]掌握以上即可从一段cx_pts/cy_pts反推成片窗口每一帧的几何来源。13. 锚点函数对照本项目里几条函数决定「跟哪一点」与「圆镜采哪一块」圆镜轨迹纵向取人脸 / 由人脸框推圆镜 cy轨迹 cy 偏上Crop 装人窗锚定人体框软约束 已平滑跟拍点圆镜叠加原点计算见上文代码成片跟拍zoom_x lens_d / crop_w及 zoom_y 对称。权重含义轨迹更跟「已平滑的跟拍点」人体框只做软约束避免单帧检测框把窗猛拽。源帧 → 输出 25做源帧索引映射到 25fps非法 fps 按 25。再算一遍 push-in 锚点脸 y200,h120例如人体框顶在 140、身高 360 时跟拍中心可取约 140252392偏上半身。相对纯脸心 260锚点下移约 132 px——推进变焦时胸口以上更稳地留在画面里。14. Lens 有效窗与尾 hold离线 Pass 写出圆镜有效截止帧与圆镜结束原因。轨迹点构建止于该帧含片尾保持秒数出画原因可几乎为 0。因此扫描期 Kalman 仍可能在后段给出框成片圆镜却在有效截止后停用enable关掉。这是几何层与跟踪层的第二次分工跟踪尽量不断镜头有意识结束避免跟错人或跟到空镜。