我正在使用OpenCV/C++进行实时运动检测和物体跟踪,目前在跟踪部分遇到了困难。
我想做的事情可以用Matlab示例来说明:http://www.mathworks.de/de/help/vision/examples/motion-based-multiple-object-tracking.html(我在跟踪部分以及如何将其转换为C++/OpenCV方面遇到了麻烦)。
我的运动部分使用了OpenCV的BackgroundSubtractor MOG2,这使得可以找到轮廓并过滤掉较小的轮廓。
目前,我正在尝试使用KalmanFilter进行跟踪(类似于此处的实现),如果发现移动物体,则在每个帧中调用它并在其路径上绘制一条线。我的检测和跟踪部分大致如下:
当前问题: 我有一个场景,没有任何动态物体,然后一个物体移动进来,通过轮廓被检测到并被跟踪。随后第二个物体出现在视野中,被检测到,但跟踪器跳到了它上面,而不是继续跟踪第一个物体或者标记两个物体(我想要的)。
目前的跟踪器记录了被发现物体的x和y坐标。因此,一旦另一个物体被发现,跟踪器仍会假设它是同一个物体,只是有其他预期之外的坐标。
正如大家所见,最大的问题可能是没有“将跟踪与特定物体关联”的功能。我阅读了匈牙利算法,但不太确定如何在我的函数中实现它。
那么,有什么好的方法可以让跟踪同时适用于多个物体呢?
我的想法是,如果我能够为每个物体分配唯一的标识符,我就可以检查ID是否仍相同,如果不同,就让跟踪器知道这是一个新物体,需要单独跟踪。但我不确定这是否必要或者有用,如果需要,该如何实现。
我想做的事情可以用Matlab示例来说明:http://www.mathworks.de/de/help/vision/examples/motion-based-multiple-object-tracking.html(我在跟踪部分以及如何将其转换为C++/OpenCV方面遇到了麻烦)。
我的运动部分使用了OpenCV的BackgroundSubtractor MOG2,这使得可以找到轮廓并过滤掉较小的轮廓。
目前,我正在尝试使用KalmanFilter进行跟踪(类似于此处的实现),如果发现移动物体,则在每个帧中调用它并在其路径上绘制一条线。我的检测和跟踪部分大致如下:
BackgroundSubtractorMOG2 bg;
bg.operator()(frame, threshold);
bg.getBackgroundImage(background);
... //morphological operations to remove noise etc.
findContours(threshold, ...);
... //filtering to reject contours which are too smalle/too big
for(int i = 0; i < contours.size(); i++){
approxPolyDP(...);
boundRect = boundingRect(...);
x = boundRect.x + boundRect.width/2;
y = boundRect.y + boundRect.height/2;}
kalmanFilter.track(x,y);
kalmanFilter.draw(frame);
当前问题: 我有一个场景,没有任何动态物体,然后一个物体移动进来,通过轮廓被检测到并被跟踪。随后第二个物体出现在视野中,被检测到,但跟踪器跳到了它上面,而不是继续跟踪第一个物体或者标记两个物体(我想要的)。
目前的跟踪器记录了被发现物体的x和y坐标。因此,一旦另一个物体被发现,跟踪器仍会假设它是同一个物体,只是有其他预期之外的坐标。
正如大家所见,最大的问题可能是没有“将跟踪与特定物体关联”的功能。我阅读了匈牙利算法,但不太确定如何在我的函数中实现它。
那么,有什么好的方法可以让跟踪同时适用于多个物体呢?
我的想法是,如果我能够为每个物体分配唯一的标识符,我就可以检查ID是否仍相同,如果不同,就让跟踪器知道这是一个新物体,需要单独跟踪。但我不确定这是否必要或者有用,如果需要,该如何实现。