这是笔者目前碰到的性能最好的传统目标跟踪算法,所以这里也简单介绍下这个算法的由来。
一、算法介绍
KCF全称为Kernel Correlation Filter 核相关滤波算法。是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista提出来的,算法出来之后也算是轰动一时,这个算法不论是在跟踪效果还是跟踪速度上都有十分亮眼的表现。属于判别式跟踪,主要是使用给出的样本去训练一个判别分类器,判断跟踪到的是目标还是周围的背景信息。主要使用轮转矩阵对样本进行采集,使用快速傅里叶变化对算法进行加速计算。
对原理很感兴趣的小伙伴可以看这个博客,写得很详细。
第一点,KCF因为在跟踪过程当中目标框是已经设定好的,从始至终大小为发生变化,但是我们的跟踪序列当中目标大小时有发生变化,这个就会导致跟踪器跟踪过程当中目标框漂移,从而导致跟踪失败。
第二点,KCF对在跟踪过程当中当目标被遮挡时候的处理问题没有进行很好的解决。
二、代码
int main(int argc, char* argv[])
{
VideoCapture capture(2);
if (!capture.isOpened())
return 1;
Mat firframe, frame;
capture>>firframe;
Rect roi = selectROI("tracker", firframe);
Ptr<TrackerKCF> tracker = TrackerKCF::create();
tracker->init(firframe,roi);
// tracker->update(firframe,roi);
while (1) {
capture>>frame;
bool isFound = tracker->update(frame, roi);
if (isFound)
rectangle(frame,roi, Scalar(0, 255, 0), 2, 8);
imshow("traker", frame);
if(waitKey(30) == 27) break;
}
return 0;
}
三、个人总结
蛮喜欢这个算法的,做个总结吧。跑起来发现前面提到的2个缺点,其实第一点,也就是当目标大小发生变化的时候,比如把你自己设为目标,远离摄像头后,就检测不出来了。
所以,也有大佬用YOLOv4-tiny结合进行目标跟踪,博客在这里
参考: