我正在使用KCF跟踪算法,我的问题是当目标从窗口退出时,跟踪器不会重置并错误地在窗口边缘显示矩形。在理想状态下,跟踪器应在失去目标后删除矩形。
这些是我的代码:
int main(int argc, char** argv) {
Rect2d roi;
Mat frame;
// create a tracker object
Ptr<Tracker> tracker = Tracker::create("KCF");
VideoCapture cap("C2_0002.mp4");
cap >> frame;
resize(frame, frame, Size(frame.cols / 2, frame.rows / 2));
roi = selectROI("tracker", frame);
//quit if ROI was not selected
if (roi.width == 0 || roi.height == 0)
return 0;
// initialize the tracker
tracker->init(frame, roi);
// perform the tracking process
printf("Start the tracking process, press ESC to quit.\n");
for (;; ) {
// get frame from the video
cap >> frame;
resize(frame, frame, Size(frame.cols / 2, frame.rows / 2));
// stop the program if no more images
if (frame.rows == 0 || frame.cols == 0)
break;
// update the tracking result
tracker->update(frame, roi);
rectangle(frame, roi, Scalar(255, 0, 0), 2, 1);
imshow("tracker", frame);
if (waitKey(1) == 27)break;
}
}
另外,您还可以观看我的模拟视频的简短视频,并查看问题所在:
http://www.0up.ir/do.php?downf=4_e2aa9.mp4
最佳答案
您可以指定更多吗?
a)您要删除整个跟踪器
b)如果跟踪器上没有更新,您只是不想打印矩形
我不确定如果对象返回(返回到原位置或旧退出位置旁边的另一个位置),跟踪器是否会再次工作,但是我认为显示的最简单解决方案是:
创建一个变量来计算tracker->update(frame, roi)
返回false
的步骤,如果tracker->update(frame, roi)
返回true
,则将其设置为0。在一定数量(阈值)以上,不应调用rectangle(frame, roi, Scalar(255, 0, 0), 2, 1)
,否则您可以删除跟踪器/破坏循环(就像我之前说的那样,我不确定它是否会再次起作用,另外,跟踪器使用主动学习-它会逐步学习:错误的训练样本将导致错误的行为)
fyi->原始文件:http://www.robots.ox.ac.uk/~joao/publications/henriques_eccv2012.pdf)