NOTE / 2026/9/26
如何用 YOLO + SLAM 思想做一个航空稳拍工具
给拍飞机、航模、打鸟的人:让长焦手抖、主体乱飘的视频变得“像有云台一样好看”。
动机:一个航空爱好者的痛点
我是一个航空爱好者,经常去各地看航空展——珠海航展、长春空军开放日、新加坡航展……每次都会拍一堆视频。
但有个问题一直困扰我:航空摄影视频的抖动非常严重。我们希望飞机主体能稳定在画面的某个位置,而不是跟着镜头乱飘。
要实现稳定,传统方案通常有两种:
- 前期硬件:沉重的三脚架、顶级跟拍技术和昂贵设备。
- 后期软件:使用达芬奇、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 |
如果你也对航空摄影、计算机视觉和开源协作有兴趣,欢迎来聊聊。一起把这个工具做好,让拍飞机的人都能轻松获得“云台级”稳像视频。