3. 相机运动与抖动分析:手持拍摄、车载运动、无人机抖动特性

做防抖算法,第一步不是调参数,而是搞清楚你的对手是谁。

我入行那会儿接过一个项目,客户说「画面抖得厉害,你们给稳一下」。结果一分析,既有手持的随机晃动,又有车载的低频颠簸,还有风引起的微振动。三种抖动混在一起,单一算法根本搞不定。从那以后,我养成了一个习惯——拿到视频先做运动分析,搞清楚抖动源,再选方案。

这一章,咱们就把三种最常见的运动场景拆开来看。它们的频率、幅度、规律完全不同,对应的防抖策略也天差地别。

3.1 手持拍摄:高频随机 + 低频漂移

手持拍摄是咱们接触最多的场景。你想想看,手机、微单、运动相机,大部分时候都是人拿着拍。

手持抖动的核心特征有两个:

  • 高频随机抖动:频率集中在 1–10 Hz,幅度小(1–5 像素)。这是手部肌肉不自觉的微颤,无法通过「端稳」消除。
  • 低频漂移:频率 0.1–1 Hz,幅度大(几十到上百像素)。这是身体重心移动、呼吸起伏、或者你边走边拍造成的。

关键指标:手持拍摄的抖动能量,约 70% 集中在 2–8 Hz 频段。这个频段恰好是人眼最敏感的运动范围——所以你会觉得「抖得头晕」。

我在项目中遇到过一种情况:用户用手机拍小孩玩耍,画面忽左忽右。一开始我以为是高频抖动,上了强滤波,结果画面变得「黏糊糊」的,运动拖尾严重。后来一分析,其实是低频漂移占主导——用户跟着小孩来回走动,身体转向才是主因。

所以我的建议是:先做运动分离。用高通滤波器提取高频抖动,用低通滤波器提取低频漂移,分别处理。

抖动类型 频率范围 幅度 典型成因 处理策略
高频随机抖动 1–10 Hz 1–5 px 手部肌肉微颤 低通滤波 / 卡尔曼滤波
低频漂移 0.1–1 Hz 10–100+ px 身体移动、呼吸 运动补偿 + 裁剪
突发抖动 瞬时 5–20 px 手被碰、换手 异常检测 + 插值

避坑指南:我曾经在手持防抖里直接用全局运动估计,结果遇到画面中有快速移动的物体(比如飞过的鸟),运动向量全被带偏了。后来改用 特征点匹配 + RANSAC 剔除离群点,才把真正的相机运动分离出来。

3.2 车载运动:低频主导 + 路面激励

车载场景跟手持完全不一样。你坐在车里,相机固定在支架上或者车身上,抖动源变成了路面和车辆本身。

车载抖动的特点很鲜明:

  • 低频主导:频率集中在 0.5–5 Hz,幅度大(10–50 像素)。这是车辆通过颠簸路面、减速带、转弯时产生的。
  • 路面激励:不同路面产生不同频率的振动。柏油路平滑,振动小;碎石路振动频率高一些;越野路面低频大幅跳动。
  • 车辆自身振动:发动机怠速、悬挂系统、轮胎动平衡都会引入特定频率的抖动。

我记得有一次做车载监控项目,测试时发现画面每隔几秒就规律性地抖一下。查了半天,发现是雨刮器在高速运行时产生的振动传递到了摄像头支架上。嗯,这种「非路面」的干扰源,有时候比路面本身还难搞。

注意:车载场景下,运动模糊和抖动经常同时出现。低频大幅抖动会导致帧间位移过大,卷帘快门效应也会更明显。防抖算法必须结合去模糊和去卷帘快门处理,否则效果大打折扣。

车载防抖的另一个难点是:运动预测。手持拍摄你可以容忍一定的延迟,但车载场景(尤其是辅助驾驶)要求实时性极高。我建议使用 IMU(惯性测量单元)数据辅助,用陀螺仪和加速度计提前感知车辆姿态变化,比纯视觉算法快 10–20 ms。

路面类型 振动频率 典型幅度 防抖难度
柏油路 0.5–2 Hz 5–15 px 低
碎石路 2–5 Hz 15–30 px 中
越野路面 0.5–3 Hz 30–80 px 高
减速带 瞬时冲击 50–100+ px 极高

3.3 无人机抖动:高频振动 + 风扰 + 姿态变化

无人机抖动,是我个人觉得最「棘手」的场景。为什么?因为它的抖动源太多了,而且互相耦合。

拆开来看,主要有三类:

  • 电机/螺旋桨高频振动:频率 50–200 Hz,幅度小(1–3 像素)。这是电机高速旋转产生的机械振动,通过机身传递到相机。
  • 风扰引起的低频摆动:频率 1–5 Hz,幅度 5–20 像素。无人机在风中会像「钟摆」一样晃动,尤其是悬停时。
  • 姿态变化引起的运动:无人机转向、加速、减速时,相机跟随机身做大幅运动,幅度可达 50–200 像素。

核心矛盾:高频振动需要强滤波,但强滤波会引入延迟,导致姿态变化时的运动响应变慢。说白了,就是「稳」和「快」之间的 trade-off。

我在做无人机航拍防抖时,踩过一个坑:直接用电子防抖(EIS)处理所有抖动,结果高频振动是压住了,但无人机快速转向时画面「卡顿」感特别明显。后来我换了个思路——分频段处理:

  1. 高频振动(>20 Hz):用机械减震 + 电子防抖的强滤波,直接滤掉。
  2. 中频风扰(1–20 Hz):用卡尔曼滤波做平滑,保留一定的运动响应。
  3. 低频姿态变化(<1 Hz):不做滤波,只做运动补偿,保证画面跟随性。

经验之谈:我曾经在无人机上试过纯视觉防抖,结果在光线不好的时候特征点匹配失败率很高。后来加了 IMU 数据做融合,用陀螺仪估计高频振动,用视觉估计低频运动,效果好了不止一个档次。

3.4 三种场景对比:一张图看懂

下面这张 SVG 图,把三种场景的抖动特征、频率分布和推荐策略做了个汇总。你可以把它当作一个快速参考。

三种运动场景抖动特性对比 三种运动场景抖动特性对比 手持拍摄 • 高频随机:1–10 Hz,1–5 px • 低频漂移:0.1–1 Hz,10–100+ px • 能量集中在 2–8 Hz • 推荐:特征点匹配 + 分频滤波 • 避坑:注意运动物体干扰 车载运动 • 低频主导:0.5–5 Hz,10–50 px • 路面激励:不同路面差异大 • 车辆自身振动(发动机等) • 推荐:IMU 辅助 + 运动预测 • 避坑:运动模糊与抖动共存 无人机抖动 • 高频振动:50–200 Hz,1–3 px • 风扰摆动:1–5 Hz,5–20 px • 姿态变化:50–200 px • 推荐:分频段处理 + IMU 融合 • 避坑:稳与快的 trade-off 核心结论 1. 手持:高频随机 + 低频漂移 → 分频滤波 + 特征点匹配 2. 车载:低频主导 + 路面激励 → IMU 辅助 + 运动预测 3. 无人机:高频振动 + 风扰 + 姿态变化 → 分频段处理 + 多传感器融合 频率分布示意(Hz) 0.1 1 10 50 200 车载 手持 风扰 电机振动

3.5 我的选择框架

说了这么多,最后分享一个我自己的决策框架。拿到一个防抖需求,我会按这个顺序问自己:

  1. 抖动源是什么?——手持?车载?无人机?还是混合场景?
  2. 频率分布如何?——用频谱分析工具(比如 FFT)看一眼能量集中在哪个频段。
  3. 实时性要求多高?——消费级视频可以容忍 50–100 ms 延迟,但辅助驾驶要求 <10 ms。
  4. 有没有辅助传感器?——有 IMU 的话,优先用 IMU 做高频估计,视觉做低频补偿。
  5. 运动模糊严重吗?——严重的话,先做去模糊,再做防抖,顺序不能反。

最后提醒一句:不要迷信「万能防抖算法」。我见过太多团队拿着一个算法硬套所有场景,结果每个场景都做不好。先分析,再选方案,才是正道。