C++ 当失去目标时,如何重置或更新KCF跟踪器ROI

C++ 当失去目标时,如何重置或更新KCF跟踪器ROI,c++,opencv,tracking,C++,Opencv,Tracking,我使用的是KCF跟踪算法,我的问题是当目标从窗口退出时,跟踪器不会重置并错误地在窗口边缘显示它的矩形。在理想状态下,当矩形失去目标时,跟踪器应该删除矩形 这是我的密码: int main(int argc, char** argv) { Rect2d roi; Mat frame; // create a tracker object Ptr<Tracker> tracker = Tracker::create("KC

我使用的是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;
        }
}
int main(int argc,char**argv){
二维感兴趣区;
垫架;
//创建跟踪器对象
Ptr tracker=tracker::创建(“KCF”);
视频捕获上限(“C2_0002.mp4”);
cap>>框架;
调整大小(frame,frame,Size(frame.cols/2,frame.rows/2));
roi=选择roi(“跟踪器”,帧);
//如果未选择ROI,则退出
如果(roi.width==0 | | roi.height==0)
返回0;
//初始化跟踪器
跟踪器->初始化(帧,roi);
//执行跟踪过程
printf(“启动跟踪过程,按ESC退出。\n”);
对于(;;){
//从视频中获取帧
cap>>框架;
调整大小(frame,frame,Size(frame.cols/2,frame.rows/2));
//如果没有更多图像,请停止程序
if(frame.rows==0 | | frame.cols==0)
打破
//更新跟踪结果
跟踪器->更新(帧、roi);
矩形(帧,roi,标量(255,0,0),2,1);
imshow(“跟踪器”,帧);
如果(等待键(1)=27)中断;
}
}
此外,您还可以看到我的模拟的短视频,并看到问题:

您能再指定一点吗?
a) 你想删除整个跟踪器吗
b) 如果跟踪器上没有更新,您就不想打印矩形

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

创建一个变量来计算步骤是
tracker->update(frame,roi)
返回
false
,如果
tracker->update(frame,roi)
返回
true
,则将其设置为0。超过一定数量(阈值)
矩形(帧、roi、标量(255、0、0)、2、1)
不应被调用,或者您可以删除跟踪器/中断循环(如我之前所说,我不确定它是否会再次工作,另外跟踪器使用主动学习-它每一步都在学习:错误的训练样本将导致错误的行为)


仅供参考->原始文件:)

我无法加载您的视频,可能是reupload?@MichalGallovic-对不起,我解决了下载链接问题。您现在可以下载它。重置可以按图所示进行,您找到解决此问题的方法了吗?我找不到跟踪器更新返回false的条件。我的想法是降低门槛之类的。