基于C++的OpenCV支持的KCF目标跟踪

一、引子

目标跟踪是计算机视觉领域的一个重要分支,它涉及到从视频序列中检测和跟踪感兴趣的目标。

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

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KCF(Kernelized Correlation Filter)是一种基于核方法的目标跟踪算法,它在计算速度和跟踪精度上都有很好的表现。OpenCV 3.2中提供了KCF算法的实现,可以方便地进行目标跟踪。 以下是使用C++和OpenCV 3.2进行KCF目标跟踪的示例代码: ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main(int argc, char** argv) { // 打开视频文件 VideoCapture cap("test.mp4"); if (!cap.isOpened()) { std::cerr << "Failed to open video file!" << std::endl; return -1; } // 读取第一帧图像并手动选择目标区域 Mat frame, roi; cap >> frame; Rect2d bbox = selectROI(frame, false); roi = frame(bbox); // 初始化KCF跟踪器 Ptr<Tracker> tracker = TrackerKCF::create(); tracker->init(frame, bbox); // 开始跟踪 while (cap.read(frame)) { // 更新跟踪器 bool ok = tracker->update(frame, bbox); if (ok) { // 目标跟踪成功,绘制跟踪框 rectangle(frame, bbox, Scalar(0, 255, 0), 2, 1); } else { // 目标跟踪失败,重新选择目标区域 bbox = selectROI(frame, false); tracker->init(frame, bbox); } // 显示当前帧图像 imshow("KCF Tracker", frame); // 按ESC键退出程序 char c = waitKey(1); if (c == 27) { break; } } return 0; } ``` 在代码中,首先使用VideoCapture打开视频文件,然后读取第一帧图像并手动选择目标区域。接着使用TrackerKCF::create()创建KCF跟踪器,并使用init()函数初始化跟踪器。随后进入循环,使用update()函数更新跟踪器,并在跟踪成功的情况下绘制跟踪框。如果跟踪失败,则重新选择目标区域并重新初始化跟踪器。最后使用waitKey()等待按键事件,并在按下ESC键时退出程序。 需要注意的是,KCF算法对目标区域的选择非常敏感,不同的选择可能会导致跟踪失败。因此,在实际应用中,需要根据具体情况选择合适的目标区域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值