我正在使用 OpenCV/C++ 进行实时运动检测和对象跟踪,目前卡在跟踪部分。
Matlab-我想做的示例:http: //www.mathworks.de/de/help/vision/examples/motion-based-multiple-object-tracking.html(我对跟踪部分以及如何将其转移到 C++/OpenCV)
我的运动部分与 OpenCVs 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);
当前问题: 我有一个有 0 个移动物体的场景,然后有 1 个物体移动,通过轮廓检测并被跟踪。然后第二个物体在视线中移动,被检测到并使跟踪器跳转到它,而不是跟随第一个物体或单独标记两者(我想要)。
当前跟踪器获取找到对象的 x 和 y 坐标。像这样,一旦检测到另一个物体,跟踪器仍会假设它是同一个物体,但坐标与预期不同。
可以看出,没有将“轨道”分配给某个对象的功能,这可能是最大的问题。我阅读了有关匈牙利算法的信息,但不太确定如何在我的函数中实现它。
使跟踪对多个对象起作用的好方法是什么?
我的想法是,如果我对每个对象进行了唯一标识,我可以检查 ID 是否仍然相同,如果不是,则让跟踪器知道它是一个新对象,可以单独跟踪。不确定这是否有必要甚至有用,如果是的话,该怎么做。