一句话定义:光流就是给视频中每个像素算出一个运动矢量——它从这一帧的哪个位置来、要往下一帧的哪个位置去。
它是怎么来的
先打个比方。想象你从高处俯拍一个广场,把视频按下暂停,再按下一帧。广场上的人各自往不同方向走。光流做的事,就是给画面里每一个人(严格说是每一个像素)头上画一支箭头:箭头指向哪,他就往哪走;箭头多长,他就走多快。整张画面画满箭头,就是一幅“运动地图”。
技术上,它输出的是一张和图像同样大小的向量场:每个像素配一对数值,表示横向和纵向的位移量,有的方法还会附带一个置信度或遮挡标记。
算法靠什么算出来?经典做法基于“亮度恒定”假说:同一个物理小点在前后两帧里看起来亮度差不多,只是位置挪了。于是就在每个像素周围开一个小窗口,去下一帧里找“哪块最像”,把位移解出来。这是 Lucas-Kanade、Horn-Schunck 等经典方法的思路。如今更多用神经网络端到端预测,比如 FlowNet、RAFT 这一类方法,能在弱纹理和大位移场景下给出更稳的结果。
别和邻居搞混
| 概念 | 输出什么 | 回答的问题 |
|---|---|---|
| 帧间差分 | 一张差值图 | 哪些像素变了 |
| 光流 | 每个像素的位移向量 | 每个像素挪了多少、往哪挪 |
| 目标检测/跟踪 | 框、类别、ID | 这是什么、在哪、是不是同一个 |
| 场景流 | 每个点的三维运动 | 在真实世界里怎么动 |
两个关键区别要记住。第一,光流不认识“物体”,它只谈像素,不给你“车”或“人”这种标签。第二,光流是画面上的表观运动:你把镜头往右一摇,静止的墙也会产生满屏向左的光流。它不等于真实世界的物理速度——那要靠场景流(Scene Flow),比光流多一个深度方向的分量。
为什么值得关心
视频插帧和生成:要把 A 帧平滑过渡到 B 帧,先知道每个像素怎么动,补出来的中间帧才不糊、不抖。今天手机里的慢动作补帧、视频防抖,底层都有它的影子。
自动驾驶:自车在动,画面里所有东西看起来都在动。用光流可以区分“路边静止的树”和“迎面开来的车”,估计相对运动,进而估算碰撞时间。这类场合通常还会把它和语义分割、深度估计结合起来用。
它的短板也很明确:大位移、弱纹理(比如白墙)、运动遮挡、光照突变这几类情况最容易出错,所以工程上常用多尺度、迭代优化或与其他模态互补的方式兜底。
对普通职场人一句话总结:凡是涉及“视频里东西动得快不快、往哪动、能不能补得顺”的任务,光流都是那个便宜又稠密的运动先验。具体工具的接口和算法清单,以官方文档页面为准。
