NOTE / 2026/9/26

如何用 YOLO + SLAM 思想做一个航空稳拍工具

航空技术笔记航空摄影视频稳定YOLOSLAM光流计算机视觉

给拍飞机、航模、打鸟的人:让长焦手抖、主体乱飘的视频变得“像有云台一样好看”。

动机:一个航空爱好者的痛点

我是一个航空爱好者,经常去各地看航空展——珠海航展、长春空军开放日、新加坡航展……每次都会拍一堆视频。

但有个问题一直困扰我:航空摄影视频的抖动非常严重。我们希望飞机主体能稳定在画面的某个位置,而不是跟着镜头乱飘。

要实现稳定,传统方案通常有两种:

  1. 前期硬件:沉重的三脚架、顶级跟拍技术和昂贵设备。
  2. 后期软件:使用达芬奇、AE 等专业软件。

后处理软件的使用门槛很高,而且有一个致命缺陷:人工参与度太高。典型流程是先在飞机上选一个跟踪点,跟踪失败后暂停并重新选点,再失败就继续重复。选点的技巧也很关键:选在机身边缘容易丢,选在机翼上可能跟踪不稳。

看完航展后我就在想:这个问题能不能用算法自动解决? 后来写了 demo 验证,才发现专业软件已经可以做这件事。但它们的交互方式让我继续思考:能不能做一个更自动化、更垂直的工具?

演示视频

软件使用演示

如果播放器无法加载,也可以直接打开 Bilibili 视频。

F-22 处理前后对比

如果播放器无法加载,也可以直接打开 Bilibili 视频。

更多作品:抖音 @AirSteady
开源代码:GitHub @ydsf16/AirSteady

技术思路:从目标跟踪到轨迹优化

稳定的本质

拍摄飞机时,我们希望飞机在画面中相对静止。

如果能稳定跟踪飞机在图像坐标系下的运动,再反向补偿这些运动,飞机在视频里看起来就是“不动”的:

稳定输出帧 = 原始帧 - 飞机运动位移

核心难点是:如何稳定地跟踪飞机的运动?

现有专业软件的方案

专业软件大概有两种思路:

方案一:单点光流跟踪

在飞机上选一个点,用 Patch Match 或 KLT 光流跟踪。问题是飞机做机动动作时,机身相对相机会发生转动,单点很容易丢失。

方案二:多点光流跟踪

在飞机上撒一堆点,用光流同时跟踪这些点,点少了就动态补点。这样鲁棒性更好,个别点丢失不会影响整体。但新的问题是:如何确保这些点只撒在飞机上,而不是背景?

我的方案:YOLO 分割 + 光流跟踪 + 图优化

我的思路是结合两者的优势:

输入视频
    ↓
YOLO 分割检测       → 获取飞机粗糙的全局坐标(bbox / mask)
    ↓
在 mask 内撒点      → GFTT 特征点提取
    ↓
KLT 光流跟踪        → 获取帧间相对位移(odom)
    ↓
PoseGraph 优化      → 全局轨迹(检测中心作为约束)
    ↓
输出平滑轨迹 → 反向补偿 → 稳定视频

核心思想是:

  • 光流跟踪:提供帧间位移,类似 SLAM 中的 odom。
  • YOLO 检测中心:提供全局位置约束,类似 SLAM 中的 loop closure。
  • 图优化:用稀疏最小二乘法融合两者,输出全局不漂移的轨迹。

有了这条轨迹,就可以反向平移图像,实现视频稳定。通过设置平滑系数,还能控制“跟随”和“稳定”之间的权衡。

实现细节与待解决问题

1. 单个飞机跟踪 ✅

单个目标场景相对简单,对飞机持续跟踪并进行补偿即可。当前代码已实现,效果稳定。

2. 多个飞机怎么办? 🔧

如果是编队飞行,用户可能想跟踪不同的飞机,例如在长机和僚机之间切换。

计划包括:

  • 通过 UI 让用户选择不同时刻要跟踪的主体。
  • 后台使用最小二乘法平滑轨迹切换。
  • 支持“多目标锁定”,由用户指定优先级。

这些功能仍待实现,欢迎有兴趣的同学一起参与。

3. YOLO 模型需要微调 🔧

现有 COCO 预训练模型对飞机的识别效果一般,尤其是在远距离小目标、云层或地面等复杂背景,以及侧视、俯视等特殊角度下。

后续计划:

  • 收集航空、航模和打鸟视频数据集。
  • 微调 YOLO 模型。
  • 支持用户自定义模型。

4. 稳定与裁切的矛盾 🔧

这是一个经典问题:

  • 稳定度越高,图像位移越大。
  • 保持无黑边,就需要更大裁切。

专业软件通常使用关键帧方案:不同帧在不同位置做不同的缩放和平移,动态调整裁切区域,在稳定性和视野之间取得平衡。如何把这套能力集成到 AirSteady 中,还需要继续研究。

工程挑战

多线程 Pipeline

4K 视频解码、YOLO 推理和光流跟踪都很耗时,需要设计并行流水线:

线程 1:视频解码 → 帧缓冲
线程 2:YOLO 检测(间隔 N 帧)
线程 3:KLT 光流(每帧)
线程 4:轨迹优化 + 预览渲染
线程 5:视频导出(独立 FFmpeg 进程)

当前 C++ 版本已经基本实现,但仍有优化空间。

跨平台 GPU 部署

YOLO 推理需要适配不同 GPU:

  • NVIDIA:CUDA / TensorRT
  • AMD:ROCm
  • Intel:OpenVINO
  • Apple:CoreML / Metal

当前版本使用 DirectML(Windows 通用),但性能和兼容性还有提升空间。

音视频解码性能

4K 视频解码非常消耗资源,需要优先使用 GPU 硬解(NVDEC / D3D11VA),并以 CPU 软解作为 fallback,同时注意 GPU 到 CPU 的内存拷贝开销。当前使用 FFmpeg 实现,后续还可以单独记录调优过程。

项目现状与协作邀请

目前已经完成一个可以处理基本航空摄影视频的 C++ 原型。如果你也对航空摄影、计算机视觉或开源软件有兴趣,欢迎一起参与。

当前进度

  • ✅ 视频加载与代理视频生成
  • ✅ YOLO 检测(DirectML 加速)
  • ✅ KLT 光流与 RANSAC 跟踪
  • ✅ IRLS 轨迹优化
  • ✅ 实时预览与视频导出

待完善功能

功能描述优先级
多目标跟踪算法自动跟踪多个飞机目标,支持编队飞行场景🔴 高
UI 设计逻辑用户点选目标、切换跟踪对象的交互设计🔴 高
关键帧裁切技术动态裁切平衡稳定度与视野,避免黑边🟡 中

如何参与?

对航空有热爱、对技术有热情,欢迎一起玩耍,也欢迎通过 GitHub 或私信交流。

长期愿景

  • 打造开放的航空摄影爱好者开源软件,服务更多航空爱好者。
  • 批量处理功能,拍摄一天视频后批量导入处理,第二天直接验收结果。
  • 自动跟拍云台,结合硬件实现长焦自动跟踪。

附录:技术栈一览

领域技术
UI 框架Qt6(Widgets)
语言C++17
视频处理FFmpeg(硬解)
推理后端ONNX Runtime + DirectML
目标检测YOLO Segmentation
特征跟踪OpenCV KLT 光流
轨迹优化IRLS + Huber 核
构建系统CMake + vcpkg

如果你也对航空摄影、计算机视觉和开源协作有兴趣,欢迎来聊聊。一起把这个工具做好,让拍飞机的人都能轻松获得“云台级”稳像视频。