光流(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)应用场景
- 目标跟踪:追踪特征点运动轨迹
- 动作识别:光流场作为时序特征
- 视频稳像:估计相机运动进行补偿
- 自动驾驶:检测运动物体、估计深度