【发布时间】:2014-12-09 09:23:39
【问题描述】:
我正在使用 OpenCV/C++ 进行实时运动检测和对象跟踪,目前卡在跟踪部分。
Matlab-我想做的示例:http://www.mathworks.de/de/help/vision/examples/motion-based-multiple-object-tracking.html(我对跟踪部分以及如何将其传输到 C++/OpenCV 感到困扰)
我的运动部分与 OpenCVs BackgroundSubtractor MOG2 配合使用,可以找到轮廓并过滤掉较小的轮廓。
为了跟踪,我目前正在尝试使用 KalmanFilter(与this 具有类似的实现),如果找到移动对象并在其路径上绘制一条线,则现在在每一帧中都会调用它。 我的检测和跟踪部分如下所示:
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 是否仍然相同,如果不是,让跟踪器知道它是一个新对象与另一个分开跟踪。不确定这是否有必要或什至有用,如果有,该怎么做。
【问题讨论】:
-
你能画一张图并在里面标记一些cmets来解释你的问题吗?分配个人 ID 没问题,但我猜你的问题是帧之间的轮廓/对象的注册?!?
-
编辑了问题并进一步解释了问题。希望它使它更容易理解。
-
如果你不发布你的代码很难提供帮助......我猜你正在使用“检测跟踪”?所以你用背景减法“检测”并且你只使用跟踪来“平滑”运动?您将需要使用一些真实的跟踪,其中跟踪本身识别目标的位置,独立于新目标的检测。如果你真的想使用简单的检测跟踪,你首先要对每一帧中的每个检测进行聚类(例如,检测到的对象与上一帧中最短距离的对象相同,你为每个对象创建一个跟踪器)跨度>
-
在我搜索更多内容时再次编辑了问题。还输入一些代码来解释我的运动检测部分和卡尔曼跟踪算法。我想检测移动物体(我已经这样做了),然后进一步跟踪它们,例如用不同颜色的边界框标记它们,可能还有一个数字。请参阅我发布的示例链接,其中在 Matlab 中完成了完全相同的操作。是的,您的最后一句话可能是如何完成的(使用某种方式通过距离计算最佳匹配)。我很想有一个 c++/opencv 示例,看看我如何将它放入我的代码中。
-
什么是boundingRect?单个轮廓或所有轮廓的 bb 的边界框?!?你只对最后一个轮廓使用卡尔曼滤波器吗?!?
标签: c++ opencv matlab-cvst kalman-filter video-tracking