我有一个项目来创建一个应用程序,用户可以在其中绘制感兴趣的区域(在此示例中,围绕要跟踪的车辆的矩形),它将在录制的视频的后续帧中自动跟踪车辆。 / p>
到目前为止,我使用OpenCV实现的方法如下:
(1)从
initial_frame
获取用户定义的矩形(感兴趣的区域)(2)在感兴趣的区域使用
goodFeaturesToTrack
并存储initial_features
(3)逐步浏览视频
中的下一帧3.1:获取
next_frame
3.2:致电
calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts,...)
*其中{{1} }始终为
prevImg
,initial_frame
始终为prevPts
initial_featues
,每次我只用下一帧视频更新
nextImg
3.3:从
nextPts
获取新发现的要素的边界矩形3.4:显示带有边界矩形的框架
这种方法适用于50个连续帧中的大多数帧,除了跟踪结果的几次之外:
但超过50帧,结果变得越来越不准确:
原始图像中的特征在后续帧中变得越来越不普遍,这是有道理的,所以我正在寻找关于如何改进这种跟踪方法或者可能完全找到更好方法的想法。
已经出现的是使用卡尔曼滤波器,但是我不知道用于测量和动态参数的参数,以及如何根据光流中的特征更新测量值。 在这种应用程序中,我对任何建议甚至完全不同的对象跟踪方法持开放态度。
*注意:这个函数是用来获取光流返回的特征数组的边界矩形(我在这里使用的是EMGUCV):
答案 0 :(得分:1)
尝试使用相关跟踪器。现代的很好,例如:https://www.youtube.com/watch?v=-8-KCoOFfqs。您还可以在dlib中获取此代码。
答案 1 :(得分:1)
OpenCV 3.0 contrib有几个跟踪器(TLD,MEDIANFLOW,BOOSTING和MIL)。您也可以找到CPP示例。 VOT挑战页面提供了性能比较状态跟踪器。
答案 2 :(得分:0)
美好的一天。 你有什么是漂移问题。 您第一次使用的功能仅适用于对象。 但是当新框架更新旧模板时,背景杂乱的某些部分包含在图像中作为新模板。您需要使用类似的模板更新模板,并且有像BMR调整这样的算法。