[C++]C++使用yolov9结合bytetrack实现目标追踪演示

news2024/9/27 9:30:27

【简介】

在C++中实现YOLOv9的目标检测与ByteTrack的多目标追踪是一个相对复杂的过程,涉及到深度学习、计算机视觉和实时数据处理等多个领域。下面我将简单介绍这两个技术,并概述如何在C++中实现它们。

YOLOv9(You Only Look Once,版本9)是一种实时目标检测算法,它通过在单个网络中同时预测所有目标的位置和类别来实现高效的目标检测。YOLOv9在速度和精度之间取得了很好的平衡,使其成为许多实时应用的首选方法。

ByteTrack是一种多目标追踪算法,它结合了目标检测和目标追踪两个步骤。ByteTrack使用目标检测算法(如YOLOv9)来识别视频帧中的目标,并使用追踪算法来跟踪这些目标在连续帧之间的运动。ByteTrack通过关联相邻帧中的目标来实现多目标追踪,从而可以准确地跟踪多个目标的运动轨迹。

在C++中实现YOLOv9和ByteTrack的结合,需要以下几个步骤:

  1. 加载YOLOv9模型:首先,你需要加载预训练的YOLOv9模型。这可以通过使用深度学习框架(如TensorFlow、PyTorch或ONNX Runtime)来实现。你需要将模型转换为C++可以理解的格式,并在程序中加载它。
  2. 处理视频帧:然后,你需要从视频文件中读取帧,或者从摄像头捕获实时帧。这些帧将被送入YOLOv9模型进行目标检测。
  3. 执行目标检测:在加载模型后,你可以将每一帧送入模型进行目标检测。模型将返回每个检测到的目标的边界框和类别。
  4. 多目标追踪:接下来,你可以使用ByteTrack算法来追踪这些目标。ByteTrack将根据相邻帧中的目标位置和运动信息来关联目标,从而追踪它们的运动轨迹。
  5. 显示结果:最后,你可以将追踪结果可视化并显示在屏幕上。这可以通过在原始视频帧上绘制边界框和轨迹线来实现。

需要注意的是,实现这一过程需要一定的计算机视觉和深度学习基础,以及对C++编程的熟悉。此外,由于YOLOv9和ByteTrack都是比较新的技术,因此可能需要使用较新的深度学习框架和库来支持。

总的来说,在C++中实现YOLOv9和ByteTrack的多目标追踪是一个具有挑战性的任务,但它为实时目标检测和追踪提供了强大的工具。通过不断学习和实践,你可以逐渐掌握这些技术,并将其应用于各种实际应用中。

【效果展示】

演示结果

【演示视频】

C++使用yolov9结合bytetrack实现目标追踪演示_哔哩哔哩_bilibili测试环境:opencv==4.8.0vs2019cmake==3.24.3, 视频播放量 4、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:基于yolov5-6.0+bytetrack的目标追踪演示,基于yolov8官方目标追踪botsort和bytetrack源码开发视频演示,使用C++部署yolov8的onnx和bytetrack实现目标追踪,2024易语言yolo9全网最强框架更新~,用C#部署yolov8的tensorrt模型进行目标检测winform最快检测速度,yolov8 TensorRT C++ C#部署,YOLOv9来啦!性能逆天~,基于目标检测通用pyqt5界面设计读取图片摄像头视频文件,使用C#部署openvino-yolov5s模型,yolov7自动标注工具自动打标签目标检测自动标注gpu加速标注使用教程icon-default.png?t=N7T8https://www.bilibili.com/video/BV1Xm411o7JH/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee

【部分实现代码】

#include <iostream>
#include<opencv2/opencv.hpp>

#include<math.h>
#include "yolov9.h"
#include<time.h>
#include <math.h>
#include <time.h>
#include <vector>
#include <chrono>
#include <float.h>
#include <stdio.h>
#include "BYTETracker.h"

using namespace std;
using namespace cv;
using namespace dnn;



int main() {

	string detect_model_path = "./models/yolov9-c.onnx";
	Yolov9 detector;
	detector.ReadModel(detect_model_path,"labels.txt",false);
	vector<Object> objects;
	cv::VideoCapture cap("D:\\car.mp4");
	int img_w = cap.get(CAP_PROP_FRAME_WIDTH);
	int img_h = cap.get(CAP_PROP_FRAME_HEIGHT);
	int fps = cap.get(CAP_PROP_FPS);
	long nFrame = static_cast<long>(cap.get(CAP_PROP_FRAME_COUNT));
	if (!cap.isOpened())
	{
		std::cout << "open capture failured!" << std::endl;
		return -1;
	}
	Mat frame;
	BYTETracker tracker(fps, 30);
	int num_frames = 0;
	int keyvalue = 0;
    int total_ms = 1;
	while (true)
	{
		cap.read(frame);
		if (frame.empty())
		{
			std::cout << "read to end" << std::endl;
			break;
		}
		num_frames++;
		auto start = chrono::system_clock::now();
		objects.clear();
		detector.Detect(frame, objects);
       vector<STrack> output_stracks = tracker.update(objects);
		auto end = chrono::system_clock::now();
		total_ms = total_ms + chrono::duration_cast<chrono::microseconds>(end - start).count();
		for (int i = 0; i < output_stracks.size(); i++)
		{
			vector<float> tlwh = output_stracks[i].tlwh;
			bool vertical = tlwh[2] / tlwh[3] > 1.6;
			if (tlwh[2] * tlwh[3] > 20 && !vertical)
			{
				Scalar s = tracker.get_color(output_stracks[i].track_id);
				putText(frame, format("%d", output_stracks[i].track_id), Point(tlwh[0], tlwh[1] - 5),
						0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);
				rectangle(frame, Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), s, 2);
			}
		}
		putText(frame, format("frame: %d fps: %d num: %d", num_frames, num_frames * 1000000 / total_ms, (int)output_stracks.size()),
				Point(0, 30), 0, 0.6, Scalar(0, 0, 255), 2, LINE_AA);

		imshow("demo", frame);
		keyvalue = waitKey(1);
		if (keyvalue == 113 || keyvalue == 81)
		{
			break;
		}

	}
	cap.release();

}



【源码下载】

https://download.csdn.net/download/FL1623863129/88903992

【测试环境】

vs2019

cmake==3.24.3

opencv==4.8.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1486360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux网络编程—— IO多路复用

Linux网络编程—— IO多路复用 1. I/O 多路复用&#xff08;I/O多路转接&#xff09;1.1 常见的几种I/O模型 2. select3. poll4. epoll :star: 1. I/O 多路复用&#xff08;I/O多路转接&#xff09; I/O 多路复用 使得程序能 同时监听 多个文件描述符&#xff0c;能够提高程序的…

关于数据提交上传服务端的数据类型以及项目打包上线的流程

1 请求头的类型&#xff1a; content-type&#xff1b; 01: application/json 数据以json格式请求&#xff1a;{"key":"value"} 02: application/x-www.form-urlencoded from表单的数据格式 name"zs"&age12 03 mutipart/form-data…

数据结构与算法学习【算法思想之二分法基础】

文章目录 数据结构与算法学习【算法思想之二分查找基础】本文学习目标或巩固的知识点 最基础的二分查找&#x1f7e2;通过题目可知题解结果验证 数据结构与算法学习【算法思想之二分查找基础】 本文学习目标或巩固的知识点 学习二分法类题目 巩固基础的二分法 提前说明&#…

2024.3.1 小项目

1、机械臂 #include <myhead.h> #define SER_IP "192.168.125.32" //服务器端IP #define SER_PORT 8888 //服务器端端口号#define CLI_IP "192.168.68.148" //客户端IP #define CLI_PORT 9999 /…

Linux:线程的概念

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》 文章目录 前言一、线程的概念线程代码的简单示例 总结 前言 本文是对于线程概念的知识总结 一、线程的概念 在课本上&#xff0c;线程是比进程更轻量级的一种指向流 或 线程是在…

数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua&#xff0c;在这里我会分享我的知识和经验。&#x…

自动化测试介绍、selenium用法(自动化测试框架+爬虫可用)

文章目录 一、自动化测试1、什么是自动化测试&#xff1f;2、手工测试 vs 自动化测试3、自动化测试常见误区4、自动化测试的优劣5、自动化测试分层6、什么项目适合自动化测试 二、Selenuim1、小例子2、用法3、页面操作获取输入内容模拟点击清空文本元素拖拽frame切换窗口切换/标…

SpringCloud-Docker安装与详解

Docker 是一款强大的容器化平台&#xff0c;通过其轻量级的容器技术&#xff0c;使应用程序的开发、部署和管理变得更加便捷和高效。本文将深入探讨 Docker 的安装过程&#xff0c;并详细解析其基本概念、组件及常用命令&#xff0c;以帮助读者充分理解和熟练使用 Docker。企业…

基于springboot+vue的工厂车间管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Spring Boot与Netty打造TCP服务端(解决粘包问题)

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Spring Boot与Netty打造TCP服务端 前言功能目标项目实现maven坐标构建自定义HandlerChannelInitializer实现server实现 前言 在物联网时代&#xff0c;设备之间的通信变得愈发重要。本文将带你踏上一…

微信小程序云开发教程——墨刀原型工具入门(添加批注+其他操作)

引言 作为一个小白&#xff0c;小北要怎么在短时间内快速学会微信小程序原型设计&#xff1f; “时间紧&#xff0c;任务重”&#xff0c;这意味着学习时必须把握微信小程序原型设计中的重点、难点&#xff0c;而非面面俱到。 要在短时间内理解、掌握一个工具的使用&#xf…

程序员的金三银四求职宝典:如何在关键时期脱颖而出

程序员的金三银四求职宝典&#xff1a;如何在关键时期脱颖而出 程序员的金三银四求职宝典&#xff1a;如何在关键时期脱颖而出摘要 面试技巧分享 &#x1f60a;1. 自我介绍 Tips简洁明了 ✨重点突出 &#x1f50d;结合实例 &#x1f310; 2. 技术问题回答 Tips冷静应对 &#x…

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例&#xff1a;Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一&#xff0c;它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …

扑克牌翻牌记忆小游戏源码

源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 效果预览 下载地址 https://www.qqmu.com/2296.html

LeetCode每日一题之 移动0

前言&#xff1a; 我的每日一题专栏正式开始更新&#xff0c;我会分享关于我在LeetCode上刷题时的经验&#xff0c;将经典题型拿出来详细讲解&#xff0c;来提升自己及大家的算法能力&#xff0c;希望这篇博客对大家有帮助。 题目介绍&#xff1a; 题目链接&#xff1a;. - …

HTML5+CSS3+移动web——列表、表格、表单

系列文章 HTML5CSS3移动web——HTML 基础-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136070953?spm1001.2014.3001.5501 目录 一、列表 无序列表 有序列表 定义列表 二、表格 表格结构标签 基本使用 合并单元格 三、表单 input 标签 input 标签占位文…

模版进阶C++

非类型模版 之前我们写的模版都是在不知道模版&#xff08;类&#xff09;中有的变量的类型是什么的时候&#xff0c;我们先用模版参数定义&#xff0c;当类实例化的时候在传参确认 非类型模版&#xff1a;模版参数定义的时候也可以定义整型类型&#xff08;c20之后才支持其…

Topaz DeNoise AI:一键让照片重获清晰 mac/win版

Topaz DeNoise AI是一款革命性的图片降噪软件&#xff0c;它利用先进的人工智能算法&#xff0c;帮助用户轻松去除照片中的噪点&#xff0c;恢复图像的清晰度和细节。无论是专业摄影师还是摄影爱好者&#xff0c;Topaz DeNoise AI都能成为他们处理图片时的得力助手。 Topaz De…

【Matlab】Matlab电话拨号音合成与识别(代码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

springboot240基于Spring boot的名城小区物业管理系统

基于Spring boot的名城小区物业管理系统的设计与实现 摘要 当下&#xff0c;正处于信息化的时代&#xff0c;许多行业顺应时代的变化&#xff0c;结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于物业信息的管理和控制&#xff0c;采用人工登记的方式保存相关数…