一、引子
目标跟踪是计算机视觉领域的一个重要分支,它涉及到从视频序列中检测和跟踪感兴趣的目标。
Kernelized Correlation Filters (KCF) KCF算法利用循环矩阵和快速傅里叶变换来高效地计算相关滤波器。它将目标表示为一个高维特征向量,并在每个帧中更新滤波器,以适应目标外观变化。KCF算法因其速度快和精度高而被广泛应用。
二、前期准备
本文是基于Opencv及其扩展库Contrib实现的。
安装contrib可以看我的这篇文章:
【一步到位】Visual Studio20xx+OpenCV4.5.1+opencv_contrib的安装与配置
操作环境:Windows 10专业版 22H2、Opencv4.5.5 、Vistual Studio 2017
三、代码实现
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/core/utility.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main() {
// 读取视频文件
VideoCapture cap("D:\\Test-Video.MP4");
if (!cap.isOpened()) {
std::cout << "Error opening video file\n";
return -1;
}
Mat frame;
cap.read(frame);
// 设定屏幕大小
const int screenWidth = 2560;
const int screenHeight = 1440;
// 初始化目标框
Rect2d roi = selectROI("Select ROI", frame);
if (roi.width == 0 || roi.height == 0) {
std::cout << "ROI selection canceled\n";
return -1;
}
// 创建KCF跟踪器
Ptr<TrackerKCF> tracker = TrackerKCF::create();
// 将Rect2d类型转换为Rect类型
Rect rectRoi(static_cast<int>(roi.x), static_cast<int>(roi.y),
static_cast<int>(roi.width), static_cast<int>(roi.height));
// 初始化跟踪器
tracker->init(frame, rectRoi);
// 保存最后一帧的目标框位置
Rect2d lastRect = rectRoi;
// 循环处理视频帧
while (cap.read(frame)) {
// 更新跟踪器
bool success = tracker->update(frame, rectRoi);
if (success) {
// 在图像上绘制跟踪框
rectangle(frame, rectRoi, Scalar(0, 255, 0), 2);
lastRect = rectRoi; // 更新最后一帧的目标框位置
}
else {
std::cout << "Tracking failure detected\n";
rectRoi = lastRect; // 使用最后一帧的目标框位置
}
// 将帧调整为与屏幕大小相同
resize(frame, frame, Size(screenWidth, screenHeight));
// 显示当前帧
imshow("Tracking", frame);
// 等待大约16毫秒,以实现60帧每秒的播放速度//== 27 的部分是在检查用户是否按下了键盘上的 Escape 键(ASCII码为27)。如果用户按下了 Escape 键,条件成立,就会跳出循环,从而退出程序。
if (waitKey(16) == 27) {
break;
}
}
// 释放资源
cap.release();
destroyAllWindows();
return 0;
}
成果展示见本人博客视频
KCF演示test