光流与视频运动分析

进阶05-视频与跟踪预计 30 分钟光流Lucas-Kanade运动分析孔径问题

前置知识点

kp-003 边缘检测:从 Sobel 到 Canny

一句话定义

光流为图像中每个像素(或选定点)估计帧间的表观运动向量 (u, v),其求解依赖亮度恒常假设,得到一元约束方程后需借助局部平滑或全局正则才能解出。

为什么重要

光流是把「图像序列」变成「运动场」的最基本工具:SLAM 前端用稀疏光流跟踪特征点(省去重复描述子匹配)、视频编码与插帧用稠密光流做运动补偿、动作识别用光流通道编码运动信息;「亮度恒常 + 孔径问题」也是理解一切表观运动估计局限性的钥匙。

直观类比

用手机连拍行驶中的列车:每一帧里车窗比上一帧右移了几个像素——这串位移向量就是光流;但如果只在车窗内部看(孔径内全是均匀玻璃),你无法判断它是在平移还是在旋转,必须扩大观察窗口或借助邻域一致性——这就是孔径问题。

前置知识

kp-003(梯度估计);库外泰勒展开与最小二乘。

核心概念

原理与机制

对 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

图示

斜条纹 + 观察窗 窗内只能确定垂直于条纹的运动分量 → 约束方程 1 个、未知数 2 个(孔径问题) LK:窗口内假设运动一致,最小二乘联合求解 运动大时用金字塔由粗到精 好跟踪的点 = 结构张量两大特征值 = 好 Harris 角点

实例与案例

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 表示跟踪成功

常见误区

与其他知识点的关系

约束方程的原料是 kp-003 的梯度;LK 的可解条件即 kp-006 的角点准则;稀疏光流是 kp-023/KCF、kp-014 SLAM 前端的底层引擎。

自测题

  1. 为什么光流约束方程解不唯一?

答案要点:单点邻域只约束沿梯度 (Ix, Iy) 方向的分量,切向分量自由(孔径问题),需窗口内一致性或平滑正则。

  1. LK 何时退化?与 Harris 有何联系?

答案要点:AᵀA(结构张量)特征值小时退化(平坦/单向边缘);两大特征值即 Harris 意义下的角点。

  1. 金字塔 LK 解决什么问题?

答案要点:大位移下一阶泰勒失效;低分辨率层上位移相对变小,由粗到精逐层估计残差扩大可跟踪范围。

延伸阅读

相关知识点

kp-023 单目标跟踪:相关滤波与 Siamesekp-024 多目标跟踪:SORT/DeepSORT 与轨迹管理