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

news2024/12/23 10:41:03

【官方框架地址】 

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.coloradmin.cn/o/1829980.html

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

相关文章

【计算机组成原理】指令系统考研真题详解之拓展操作码!

计算机组成原理&#xff1a;指令系统概述与深入解析 1. 指令系统概述 计算机软硬件界面的概念 在计算机组成原理中&#xff0c;指令系统扮演着至关重要的角色&#xff0c;它是计算机软硬件界面的核心。软件通过指令与硬件进行通信&#xff0c;硬件根据指令执行相应的操作。指…

韩顺平0基础学java——第24天

p484-508 System类 常见方法 System.arrycopy&#xff08;src&#xff0c;0&#xff0c;dest&#xff0c;1,2&#xff09;&#xff1b; 表示从scr的第0个位置拷贝2个&#xff0c;放到目标数组索引为1的地方。 BigInteger和BigDecimal类 保存大整数和高精度浮点数 BigInte…

Unity的三种Update方法

1、FixedUpdate 物理作用——处理物理引擎相关的计算和刚体的移动 (1) 调用时机&#xff1a;在固定的时间间隔内&#xff0c;而不是每一帧被调用 (2) 作用&#xff1a;用于处理物理引擎的计算&#xff0c;例如刚体的移动和碰撞检测 (3) 特点&#xff1a;能更准确地处理物理…

RIP路由附加度量值(华为)

#交换设备 RIP路由附加度量值 RIP&#xff08;Routing Information Protocol&#xff09;路由协议中的附加度量值是指在RIP路由原来度量值的基础上所增加的额外度量值&#xff0c;通常以跳数来表示。这个附加度量值可以是正值&#xff0c;也可以是负值&#xff0c;用于影响路…

嵌入式学习记录6.14(练习)

#include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->resize(1028,783); //设置左侧背景QLabel *lab1new QLabel(this);lab1->…

慈善组织管理系统设计

一、用户角色与权限 慈善组织管理系统设计首先需要考虑的是用户角色与权限的划分。系统应明确区分不同的用户角色&#xff0c;如管理员、项目负责人、财务人员、捐赠者等&#xff0c;并为每个角色分配相应的权限。管理员应拥有最高的权限&#xff0c;能够管理系统全局&#xf…

集成学习方法:Bagging与Boosting的应用与优势

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

嵌入式数据库的一般架构

嵌入式数据库的架构与应用对象紧密相关&#xff0c;其架构是以内存、文件和网络等三种方式为主。 1.基于内存的数据库系统 基于内存的数据库系统中比较典型的产品是每个McObject公司的eXtremeDB嵌入式数据库&#xff0c;2013年3月推出5.0版&#xff0c;它采用内存数据结构&…

redis 缓存jwt令牌设置更新时间 BUG修复

大家好&#xff0c;今天我又又又来了&#xff0c;hhhhh。 上文中 我们永redis缓存了token 但是我们发现了 一个bug &#xff0c;redis中缓存的token 是单用户才能实现的。 就是 我 redis中存储的键 名 为token 值 是jwt令牌 &#xff0c;但是如果 用户a 登录 之后 创建一个…

动态规划日常刷题

力扣70.爬楼梯 class Solution {public int climbStairs(int n) {return dfs(n);}//递归 //注意每次你可以爬 1 或 2 个台阶//如果最后一步是1 就先爬到n-1 把它缩小成0-n-1的范围//如果最后一步是2 就先爬到n-2 把它缩小成0-n-2的范围 private int dfs(int i){if(i < 1){r…

EarMaster 7.2. 54中文永久下载和安装激活使用指南

视唱练耳是每一个音乐艺考生都需要掌握的基础技能&#xff0c;要求学生通过学习掌握对音程、和弦以及单音的听辨能力。不过学习的过程不是一蹴而就的&#xff0c;除了需要大量的时间以外&#xff0c;还需要一些视唱练耳软件辅助学习。今天给大家介绍&#xff0c;能听辨音程的软…

EasyRecovery2024手机数据恢复的神器,你值得拥有!

EasyRecovery是一款超级实用的数据恢复软件&#xff0c;它能够帮助你找回不小心删除、格式化或丢失的数据。无论是照片、音乐、视频&#xff0c;还是重要的工作文件&#xff0c;EasyRecovery都能帮助你轻松找回。 而且&#xff0c;EasyRecovery的操作非常简单&#xff0c;即使…

OpenCV中 haarcascades 级联分类器各种模型.xml文件介绍

haarcascades Haar Cascades 是一种用于对象检测的机器学习模型&#xff0c;特别是在OpenCV库中广泛使用。这些模型通过训练大量的正样本&#xff08;包含目标对象的图像&#xff09;和负样本&#xff08;不包含目标对象的图像&#xff09;来识别图像中的对象。Haar Cascades …

索引失效有效的11种情况

1全职匹配我最爱 是指 where 条件里 都是 &#xff0c;不是范围&#xff08;比如&#xff1e;,&#xff1c;&#xff09;&#xff0c;不是 不等于&#xff0c;不是 is not null&#xff0c;然后 这几个字段 建立了联合索引 &#xff0c;而且符合最左原则。 那么就要比 只建…

如何让视频有高级感 高级感视频制作方法 高级感视频怎么剪 会声会影视频剪辑制作教程 会声会影中文免费下载

高质量视频通常具有清晰的画面、优质的音频和令人印象深刻的视觉效果。这篇文章来了解如何让视频有高级感&#xff0c;高级感视频制作方法。 一、如何让视频有高级感 要让视频有高级感&#xff0c;要注意以下几个要点&#xff1a; 1、剧本和故事性&#xff1a;一个好的剧本和…

ATMEGA16读写24C256

代码&#xff1a; #include <mega16.h> #include <stdio.h> #include <i2c.h> #include <delay.h> // Declare your global variables here #define EEPROM_BUS_ADDRESS 0xa0 #asm.equ __i2c_port0x15.equ __sda_bit1 .equ __scl_bit0 #endasm uns…

C语言程序设计-6 循环控制

C语言程序设计-6 循环控制 循环结构是程序中一种很重要的结构。其特点是&#xff0c;在给定条件成立时&#xff0c;反复执行某程序 段&#xff0c;直到条件不成立为止。给定的条件称为循环条件&#xff0c;反复执行的程序段称为循环体。&#xff23;语 言提供了多种循环语句&a…

【Python/Pytorch - 网络模型】-- TV Loss损失函数

文章目录 文章目录 00 写在前面01 基于Pytorch版本的TV Loss代码02 论文下载 00 写在前面 在医学图像重建过程中&#xff0c;经常在代价方程中加入TV 正则项&#xff0c;该正则项作为去噪项&#xff0c;对于重建可以起到很大帮助作用。但是对于一些纹理细节要求较高的任务&am…

Go源码--sync库(3):sync.Pool(2)

回收 回收其实就是将 pool.local 置为空 可以让垃圾回收器回收 我们来看下 源码 func init() {// 将 poolCleanup 注册到 gc开始前的准备工作处理器中在 STW时执行runtime_registerPoolCleanup(poolCleanup) }这里注册了清理程序到GC前准备工作 也就是发生GC前需要执行这段代…

百递云·API开放平台「智能地址解析API」助力地址录入标准化

地址信息的正确录入&#xff0c;是保证后续物流配送环节能够顺畅运行的必备前提&#xff0c;错误、不规范的收寄地址将会产生许多困扰甚至造成损失。 ✦地址信息通常包含国家、省、城市、街道、楼宇、门牌号等多个部分&#xff0c;较为复杂&#xff0c;填写时稍有疏忽就会出现…