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)处理所有抖动,结果高频振动是压住了,但无人机快速转向时画面「卡顿」感特别明显。后来我换了个思路——分频段处理:
- 高频振动(>20 Hz):用机械减震 + 电子防抖的强滤波,直接滤掉。
- 中频风扰(1–20 Hz):用卡尔曼滤波做平滑,保留一定的运动响应。
- 低频姿态变化(<1 Hz):不做滤波,只做运动补偿,保证画面跟随性。
经验之谈:我曾经在无人机上试过纯视觉防抖,结果在光线不好的时候特征点匹配失败率很高。后来加了 IMU 数据做融合,用陀螺仪估计高频振动,用视觉估计低频运动,效果好了不止一个档次。
3.4 三种场景对比:一张图看懂
下面这张 SVG 图,把三种场景的抖动特征、频率分布和推荐策略做了个汇总。你可以把它当作一个快速参考。
3.5 我的选择框架
说了这么多,最后分享一个我自己的决策框架。拿到一个防抖需求,我会按这个顺序问自己:
- 抖动源是什么?——手持?车载?无人机?还是混合场景?
- 频率分布如何?——用频谱分析工具(比如 FFT)看一眼能量集中在哪个频段。
- 实时性要求多高?——消费级视频可以容忍 50–100 ms 延迟,但辅助驾驶要求 <10 ms。
- 有没有辅助传感器?——有 IMU 的话,优先用 IMU 做高频估计,视觉做低频补偿。
- 运动模糊严重吗?——严重的话,先做去模糊,再做防抖,顺序不能反。
最后提醒一句:不要迷信「万能防抖算法」。我见过太多团队拿着一个算法硬套所有场景,结果每个场景都做不好。先分析,再选方案,才是正道。