如何在失去目标时重置或更新KCF跟踪器ROI

时间:2016-11-05 21:30:14

标签: c++ opencv tracking

我正在使用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

1 个答案:

答案 0 :(得分:0)

你可以多指一点吗?
a)您要删除整个跟踪器
b)如果跟踪器上没有更新,您只是不想打印矩形

如果对象返回(在同一位置返回或在旧退出位置旁边的另一个位置返回),我不确定跟踪器是否会再次工作,但我认为最简单的显示解决方案是:< / p>

创建一个变量来计算tracker->update(frame, roi)返回false的步数,并在tracker->update(frame, roi)返回true时将其设置为0。超过一定数量(阈值)rectangle(frame, roi, Scalar(255, 0, 0), 2, 1)不应该被调用,或者你可以删除跟踪器/打破循环(就像我之前所说的,我不确定它是否会再次工作,此外跟踪器使用主动学习 - 它学习每一步:虚假训练样本都会导致错误行为)

fyi-&gt;原始论文:http://www.robots.ox.ac.uk/~joao/publications/henriques_eccv2012.pdf