这篇文章主要为大家详细介绍了OpenCV如何使用稀疏光流实现视频对象跟踪功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
1、概述
案例:使用稀疏光流实现对象跟踪
稀疏光流API介绍:
- prevImg:视频前一帧图像/金字塔,单通道CV_8UC1
- nextImg:视频后一帧图像/金字塔,单通道CV_8UC1
- preVPts:前一帧图像的特征向量(输入)需要找到流的2D点的矢量(vector of 2D points for which the flow needs to be found;);点坐标必须是单精度浮点数
- nextPts:后一帧图像的特征向量(输出),输出二维点的矢量(具有单精度浮点坐标),包含第二图像中输入特征的计算新位置;当传递OPTFLOW_USE_INITIAL_FLOW标志时,向量必须与输入中的大小相同。
- status:输出状态向量(无符号字符);如果找到相应特征的流,则向量的每个元素设置为1,否则设置为0
- err:输出错误的矢量; 向量的每个元素都设置为相应特征的错误,错误度量的类型可以在flags参数中设置; 如果未找到流,则未定义错误(使用status参数查找此类情况)
- winSize:每个金字塔等级的搜索窗口的winSize大小
- maxLevel:基于0的最大金字塔等级数;如果设置为0,则不使用金字塔(单级),如果设置为1,则使用两个级别,依此类推;如果将金字塔传递给输入,那么算法将使用与金字塔一样多的级别,但不超过maxLevel
- criteria:停止条件,指定迭代搜索算法的终止条件(在指定的最大迭代次数criteria.maxCount之后或当搜索窗口移动小于criteria.epsilon时)。
- flags:操作标志,OPTFLOW_USE_INITIAL_FLOW使用初始估计,存储在nextPts中;如果未设置标志,则将prevPts复制到nextPts并将其视为初始估计。
- OPTFLOW_LK_GET_MIN_EIGENVALS使用最小特征值作为误差测量(参见minEigThreshold描述);如果没有设置标志,则将原稿周围的色块和移动点之间的L1距离除以窗口中的像素数,用作误差测量
- minEigThreshold:算法计算光流方程的2x2正常矩阵的最小特征值,除以窗口中的像素数;如果此值小于minEigThreshold,则过滤掉相应的功能并且不处理其流程,因此它允许删除坏点并获得性能提升
算法实现步骤:
1.实例化VideoCapture
2.循环读取视频数据
3.视频帧灰度转换
4.执行角点检测
5.保存角点检测的特征数据
6.初始化时如果检测到前一帧为空,把当前帧的灰度图像给前一帧
7.执行光流跟踪,并输出跟踪后的特征向量
8.遍历光流跟踪的输出特征向量,并得到距离和状态都符合预期的特征向量。让后将其重新填充到fpts[1]中备用
9.重置集合大小
10.绘制光流线
11.交换特征向量的输入和输出
12.将用于跟踪的角点绘制出来
13.展示最终的跟踪效果
14.循环3~13步骤
15.结束
2、代码示例
3、图像演示
到此这篇关于OpenCV使用稀疏光流实现视频对象跟踪的方法详解的文章就介绍到这了,更多相关OpenCV视频对象跟踪内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!