KCF算法(相关滤波算法) 跟踪目标

这是笔者目前碰到的性能最好的传统目标跟踪算法,所以这里也简单介绍下这个算法的由来。

一、算法介绍

KCF全称为Kernel Correlation Filter 核相关滤波算法。是在2014年由Joao F. Henriques, Rui Caseiro, Pedro Martins, and Jorge Batista提出来的,算法出来之后也算是轰动一时,这个算法不论是在跟踪效果还是跟踪速度上都有十分亮眼的表现。属于判别式跟踪,主要是使用给出的样本去训练一个判别分类器,判断跟踪到的是目标还是周围的背景信息。主要使用轮转矩阵对样本进行采集,使用快速傅里叶变化对算法进行加速计算。

对原理很感兴趣的小伙伴可以看这个博客,写得很详细。

算法的2个缺点

第一点,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结合进行目标跟踪,博客在这里

参考:

opencv自带kcf算法实现目标跟踪_kcf opencv_追忆似水_年华的博客-优快云博客

### KCF算法原理 KCF算法全称是Kernelized Correlation Filters,在2014年由Joao F. Henriques等人提出,此算法跟踪效果和速度方面表现出色[^2]。该方法通过利用循环矩阵来收集样本数据,并采用快速傅里叶变换技术实现高效运算。 对于核函数的选择以及特征空间的设计,KCF采用了线性回归模型的第一部分概念作为基础理论框架的一部分。具体来说,当涉及到循环矩阵的应用时,如果\( \mathbf{K} \)是一个循环矩阵,则可以根据其首行向量\( \mathbf{k}_{xx} \),即核矩阵\(\mathbf{K}\)中的第一个元素构成整个矩阵\[ \mathbf{K}=C(\mathbf{k}_{xx}) \][^3]。这里\( C() \)表示构建循环矩阵的操作。 为了提高计算效率,KCF引入了频域处理方式。转换后的计算复杂度主要包括两大部分:一是反向傅立叶变换所需的时间成本为\( O(K\log K) \)[^1];二是两个向量之间的点积操作大约需要\( O(K) \)次浮点数乘法运算。这种设计使得即使面对高维输入也能保持较低时间开销。 ### 应用场景 初始化阶段,需选定一个适当的目标框作为起始状态下的模板对象。这一步骤可以通过人工指定或者借助其他计算机视觉工具自动完成目标定位任务[^4]。一旦获得了初始位置信息之后,后续每一帧图像都将依据之前建立起来的学习机制来进行相似性匹配并预测物体的新位置。 ```python import numpy as np from skimage.transform import resize def initialize_target(image, bbox): """ Initialize the target region. Parameters: image : ndarray The first frame of video or sequence. bbox : tuple Bounding box coordinates (x_min, y_min, width, height). Returns: template : ndarray Resized grayscale cropped image corresponding to bounding box area. """ x_min, y_min, w, h = map(int,bbox) crop_img = image[y_min:y_min+h,x_min:x_min+w] resized_crop = resize(crop_img,(128,128),mode='reflect') gray_resized_crop = rgb2gray(resized_crop) return gray_resized_crop ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值