一句话定义
光流为图像中每个像素(或选定点)估计帧间的表观运动向量 (u, v),其求解依赖亮度恒常假设,得到一元约束方程后需借助局部平滑或全局正则才能解出。
为什么重要
光流是把「图像序列」变成「运动场」的最基本工具:SLAM 前端用稀疏光流跟踪特征点(省去重复描述子匹配)、视频编码与插帧用稠密光流做运动补偿、动作识别用光流通道编码运动信息;「亮度恒常 + 孔径问题」也是理解一切表观运动估计局限性的钥匙。
直观类比
用手机连拍行驶中的列车:每一帧里车窗比上一帧右移了几个像素——这串位移向量就是光流;但如果只在车窗内部看(孔径内全是均匀玻璃),你无法判断它是在平移还是在旋转,必须扩大观察窗口或借助邻域一致性——这就是孔径问题。
前置知识
kp-003(梯度估计);库外泰勒展开与最小二乘。
核心概念
- 亮度恒常假设(Brightness Constancy):同一物理点在相邻帧亮度不变。
- 光流约束方程:亮度恒常的一阶泰勒形式,一个方程两个未知数。
- 孔径问题(Aperture Problem):单点邻域只能确定沿梯度方向的运动分量。
- Lucas-Kanade(LK):假设小窗口内运动一致,用最小二乘联合求解,需特征点处梯度矩阵可逆。
- 金字塔 LK:由粗到精逐层估计,扩大可处理的运动范围。
- 稠密光流:Horn-Schunck 加全局平滑正则;深度方法 FlowNet/PWC-Net 学习两帧间的对应场。
- 表观运动 vs 真实运动:光照变化、反射、遮挡都会让表观运动偏离真实 3D 运动。
原理与机制
对 I(x+u, y+v, t+1) = I(x, y, t) 做一阶泰勒展开得约束方程 Ix·u + Iy·v + It = 0——一个方程、两个未知数,解不确定(孔径问题)。LK 的做法是在邻域窗口内假设 (u, v) 一致,得到超定线性方程组 A·d = b,最小二乘解为 (AᵀA)⁻¹Aᵀb;其可解条件正是 kp-006 的结构张量两个特征值都大——好跟踪的点就是好角点,两站由此打通。运动大时一阶展开失效,金字塔 LK 先在低分辨率层估大位移、逐层细化残差。稠密方法在约束方程外再加平滑项最小化能量泛函;深度网络则把光流当作两帧之间的逐像素回归问题端到端学习,配合合成数据(有精确真值)取得主导地位。
公式与模型
I(x + u, y + v, t + 1) = I(x, y, t)
→ Ix·u + Iy·v + It = 0 (光流约束方程)
LK: min Σ_{W} ( Ix·u + Iy·v + It )²
→ [u, v]ᵀ = ( AᵀA )⁻¹ Aᵀb,A 每行为 [Ix, Iy],b 每行 −It
Horn-Schunck: min ∫ (‖∇u,∇v‖² + λ(Ix·u + Iy·v + It)²) dxdy图示
实例与案例
SLAM 前端:对 kp-006 选出的特征点跑金字塔 LK,逐帧跟踪省去每帧描述子匹配,是 VIO 系统的高频操作。视频插帧与慢动作:双向稠密光流把中间帧由相邻两帧 warp 融合生成。动作识别:双流网络把光流作为「运动流」输入通道;近年用 RGB 差分替代以省去光流计算成本。交通监控:光流矢量图直接可视化车流速度场。
import cv2
pts, st, err = cv2.calcOpticalFlowPyrLK(prev_gray, gray, prev_pts, None,
winSize=(21, 21), maxLevel=3,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 30, 0.01))
good_new = pts[st == 1] # st==1 表示跟踪成功常见误区
- 把光流当真实运动场:光照突变、镜面反射都会产生表观运动;光流是「亮度的运动」不是「物体的运动」。
- 大位移直接跑 LK:位移超过约一个金字塔层可处理范围就会跟丢,必须由粗到精或加大层数。
- 忽略跟踪点质量维护:跟踪点会漂移与退化,需周期性用角点质量重新筛选补充。
- 真值评估想当然:真实场景无稠密运动真值,评测依赖合成数据集(MPI-Sintel 等),跨域到真实视频性能会显著下降。
与其他知识点的关系
约束方程的原料是 kp-003 的梯度;LK 的可解条件即 kp-006 的角点准则;稀疏光流是 kp-023/KCF、kp-014 SLAM 前端的底层引擎。
自测题
- 为什么光流约束方程解不唯一?
答案要点:单点邻域只约束沿梯度 (Ix, Iy) 方向的分量,切向分量自由(孔径问题),需窗口内一致性或平滑正则。
- LK 何时退化?与 Harris 有何联系?
答案要点:AᵀA(结构张量)特征值小时退化(平坦/单向边缘);两大特征值即 Harris 意义下的角点。
- 金字塔 LK 解决什么问题?
答案要点:大位移下一阶泰勒失效;低分辨率层上位移相对变小,由粗到精逐层估计残差扩大可跟踪范围。
延伸阅读
- Horn 与 Schunck 1981《Determining Optical Flow》
- kp-023 看光流跟踪如何长成完整的单目标跟踪器