张芷铭的个人博客

光流(Optical Flow)是像素在图像平面上的瞬时运动速度,用于运动估计、目标跟踪、视频稳像等任务。

基本概念

光流假设像素亮度在短时间内恒定:

$$I(x, y, t) = I(x + dx, y + dy, t + dt)$$

泰勒展开后得到光流约束方程

$$I_x u + I_y v + I_t = 0$$

其中$(u, v)$是光流向量,$(I_x, I_y)$是图像梯度,$I_t$是时间梯度。

光流方法分类

类型方法特点
稀疏光流Lucas-Kanade角点追踪,计算快
稠密光流Horn-Schunck, FlowNet逐像素估计,计算量大
深度学习方法RAFT, PWC-Net精度高,端到端训练

Lucas-Kanade 算法

假设局部窗口内光流恒定,通过最小二乘求解:

$$\begin{bmatrix} u \ v \end{bmatrix} = \begin{bmatrix} \sum I_x^2 & \sum I_x I_y \ \sum I_x I_y & \sum I_y^2 \end{bmatrix}^{-1} \begin{bmatrix} -\sum I_x I_t \ -\sum I_y I_t \end{bmatrix}$$

OpenCV 实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import cv2
import numpy as np

# 角点检测
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)
corners = cv2.goodFeaturesToTrack(prev_gray, maxCorners=100, qualityLevel=0.3, minDistance=7)

# 计算光流
next_gray = cv2.cvtColor(next_frame, cv2.COLOR_BGR2GRAY)
next_pts, status, _ = cv2.calcOpticalFlowPyrLK(prev_gray, next_gray, corners, None)

应用场景

  • 目标跟踪:追踪特征点运动轨迹
  • 动作识别:光流场作为时序特征
  • 视频稳像:估计相机运动进行补偿
  • 自动驾驶:检测运动物体、估计深度

Comments