基于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;
}

成果展示见本人博客视频

 

 

相关推荐

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

    2024-05-16 06:16:08       40 阅读
  2. 基于udp可靠传输协议kcp介绍,C++测试kcp示例

    2024-05-16 06:16:08       45 阅读
  3. 基于深度学习典型目标跟踪算法

    2024-05-16 06:16:08       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-16 06:16:08       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-16 06:16:08       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-16 06:16:08       87 阅读
  4. Python语言-面向对象

    2024-05-16 06:16:08       96 阅读

热门阅读

  1. MongoDB聚合运算符:$zip

    2024-05-16 06:16:08       34 阅读
  2. Jetpack Compose 初探

    2024-05-16 06:16:08       54 阅读
  3. 在ubuntu安装Docker容器

    2024-05-16 06:16:08       37 阅读
  4. WebApp 使用post-css实现移动端适配

    2024-05-16 06:16:08       34 阅读
  5. 15. 三数之和

    2024-05-16 06:16:08       29 阅读
  6. docker版MySQL5.7重置root密码并授权localhost访问

    2024-05-16 06:16:08       27 阅读
  7. Qt初识

    Qt初识

    2024-05-16 06:16:08      28 阅读
  8. 时间格式数据向前或向后归于整时

    2024-05-16 06:16:08       30 阅读