[C++]使用yolov10的onnx模型结合onnxruntime和bytetrack实现目标追踪

【官方框架地址】 

yolov10yolov10框架:https://github.com/THU-MIG/yolov10

bytetrack框架:https://github.com/ifzhang/ByteTrack

【算法介绍】

Yolov10与ByTetrack:目标追踪的强大组合

Yolov10和ByTetrack是两种在目标追踪领域具有显著影响力的技术。当它们结合使用时,可以显著提高目标追踪的准确性和实时性。

Yolov10是Yolov系列算法的最新版本,它在目标检测方面具有出色的性能。相较于之前的版本,Yolov10在精度和速度上都进行了优化,使其成为实时目标检测的理想选择。通过结合ByTetrack,Yolov10可以更有效地应用于目标追踪任务。

ByTetrack是一种基于轨迹匹配的目标追踪方法。它利用目标的运动信息和外观特征进行追踪,能够在复杂场景下实现稳定的目标追踪。ByTetrack的优势在于其强大的鲁棒性和适应性,即使在目标被遮挡或出现运动模糊的情况下,它仍能保持较高的追踪精度。

当Yolov10与ByTetrack结合使用时,Yolov5首先检测视频中的目标,并生成目标的初始位置和运动轨迹。然后,ByTetrack利用这些信息对目标进行精确追踪。这种结合方式既发挥了Yolov10的高检测精度,又利用了ByTetrack的高追踪精度,使得整体目标追踪效果显著提升。

综上所述,Yolov10与ByTetrack的结合为解决复杂场景下的目标追踪问题提供了新的解决方案。随着人工智能技术的不断进步,这种结合方式有望成为目标追踪领域的研究热点和发展趋势。通过进一步的研究和优化,我们可以期待这种组合在未来的目标追踪任务中发挥更大的潜力。

【效果展示】

【实现部分代码】

#include "YOlov10Manager.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include "BYTETracker.h"
#include <fstream>
#include <iomanip>
#include <time.h>
#include <chrono>
#include "util.h"
#include <map>
#include<vector>
#include<algorithm>using namespace std;
using namespace cv;void bytetrack_update(const std::vector<Detection>& res, std::vector<Object>& obj, const int& class_id ){for (size_t i = 0; i < res.size(); i++){try{if (res[i].class_id != class_id){ continue; }obj[i].label = res[i].class_id;obj[i].rect.x = res[i].bbox.x;obj[i].rect.y = res[i].bbox.y;obj[i].rect.height = res[i].bbox.height;obj[i].rect.width = res[i].bbox.width;obj[i].prob = res[i].confidence;}catch(const std::exception& e){std::cerr << e.what() << '\n';}        }};
int main(int argc, char const *argv[])
{std::map<int, std::vector<int>> object_id_list;const std::vector<std::string> classNames = util::loadNames("labels.txt");const int class_id = 2;//只想追踪的目标std::string model_path="yolov10n.onnx";Yolov10Manager detector(model_path);cv::Mat frame;std::vector <double> avg;cv::VideoCapture cap("car.mp4");std::chrono::time_point<std::chrono::high_resolution_clock>prev_frame_time(std::chrono::high_resolution_clock::now());std::chrono::time_point<std::chrono::high_resolution_clock>new_frame_time;int frame_width  =  cap.get(cv::CAP_PROP_FRAME_WIDTH);int frame_height =  cap.get(cv::CAP_PROP_FRAME_HEIGHT);int fpsvideo = cap.get(cv::CAP_PROP_FPS);cv::namedWindow("Camera", cv::WINDOW_NORMAL);BYTETracker tracker(fpsvideo, 30);while (cap.isOpened()) {cap >> frame;if (frame.empty()){break;}std::vector<Object> obj;auto results = detector.Inference(frame);const int num = results.size();obj.resize(num);bytetrack_update(results, obj, class_id);std::vector<STrack> output_stracks = tracker.update(obj);for (size_t i = 0; i < output_stracks.size(); i++){std::vector<float> tlwh = output_stracks[i].tlwh;cv::Scalar __color = tracker.get_color(output_stracks[i].track_id);cv::putText(frame, std::to_string(output_stracks[i].track_id), cv::Point(tlwh[0], tlwh[1] - 10), cv::FONT_ITALIC, 0.75, __color, 2);cv::rectangle(frame, cv::Rect(tlwh[0], tlwh[1], tlwh[2], tlwh[3]), __color, 2);    }//cv::imwrite("demo.jpg", frame);new_frame_time = std::chrono::high_resolution_clock::now();std::chrono::duration<double> duration1(new_frame_time - prev_frame_time);double fps = 1/duration1.count();avg.push_back(fps);std::cout <<"FPS: " << fps <<  std::endl;prev_frame_time = new_frame_time;cv::imshow("Camera", frame);if (cv::waitKey(1) == 27) {break;}}cap.release();cv::destroyAllWindows();return 0;
}

【视频演示】
基于opencv和onnxruntime的C++版本yolov10-onnx和bytetrack追踪算法实现目标追踪_哔哩哔哩_bilibili测试环境:vs2019cmake==3.24.3opencv==4.7.0onnxruntime==1.12.0更多信息参考博文:, 视频播放量 2、弹幕量 0、点赞数 0、投硬币枚数 0、收藏人数 0、转发人数 0, 视频作者 未来自主研究中心, 作者简介 未来自主研究中心,相关视频:AI换脸真变态,绅士必备的一键启动包!,使用纯opencv部署yolov8目标检测模型onnx,基于yolov8+bytetrack实现目标追踪视频演示,易语言部署yolox的onnx模型,C语言、C++和C#的区别竟是这样,看完我瞬间懂了!,基于yolov8官方目标追踪botsort和bytetrack源码开发视频演示,基于C++版本yolov5-onnx和bytetrack追踪算法实现目标追踪,使用C++部署yolov8的onnx和bytetrack实现目标追踪,将yolov8封装成一个类几行代码完成语义分割任务,使用C#的winform部署yolov8的onnx实例分割模型icon-default.png?t=N7T8https://www.bilibili.com/video/BV1rZ421M77T/
【测试环境】
 opencv==4.7.0 onnxruntime==1.12.0 vs2019 cmake==3.24.3 

 【源码下载地址】

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

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

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

相关文章

OceanBase 金融项目优化案例

领导让我帮忙支持下其他项目的SQL优化工作&#xff0c;呦西&#xff0c;是收集案例的好机会。&#x1f60d; 下面SQL都是在不能远程的情况下&#xff0c;按照原SQL的逻辑等价改写完成发给现场同学验证。 案例一 慢SQL&#xff0c;4.32秒&#xff1a; SELECT MY_.*, RM FROM (SE…

C语言:链表

链表 介绍单向链表节点结构创建节点插入节点删除节点遍历链表尾部插入查找节点链表反转示例程序程序1程序2 介绍 链表是一种常见的数据结构&#xff0c;用于存储一系列线性数据。与数组不同&#xff0c;链表中的元素在内存中不必是连续存放的&#xff0c;而是通过指针将每个元…

Jackson的使用

一引入依赖 <!--Jackson是spring-boot-starter-json的一个依赖&#xff08;spring-boot-starter-web中包含spring-boot-starter-json&#xff09;。也就是说&#xff0c;当项目中引入spring-boot-starter-web后会自动引入spring-boot-starter-json --> <dependency&g…

4款好用的文本扩展器!!提高工作效率!【送源码】

今天的文章中为大家带来几款好用的文本扩展器&#xff0c;帮助大家提供工作效率&#xff0c;减少重复劳动&#xff5e; Beeftext Beeftext 是一个文本扩展工具&#xff0c;可以帮助用户快速输入短语、段落或者常用的文本片段。它允许你创建自定义的缩写和对应的文本替换&…

使用tkinter创建带有图标的菜单栏

使用tkinter创建带有图标的菜单栏 效果代码代码解析创建主窗口加载图标创建菜单栏添加文件菜单添加带图标的菜单项 Tkinter 的默认菜单外观较为简单&#xff0c;可以通过自定义和添加图标&#xff0c;让菜单显示更好看。 效果 代码 import tkinter as tk from tkinter import …

课时154:项目发布_手工发布_手工发布

1.2.3 手工发布 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 简介 为了合理的演示生产环境的项目代码发布&#xff0c;同时又兼顾实际实验环境的资源&#xff0c;我们这里将 B主机和C主机 用一台VM主机来实现&#xff0c;A主机单…

Arduino入门2——常用函数及用法

Arduino入门2——串口驱动函数及用法 IO串口 上期&#xff0c;我们简单的认识了一下Arduino&#xff0c;浅浅的入了个门&#xff0c;这一期我们介绍以下Arduino串口常用的函数及用法 IO 常用串口库函数如下&#xff1a; 函数名用法及解析pinMode()用于IO口初始化digitalWrite…

2024050802-重学 Java 设计模式《实战模板模式》

重学 Java 设计模式&#xff1a;实战模版模式「模拟爬虫各类电商商品&#xff0c;生成营销推广海报场景」 一、前言 黎明前的坚守&#xff0c;的住吗&#xff1f; 有人举过这样一个例子&#xff0c;先给你张北大的录取通知书&#xff0c;但要求你每天5点起床&#xff0c;12点…

Proteus 新建工程

Proteus 新建工程 新建简单工程 首先在File工具栏中点击New Project&#xff0c;弹出新建工程向导程序(New Proteus Wizard) 填写工程名称与存储路径&#xff0c;选择New Proteus并点击Next进行下一步设置 我们不需要生成PCB文件&#xff0c;一路默认&#xff0c;点击Next即…

实战计算机网络02——物理层

实战计算机网络02——物理层 1、物理层实现的功能2、数据与信号2.1 数据通信模型2.2 通信领域常用术语2.3 模拟信号和数字信号 3、信道和调制3.1 信道3.2 单工通信、半双工通信、全双工通信3.3 调制3.4 奈式准则3.5 香农定律 4、传输媒体4.1 导向传输媒体4.2 非导向传输媒体 5、…

高级人工智能复习 题目整理 中科大

题目整理 填空 1.准确性&#xff0c;复杂性&#xff0c;验证集 2. 3 2 n 3^{2^n} 32n 3 C 2 n m 3^{C^m_{2n}} 3C2nm​ 3 m 3^m 3m n 1 n1 n1 3. 状态 从状态s采取行动a后继续采用策略 π \pi π的收益 环境 4. 语法 语义 推理规则 5. 参与者&#xff0c;策略集&#xff…

Elasticsearch 8.1官网文档梳理 - 十一、Ingest pipelines(管道)

Ingest pipelines 管道&#xff08;Ingest pipelines&#xff09;可让让数据在写入前进行常见的转换。例如可以利用管道删除文档&#xff08;doc&#xff09;的字段、或从文本中提取数据、丰富文档&#xff08;doc&#xff09;的字段等其他操作。 管道&#xff08;Ingest pip…

VirtualBox、Centos7下安装docker后pull镜像问题、ftp上传文件问题

Docker安装篇(CentOS7安装)_docker 安装 centos7-CSDN博客 首先&#xff0c;安装docker可以根据这篇文章进行安装&#xff0c;安装完之后&#xff0c;我们就需要去通过docker拉取相关的服务镜像&#xff0c;然后安装相应的服务容器&#xff0c;比如我们通过docker来安装mysql,…

vue 使用 ztree 超大量数据,前端树形结构展示

ztree 是一个很经典的基于jquey开发的树结构编辑展示UI组件库。 创建一个文件 ztree.vue&#xff0c;代码如下&#xff1a; <template><div><div class"ztree vue-giant-tree" :id"ztreeId"></div><div class"treeBox&q…

Termius安装docker

安装Termius 直接上官网 新建主机 更新一下yum 更新完成 安装docker的包 直接用命令安装 设置一下开机启动&#xff0c;可以查看docker的版本

Ui学习--UITableView

UI学习 UITableView基础UITableView协议UITableView高级协议与单元格总结 UITableView基础 UITableView作为iOS中的一个控件&#xff0c;用于以表格形式展示数据。例如通讯录好友&#xff0c;朋友圈信息等&#xff0c;都是UITableView的实际运用场景。 首先我们先要加入两个协…

K210使用雷龙NAND完成火灾检测

NAND 文章目录 NAND前言一、NAND是什么&#xff1f;二、来看一看NAND三、部署火灾检测 前言 前几天收到了雷龙NAND的芯片&#xff0c;一共两个芯片和一个转接板&#xff0c;我之前也没有使用过这款芯片&#xff0c;比较好奇&#xff0c;体验了一下&#xff0c;个人认为&#x…

嵌入式微处理器重点学习(三)

堆栈操作 R1=0x005 R3=0x004 SP=0x80014 STMFD sp!, {r1, r3} 指令STMFD sp!, {r1, r3}是一条ARM架构中的存储多个寄存器到内存的指令,这里用于将r1和r3寄存器的内容存储到栈上。STMFD(Store Multiple Full Descending)是一种全递减模式的多寄存器存储指令,它会先将栈指针…

three.js 基础01

1.场景创建 Scene() 2.常用形状集几何体「Geometry」[可设置长宽高等内容,如:new THREE.BoxGeometry(...)] 长方体 BoxGeometry圆柱体CylinderGeometry 球体SphereGeometry圆锥体ConeGeometry矩形平面 PlaneGeometry 圆面体CircleGeometry 3.常用材质「Materi…

linux 部署瑞数6实战(维普,药监局)sign第二部分

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx …