视频稳像基础:帧、运动矢量、全局运动与局部运动、抖动类型
运动相机电子防抖(EIS)的核心,是理解视频序列中“运动”的本质。在开始设计稳像算法之前,我们必须先建立一套精确的语言来描述画面中的运动。本章将围绕四个基础概念展开:帧(Frame)、运动矢量(Motion Vector)、全局运动与局部运动(Global vs. Local Motion),以及抖动类型(平移、旋转、缩放)。这些概念构成了所有稳像算法的输入与约束条件,也是后续学习光流法、特征匹配法、卡尔曼滤波或轨迹平滑的基石。
上图展示了本章的核心概念关系:视频由连续帧构成,帧间通过运动矢量建立联系;运动矢量可聚合为全局运动(相机运动)与局部运动(物体运动);而全局运动又可分解为平移、旋转、缩放等基本抖动类型。EIS 算法的本质,就是通过估计全局运动参数,区分有意运动与无意抖动,进而对帧进行几何变换补偿。
2.1 帧与帧间关系:时间分辨率与运动感知
核心原理
帧(Frame)是视频的最小时间单位,通常以 FPS(Frames Per Second)衡量。运动相机常见的帧率有 30fps、60fps、120fps 甚至 240fps。帧率决定了时间采样密度,直接影响运动估计的精度。在 30fps 下,相邻帧间隔约 33ms,若相机快速平移,帧间位移可能达到数十个像素;而在 240fps 下,帧间位移通常小于 5 个像素,运动估计更容易收敛。
帧间关系通过运动矢量(Motion Vector, MV)描述。MV 是一个二维向量 (dx, dy),表示某一像素块或特征点在相邻帧间的位移。在视频编码标准(如 H.264/H.265)中,MV 是压缩的核心工具;在 EIS 中,MV 是估计相机运动的原始观测数据。
判断方法或操作流程
在实际工程中,获取帧间运动矢量的常用方法包括:
- 块匹配法(Block Matching):将当前帧划分为 8×8 或 16×16 像素块,在参考帧的搜索窗口内寻找最相似的块,计算位移。适用于硬件实现,但计算量大。
- 特征点匹配法(Feature Matching):提取 ORB、SIFT 或 SURF 特征点,通过描述子匹配得到稀疏运动矢量。精度高,但受纹理丰富度影响。
- 光流法(Optical Flow):基于亮度恒定假设,计算每个像素的运动场。稠密光流(如 Farneback)精度高但计算量大;稀疏光流(如 Lucas-Kanade)适合实时系统。
案例拆解:帧率对运动估计的影响
假设一台运动相机在骑行场景中,车速 30km/h,镜头焦距等效 24mm,传感器像素尺寸 2μm。计算可得:当帧率为 30fps 时,相邻帧间图像位移约为 28 像素;当帧率为 60fps 时,位移降至 14 像素;当帧率为 120fps 时,位移仅 7 像素。位移越大,块匹配的搜索范围需要越大,计算量呈平方增长,且容易陷入局部最优。因此,高帧率是 EIS 的天然盟友——它降低了运动估计的难度,也减少了运动模糊对特征提取的干扰。
常见误区或总结复盘
总结:帧是运动估计的时间基准,帧率选择需权衡运动幅度、计算负载与光照条件。运动矢量是连接帧间信息的桥梁,其质量直接决定后续全局运动估计的准确性。
2.2 全局运动与局部运动:分离相机运动与物体运动
核心原理
全局运动(Global Motion, GM)指由相机自身运动引起的整幅画面的统一位移或变换,包括平移、旋转、缩放、透视等。局部运动(Local Motion, LM)指画面中独立物体(行人、车辆、飞鸟)相对于背景的运动。EIS 的目标是补偿全局运动中的“无意抖动”部分,同时保留“有意扫描”部分,并尽量避免对局部运动产生过度扭曲。
数学上,全局运动通常用参数模型描述:
- 平移模型:x' = x + tx,y' = y + ty(2 参数)
- 相似变换模型:x' = s·(x·cosθ - y·sinθ) + tx,y' = s·(x·sinθ + y·cosθ) + ty(4 参数)
- 仿射变换模型:x' = a1·x + a2·y + a3,y' = b1·x + b2·y + b3(6 参数)
- 单应变换模型:8 参数,可描述透视效果
运动相机通常使用相似变换或仿射变换模型,因为镜头畸变已由前置校正模块处理,透视变化在大多数场景下可忽略。
判断方法或操作流程
分离全局运动与局部运动的标准流程如下:
- 特征提取:在帧 N 中提取特征点,记录位置 (x, y)。
- 特征匹配:在帧 N+1 中找到对应点 (x', y'),得到运动矢量集合。
- 模型拟合:使用 RANSAC(随机采样一致性)算法迭代拟合全局运动模型。RANSAC 能有效剔除局部运动产生的离群点。
- 残差分析:计算每个特征点的残差(实际位置与模型预测位置的差值)。残差大于阈值的点视为局部运动点。
- 模型精化:仅使用内点(符合全局模型的点)重新拟合,提高精度。
案例拆解:骑行场景中的全局/局部运动分离
在骑行场景中,相机固定在头盔上,画面中背景(道路、树木)呈现明显的全局运动——主要由相机前进和颠簸引起。同时,画面中可能出现其他骑行者或车辆,它们具有独立的局部运动。若将局部运动误判为全局运动,EIS 会错误地补偿这些物体,导致背景抖动加剧、前景物体扭曲。
具体数据:某帧中提取到 120 个特征点,其中 95 个属于背景(内点),25 个属于前方车辆(离群点)。RANSAC 拟合相似变换模型后,内点残差均值 0.8 像素,离群点残差均值 7.3 像素。通过残差阈值 2.0 像素,成功分离两类运动。最终全局运动参数为:tx=12.5px, ty=-3.2px, θ=0.8°, s=1.01。该参数用于后续的抖动平滑与补偿。
常见误区或总结复盘
总结:全局运动与局部运动的分离是 EIS 的核心预处理步骤。RANSAC 类算法是标准工具,但需根据场景调整阈值与迭代次数。当特征点质量不佳时,应引入多传感器融合策略。
2.3 抖动类型:平移、旋转与缩放的物理本质
核心原理
运动相机的抖动源于手持不稳、风阻、路面颠簸、机械振动等。从运动分解的角度,抖动可归类为:
| 抖动类型 | 物理来源 | 典型幅度 | 对画面的影响 | EIS 补偿难度 |
|---|---|---|---|---|
| 平移 (Tx, Ty) | 手部上下/左右晃动、路面颠簸 | 1-30 像素 | 整体画面位移,最易感知 | 低,只需平移补偿 |
| 旋转 (θ) | 手腕转动、身体扭转、风阻 | 0.1°-3° | 画面倾斜,地平线不水平 | 中,需旋转矩阵变换 |
| 缩放 (s) | 身体前后移动、镜头呼吸效应 | 0.98-1.02 | 画面放大/缩小,透视感变化 | 中高,需插值重采样 |
实际抖动通常是三种类型的耦合。例如,骑行中遇到减速带时,相机同时产生垂直平移(Ty≈15px)和俯仰旋转(θ≈1.2°)。若仅补偿平移而忽略旋转,画面边缘仍会出现明显的“滚动”感。
判断方法或操作流程
在工程中,判断当前抖动主要类型的方法:
- 观察运动矢量场:若所有矢量方向一致且大小相近,则以平移为主;若矢量方向呈圆周分布,则以旋转为主;若矢量从中心向外发散或向内汇聚,则以缩放为主。
- 计算运动模型参数:拟合仿射变换模型后,检查参数占比。若 tx、ty 远大于 θ 和 s,则平移主导。
- 频谱分析:对运动轨迹进行 FFT,平移抖动通常集中在 1-10Hz,旋转抖动集中在 2-8Hz,缩放抖动较少见且频率较低。
案例拆解:滑雪场景的旋转抖动补偿
滑雪场景中,运动员身体倾斜导致相机绕光轴旋转(Roll 轴)频繁。某帧序列中,估计出旋转角序列:θ = [0.5°, -1.2°, 2.0°, -0.8°, 1.5°]。若仅做平移补偿,画面虽然稳定但地平线始终倾斜,观感不佳。加入旋转补偿后,需对每一帧进行反向旋转,旋转中心通常取画面中心。实际操作中,使用 OpenCV 的 cv2.getRotationMatrix2D 生成 2×3 变换矩阵,再通过 cv2.warpAffine 进行重采样。注意:旋转补偿会引入边缘黑边,需结合“裁剪+缩放”策略(将输出画面缩小至原始尺寸的 85%-90%)来隐藏无效区域。
// 伪代码:旋转补偿示例
center = (width/2, height/2)
M = getRotationMatrix2D(center, -theta, 1.0) // 反向旋转
warped = warpAffine(frame, M, (width, height), borderMode=BORDER_REPLICATE)
// 裁剪中心区域并缩放回原始尺寸
crop_ratio = 0.88
cropped = warped[center_y - crop_h/2 : center_y + crop_h/2, ...]
output = resize(cropped, (width, height))
常见误区或总结复盘
总结:平移、旋转、缩放是抖动的三种基本模式,实际场景中多为耦合出现。EIS 系统应根据运动矢量场的分布特征,动态选择补偿模型。平移补偿是基础,旋转补偿提升观感,缩放补偿锦上添花。在资源受限的嵌入式平台上,建议优先保证平移+旋转补偿,缩放补偿作为可选特性。