[C++]使用yolov8的onnx模型仅用opencv和bytetrack实现目标追踪
【官方框架地址】
yolov8:
https://github.com/ultralytics/ultralytics
bytetrack:
https://github.com/ifzhang/ByteTrack
【算法介绍】
随着人工智能技术的不断发展,目标追踪已成为计算机视觉领域的重要研究方向。Yolov8和ByTetrack作为当前先进的算法,当它们结合使用时,能够显著提升目标追踪的准确性和实时性。
Yolov8,源于“You Only Look Once”的简称,是一款强大且高效的目标检测算法。它继承了Yolov3和Yolov4的优点,并在其基础上进行了改进,使得检测精度和速度都得到了显著提升。Yolov8特别适合于处理视频流中的目标追踪任务,因为它能够实时地、准确地检测出视频中的目标。
ByTetrack,全称为Background and Tracklet-based Object Tracking,是一种基于背景减除和轨迹匹配的目标追踪方法。它利用背景减除技术初步确定目标的运动轨迹,再结合轨迹匹配算法,对目标进行精确追踪。ByTetrack的优势在于,即使在复杂场景下,如目标遮挡、运动模糊等,它仍能保持较高的追踪精度。
当Yolov8与ByTetrack结合使用时,首先,Yolov8快速并准确地检测出视频中的目标;然后,ByTetrack利用Yolov8提供的信息,对目标进行精确追踪。这种结合方式既发挥了Yolov8的高检测精度,又利用了ByTetrack的高追踪精度,使得整体目标追踪效果更上一层楼。
综上所述,Yolov8与ByTetrack的结合为解决复杂场景下的目标追踪问题提供了新的思路和方法。在未来的人工智能技术发展中,这种结合方式有望成为目标追踪领域的研究热点。
【效果展示】

【实现部分代码】
#include <iostream>
#include<opencv2/opencv.hpp>#include<math.h>
#include "yolov8.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/yolov8n.onnx";Yolov8 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 failed!" << 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("result", frame);keyvalue = waitKey(1);if (keyvalue == 113 || keyvalue == 81){break;}}cap.release();}
【视频演示】
https://www.bilibili.com/video/BV15w411j7nP/?vd_source=989ae2b903ea1b5acebbe2c4c4a635ee
【测试环境】
vs2019
cmake==3.24.3
opencv==4.7.0
相关文章:
[C++]使用yolov8的onnx模型仅用opencv和bytetrack实现目标追踪
【官方框架地址】 yolov8: https://github.com/ultralytics/ultralytics bytetrack: https://github.com/ifzhang/ByteTrack 【算法介绍】 随着人工智能技术的不断发展,目标追踪已成为计算机视觉领域的重要研究方向。Yolov8和ByTetrack作为当前先进的算法&…...
打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码
大家好,今天用SpringBoot、vue写了一个仿ChatGPT官网聊天的打字机效果。 所有代码地址:gitee代码地址 ,包含前端和后端,可以直接运行 使用本技术实现的项目:aicnn.cn,欢迎大家体验 如果文章知识点有错误的地方…...
KMP-重复子字符串
Problem: 459. 重复的子字符串 文章目录 题目思路复杂度Code 题目 给定一个字符串str1, 判断其是否由重复的子串构成。 例子1:输入 str1‘ababab’ ;输出 true 例子2:输入 str1‘ababac’ ;输出 false 思路 重复子字符串组成的字…...
如何使用Markdown生成目录索引
一、Markdown生成目录索引怎么折叠 在Markdown中,可以使用[TOC]语法生成目录索引。 如果想要折叠目录,则需要使用一些插件,如Tocbot、jquery-tocify等。 例如,在使用Tocbot时,可以在Markdown文档中加入以下代码&…...
R语言【taxa】——as_taxon():转换为 taxon 对象
Package taxa version 0.4.2 Description 将其他对象转换为 taxon 向量。taxon 构造器可能将 基础向量转换为 taxon 向量。 Usage as_taxon(x, ...) Arguments 参数【x】:要转换为 taxon 向量的对象。 参数【...】:其余参数。 Examples x <- taxo…...
Android状态栏布局隐藏的方法
1.问题如下,安卓布局很不协调 2.先将ActionBar设置为NoActionBar 先打开styles.xml 3.使用工具类 package com.afison.newfault.utils;import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.graph…...
idea创建公用依赖包项目
创建parent项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…...
设计模式之装饰器模式
面向对象设计原则 接口隔离原则:面向对象设计之接口隔离原则-CSDN博客 设计模式 工厂模式 : 设计模式之工厂模式-CSDN博客 迭代器模式:设计模式之迭代器模式-CSDN博客 适配器模式:设计模式之适配器模式-CSDN博客 过滤器模式&#…...
【Java万花筒】缓存与存储:Java应用中的数据处理利器
激发性能之源:深度剖析Java开发中的五大数据缓存与存储方案 前言 在现代软件开发中,高效地处理和存储数据是至关重要的任务。本文将介绍一系列在Java应用中广泛使用的数据缓存与存储库,涵盖了Ehcache、Redisson、Apache Cassandra、Hazelca…...
解决nodejs报错内存泄漏问题,项目无法运行
解决方法一 一、使用 increase-memory-limit npm install increase-memory-limit //本项目中使用// 或 npm install -g increase-memory-limit //全局安装二、安装 npm install --save cross-env 配置package.json文件 LINMIT大小 81928g "scripts": {"f…...
计算机网络-物理层基本概念(接口特性 相关概念)
文章目录 总览物理层接口特性星火模型给出的相关概念解释(仅供参考) 总览 求极限传输速率:奈氏准则,香农定理(背景环境不一样) 编码:数据变成数字信号 调制:数字信号变成模拟信号 信…...
从规则到神经网络:机器翻译技术的演化之路
文章目录 从规则到神经网络:机器翻译技术的演化之路一、概述1. 机器翻译的历史与发展2. 神经机器翻译的兴起3. 技术对现代社会的影响 二、机器翻译的核心技术1. 规则基础的机器翻译(Rule-Based Machine Translation, RBMT)2. 统计机器翻译&am…...
python 面经
关于自身特点 1. 介绍下自己,讲一下在公司做的项目 2. 说一下熟悉的框架,大致讲下其特点 python 基础 1.可变与不可变类型区别 2.请解释join函数 3.请解释*args和**kwargs的含义,为什么使用* args,** kwargs? 4.解释…...
Ubuntu (Linux) 下创建软链接(即符号链接,相当于windows下的快捷方式)方法
Ubuntu (Linux) 下创建软链接(即符号链接,相当于windows下的快捷方式)方法 使用创建软链接的命令 #命令格式如下。注意:请使用绝对路径,否则链接可能失效 ln -s <源文件或目录的绝对路径> <符号链接文件&am…...
LeetCode.2765. 最长交替子数组
题目 2765. 最长交替子数组 分析 为了得到数组 nums 中的最长交替子数组的长度,需要分别计算以每个下标结尾的最长交替子数组的长度。为了方便处理,计算过程中需要考虑长度等于 1 的最长交替子数组,再返回结果时判断最长交替子数组的长度…...
Springboot日志框架logback与log4j2
目录 Springboot日志使用 Logback日志 日志格式 自定义日志格式 日志文件输出 Springboot启用log4j2日志框架 Springboot日志使用 Springboot底层是使用slf4jlogback的方式进行日志记录 Logback日志 trace:级别最低 debug:调试级别的,…...
浪花 - 用户信息展示+更新
1. 用户登录获取登录凭证 已登录的用户才能获取个人信息发送 Aixos 请求登录 const user ref();onMounted(async () > {const res await myAxios.get(/user/current);if (res.code 0) {console.log("获取用户信息成功");user.value res.data;} else {consol…...
xxe漏洞之scms靶场漏洞
xxe-scms 代码审核 (1)全局搜索simplexml_load_string simplexml_load_string--将XML字符串解释为对象 (2)查看源代码 ID1 $GLOBALS[HTTP_RAW_POST_DATA]就相当于file_get_contents("php://input"); 因此这里就存…...
Unity3d C#实现三维场景中图标根据相机距离动态缩放功能
前言 如题的需求,其实可以通过使用UI替代场景中的图标来实现,不过这样UI的处理稍微麻烦,而且需要在图标上添加粒子特效使用SpriteRender更方便快捷。这里就根据相机离图标的位置来计算图标的缩放大小即可。这样基本保持了图标的大小…...
Linux网络编程(二-套接字)
目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数 二、Socket简介 三、套接字相关的函数 3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept() 3.6 read()/recv()/recvfrom() 3.7 send()/sendto() 3.8 close() 四、UPD客服/服务端实…...
s2-pro快速上手指南:3步完成文本转语音与音色迁移实操手册
s2-pro快速上手指南:3步完成文本转语音与音色迁移实操手册 1. 平台简介 s2-pro是Fish Audio开源的专业级语音合成模型镜像,它能够将文本内容转换为自然流畅的语音,并支持通过参考音频实现音色迁移功能。这意味着你可以上传一段参考音频&…...
Spring Boot Helper插件免费版获取与版本适配全攻略
1. 为什么我们需要Spring Boot Helper插件 作为一个常年使用IntelliJ IDEA开发Spring Boot项目的程序员,我深刻体会到这个插件的重要性。简单来说,它就像是Spring Boot开发的"瑞士军刀",能帮我们快速创建项目、自动配置依赖、一键…...
基于 MATLAB 的非线性优化算法实现:BFGS + Armijo 线搜索
基于matlab的非线性优化算法实现 通过梯度下降法(具体实现为 BFGS 方法),并结合 Armijo 线搜索方法,对一个多项式目标函数进行优化,找到其最优解。 开发语言:matlab非线性优化问题在科学计算和工程应用中非…...
基于背景减除的PIV颗粒图像时均灰度分布分析方法
基于背景减除的PIV颗粒图像时均灰度分布分析方法 摘要 粒子图像测速(PIV)技术广泛应用于流体力学实验研究,其原始图像中包含大量示踪颗粒的灰度信息。除了用于速度场计算外,颗粒灰度分布还可用于分析颗粒浓度、粒径分布及混合特性。本文提出了一套完整的图像处理流程,包…...
FSearch:极速文件搜索工具,让Linux文件查找告别等待
FSearch:极速文件搜索工具,让Linux文件查找告别等待 【免费下载链接】fsearch A fast file search utility for Unix-like systems based on GTK3 项目地址: https://gitcode.com/gh_mirrors/fs/fsearch 还在为Linux系统中查找文件而烦恼吗&#…...
深入OpenBMC构建系统:Yocto项目与BitBake实战解析(以Romulus平台为例)
深入OpenBMC构建系统:Yocto项目与BitBake实战解析(以Romulus平台为例) 在服务器硬件管理领域,OpenBMC作为开源基板管理控制器固件堆栈,正逐渐成为企业级设备的标准配置。不同于简单的固件烧录,OpenBMC的构建…...
HunyuanVideo-Foley保姆级教程:从零部署到音效生成的5个关键步骤
HunyuanVideo-Foley保姆级教程:从零部署到音效生成的5个关键步骤 1. 环境准备与镜像部署 1.1 硬件要求检查 在开始部署前,请确保您的设备满足以下最低配置要求: 显卡:NVIDIA RTX 4090/4090D(24GB显存)内…...
编译原理避坑指南:自顶向下语法分析的5个常见错误及解决方法
编译原理避坑指南:自顶向下语法分析的5个常见错误及解决方法 第一次接触自顶向下语法分析时,我盯着那个无限循环的递归文法整整三天没想明白——为什么明明按照教材步骤操作,程序却始终报错?直到助教指出我忽略了间接左递归的隐蔽…...
告别PS!用WPS宏批量改图片尺寸的隐藏技巧(附JSA API避坑指南)
告别PS!用WPS宏批量改图片尺寸的隐藏技巧(附JSA API避坑指南) 在电商运营、教育培训等日常工作中,批量处理图片是刚需。传统做法要么依赖Photoshop等专业软件(学习成本高),要么手动逐个调整&…...
建议收藏|盘点2026年顶尖配置的AI论文平台
一天写完毕业论文在2026年已不再是天方夜谭。以下是2026年最炸裂、实测能大幅提速的AI论文平台,覆盖选题构思、文献分析、内容生成、格式排版四大核心场景,帮你高效搞定论文。 一、全流程王者:一站式搞定论文全链路(一天定稿首选&…...
