OpenCV案例——光流估计

OpenCV案例——光流估计

一、项目概述

光流(Optical Flow)用于描述图像中像素随时间的运动矢量,Lucas-Kanade(LK)稀疏光流只跟踪图像中提取的角点特征,计算速度快,广泛用于视频目标跟踪、动作捕捉、运动检测等场景。 本文完整实现标准 LK 金字塔光流算法:

  1. 使用goodFeaturesToTrack提取 Shi-Tomasi 优质角点作为跟踪特征;
  2. 调用calcOpticalFlowPyrLK计算前后帧特征点运动轨迹;
  3. 绘制跟踪轨迹,实时展示视频跟踪效果;
  4. 支持 ESC 键退出,自动释放视频资源。

二、完整可运行代码

1.图像预处理,读取一个视频文件

2.定义特征点检测参数

最大角点数量(100):取前100个可能的角点

角点质量阈值(0.3):过滤掉低质量角点

最小距离(7):当两个角点数量小于7,则删除某一个角点

3.LK光流关参数设置

lk_params:定义金字塔 LK 光流calcOpticalFlowPyrLK的核心运算参数

4.每一帧的处理

(1)calcOpticalFlowPyrLK函数:calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts, winSize=None, maxLevel=None)

prevImg:前一帧

nextImg:当前帧

prevPts:前一帧特征坐标

nextPts:当前帧特征坐标

winSize:每一层的匹配窗口

maxLevel:金字塔最大层数

返回值:

p1:在当前帧中估计出的特征点坐标 status: 一个与prevPts一样大小的状态向量,用于表示特征点是否被成功跟踪到。 err: 一个prevPts样大小的误差向量,用于表示估计误差

(2)

p0:上一帧所有提取到的角点坐标,形状为(N, x, y)N是特征点总数,存储格式[[x,y]]。 代表前一帧原始待跟踪特征点。

p1:calcOpticalFlowPyrLK输出的、算法预测出的当前帧对应特征点坐标,维度和p0完全一致(N, x, y)

st[i] = 1:第 i 个特征点跟踪成功,在当前帧匹配到了对应位置;

st[i] = 0:第 i 个特征点跟踪丢失(物体移出画面、模糊、遮挡、位移过大匹配失败)。

good_new = p1[st == 1]:保留当前帧匹配成功的点;

good_old = p0[st == 1]:同步保留上一帧对应的匹配点;

(3)

mask:三通道黑色画布,专门存放运动轨迹

(4)

把当前帧跟踪成功的点good_new赋值给p0,作为下一帧的初始跟踪特征点