跟踪运动目标
Posted KAVEI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了跟踪运动目标相关的知识,希望对你有一定的参考价值。
视频序列显示的是运动中的场景和物体,非常有趣。上一章介绍了读取、处理和存储视频的
工具,本章将介绍几种跟踪图像序列中运动物体的算法。之所以能产生这种可见运动或表观运动,
是因为物体以不同的速度在不同的方向上移动,或者是因为相机在移动(或者两者都有)
在很多应用程序中,跟踪表观运动都是极其重要的。它可用来追踪运动中的物体,以测定它
们的速度、判断它们的目的地。对于手持摄像机拍摄的视频,可以用这种方法消除抖动或减小抖
动幅度,使视频更加平稳。运动估值还可用于视频编码,用以压缩视频,便于传输和存储。本章
将介绍几种在图像序列中跟踪运动物体的算法,被跟踪的运动可以是稀疏的(图像的少数位置上
有运动,称为稀疏运动),也可以是稠密的(图像的每个像素都有运动,称为稠密运动)
跟踪视频中的特征点
从前面章节介绍的内容可以看出,根据特殊的点分析图像,可以使计算机视觉算法更加实
高效。对于图像序列也是如此,通过分析特征点的运动,可以判断场景中各种物体的运动情况
节将通过跟踪在多个帧之间移动的特征点,对图像序列进行时序分析。
实现原理
要逐帧地跟踪特征点,就必须在后续帧中定位特征点的新位置。假设每个帧中特征点的强度
值是不变的,这个过程就是寻找如下的位移(u,v):
in(x,y)=(in+1(x+u,y+v)
其中in和in+1分别是当前帧和下一个瞬间的帧。强度值不变的假设普遍适用于相邻图像上的
微小位移。我们可使用泰勒展开式得到近似方程式(包含图像导数)
Lt+1(x+u,y+v)≈it(x,y)+泰勒展开
根据第二个方程式,可以得到另一个方程式(根据强度值不变的假设,去掉了两个表示强度
值的项)
这就是基本的光流约束方程,也称作亮度恒定方程。
Lukas- Kanade特征跟踪算法使用了这个约束方程。除此之外,该算法还做了一个假设,即
特征点邻域中所有点的位移量是相等的。因此,我们可以将光流约束应用到所有位移量为(u,y
的点(u和v还是未知的)。这样就得到了更多的方程式,数量超过未知数的个数(两个,因此
可以在均方意义下解出这个方程组。在实际应用中,我们采用迭代的方法来求解。为了使搜索更
高效且适应更大的位移量, OpenCV还提供了在不同分辨率下进行计算的方法。默认的图像等级
数量为3,窗口大小为15;当然,这些参数是可以修改的。你还可以设定一个终止条件,符合这
个条件时就停止迭代搜索。cv:: calcopticalF1 owPyrLK函数的第六个参数是剩余均方误差,
用于评定跟踪的质量。第五个参数包含二值标志,表示是否成功跟踪了对应的点。
这些就是 Lukas- Kanade跟踪算法的基本规则。具体实现时还做了优化和改进,使该算法在
计算大量特征点的位移时更加高效。
void cv::calcOpticalFlowPyrLK ( InputArray prevImg,//buildOpticalFlowPyramid构造的第一个8位输入图像或金字塔。 InputArray nextImg,//与prevImg相同大小和相同类型的第二个输入图像或金字塔 InputArray prevPts,//需要找到流的2D点的矢量(vector of 2D points for which the flow needs to be found;);点坐标必须是单精度浮点数。 InputOutputArray nextPts,//输出二维点的矢量(具有单精度浮点坐标),包含第二图像中输入特征的计算新位置;当传递OPTFLOW_USE_INITIAL_FLOW标志时,向量必须与输入中的大小相同。 OutputArray status,//输出状态向量(无符号字符);如果找到相应特征的流,则向量的每个元素设置为1,否则设置为0。 OutputArray err,//输出错误的矢量; 向量的每个元素都设置为相应特征的错误,错误度量的类型可以在flags参数中设置; 如果未找到流,则未定义错误(使用status参数查找此类情况)。 Size winSize = Size(21, 21),//每个金字塔等级的搜索窗口的winSize大小。 int maxLevel = 3,//基于0的最大金字塔等级数;如果设置为0,则不使用金字塔(单级),如果设置为1,则使用两个级别,依此类推;如果将金字塔传递给输入,那么算法将使用与金字塔一样多的级别,但不超过maxLevel。 TermCriteria criteria = TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01),//参数,指定迭代搜索算法的终止条件(在指定的最大迭代次数criteria.maxCount之后或当搜索窗口移动小于criteria.epsilon时)。 int flags = 0,//flags :操作标志: OPTFLOW_USE_INITIAL_FLOW使用初始估计,存储在nextPts中;如果未设置标志,则将prevPts复制到nextPts并将其视为初始估计。 OPTFLOW_LK_GET_MIN_EIGENVALS使用最小特征值作为误差测量(参见minEigThreshold描述);如果没有设置标志,则将原稿周围的色块和移动点之间的L1距离除以窗口中的像素数,用作误差测量。 double minEigThreshold = 1e-4 //算法计算光流方程的2x2正常矩阵的最小特征值,除以窗口中的像素数;如果此值小于minEigThreshold,则过滤掉相应的功能并且不处理其流程,因此它允许删除坏点并获得性能提升。 )
对 TermCriteria的解释:Opencv里面的TermCriteria对象解释_虾米ning的博客-CSDN博客
lucas——kanade特征跟踪算法
1.亮度恒定,即图像场景中目标的像素在帧间运动时外观上保持不变;
2.时间连续或者运动是”小运动“,即图像的运动随时间的变化比较缓慢;
3.空间一致,即一个场景中同一表面上邻近的点具有相似的运动。然而,对于大多数30HZ的摄像机,大而连贯的运动是普遍存在的情况,所以LK光流正因为这个原因在实际中的跟踪效果并不是很好。我们需要大的窗口来捕获大的运动,而大窗口往往违背运动连贯的假设!而图像金字塔可以解决这个问题,于是乎,金字塔Lucas-Kanade就提出来了。
详细讲解:opencv中CalcOpticalFlowPyrLK实现的光流法理解_AP1005834的博客-CSDN博客
以上是关于跟踪运动目标的主要内容,如果未能解决你的问题,请参考以下文章
# 粒子滤波 PF——三维匀速运动CV目标跟踪(粒子滤波VS扩展卡尔曼滤波)
# 粒子滤波 PF——三维匀速运动CV目标跟踪(粒子滤波VS扩展卡尔曼滤波)
# 粒子滤波 PF——三维匀速运动CV目标跟踪(粒子滤波VS扩展卡尔曼滤波)