我有一个项目来创建一个应用程序,用户可以在其中绘制感兴趣的区域(在此示例中,围绕要跟踪的车辆的矩形),它将在录制的视频的后续帧中自动跟踪车辆.
到目前为止我使用OpenCV实现的方法如下:
(1) Get the user defined rectangle (Region of interest) from the
initial_frame
(2) Use
goodFeaturesToTrack
on the region of interest and store theinitial_features
(3) Step through next frames in the video
3.1: Get
next_frame
3.2: Call
calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts,...)
*where
prevImg
is alwaysinitial_frame
andprevPts
is alwaysinitial_featues
and each time I only update
nextImg
with the next frame of video3.3: Get Bounding Rectangle for newly found features from
nextPts
3.4: Display frame with bounding rectangle
此方法适用于50个连续帧中的大多数帧,除了几次跟踪结果如下所示:
但超过50帧,结果变得越来越不准确:
确实有意义的是,原始图像中的特征在后续帧中变得越来越不普遍,所以我正在寻找关于如何改进这种跟踪方法或者可能完全找到更好方法的想法.
已经出现的是使用卡尔曼滤波器,但是我不知道用于测量和动态参数的参数,以及如何根据光流中的特征更新测量值.
在这种应用程序中,我对任何建议甚至完全不同的对象跟踪方法持开放态度.
*注意:这个函数是我用来获取光流返回的特征数组的边界矩形(我在这里使用的是EMGUCV):
public Rectangle RectFromPoints(List<PointF> points)
{
using (MemStorage stor = new MemStorage())
{
Contour<PointF> contour = new Contour<PointF>(stor);
// Remove points far outside the major grouping of all the other points
var newPoints = RemoveOutlierPoints(points);
foreach(PointF pnt in newPoints)
{
contour.Push(pnt);
}
var contPoly = contour.ApproxPoly(3, stor);
var rect = contPoly.BoundingRectangle;
return rect;
}
}
最佳答案 尝试使用相关跟踪器.现代的很好,例如:
https://www.youtube.com/watch?v=-8-KCoOFfqs.你也可以在
dlib获得这个代码.