OpenCV案例——光流估计

📅 2026/7/2 3:52:33
OpenCV案例——光流估计
一、项目概述光流Optical Flow用于描述图像中像素随时间的运动矢量Lucas-KanadeLK稀疏光流只跟踪图像中提取的角点特征计算速度快广泛用于视频目标跟踪、动作捕捉、运动检测等场景。 本文完整实现标准 LK 金字塔光流算法使用goodFeaturesToTrack提取 Shi-Tomasi 优质角点作为跟踪特征调用calcOpticalFlowPyrLK计算前后帧特征点运动轨迹绘制跟踪轨迹实时展示视频跟踪效果支持 ESC 键退出自动释放视频资源。二、完整可运行代码1.图像预处理读取一个视频文件2.定义特征点检测参数最大角点数量(100):取前100个可能的角点角点质量阈值(0.3):过滤掉低质量角点最小距离(7):当两个角点数量小于7则删除某一个角点3.LK光流关参数设置lk_params:定义金字塔 LK 光流calcOpticalFlowPyrLK的核心运算参数4.每一帧的处理(1)calcOpticalFlowPyrLK函数calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts, winSizeNone, maxLevelNone)prevImg前一帧nextImg当前帧prevPts前一帧特征坐标nextPts当前帧特征坐标winSize每一层的匹配窗口maxLevel金字塔最大层数返回值:p1:在当前帧中估计出的特征点坐标 status: 一个与prevPts一样大小的状态向量用于表示特征点是否被成功跟踪到。 err: 一个prevPts样大小的误差向量用于表示估计误差2p0上一帧所有提取到的角点坐标形状为(N, x, y)N是特征点总数存储格式[[x,y]]。 代表前一帧原始待跟踪特征点。p1calcOpticalFlowPyrLK输出的、算法预测出的当前帧对应特征点坐标维度和p0完全一致(N, x, y)。st[i] 1第 i 个特征点跟踪成功在当前帧匹配到了对应位置st[i] 0第 i 个特征点跟踪丢失物体移出画面、模糊、遮挡、位移过大匹配失败。good_new p1[st 1]保留当前帧匹配成功的点good_old p0[st 1]同步保留上一帧对应的匹配点3mask三通道黑色画布专门存放运动轨迹4把当前帧跟踪成功的点good_new赋值给p0作为下一帧的初始跟踪特征点