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

基本概念

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

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

其中是光流向量,是图像梯度,是时间梯度。

光流方法分类

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

Lucas-Kanade 算法

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

OpenCV 实现

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)

应用场景

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