SortTracker稳定追踪算法

        此算法为基于Hungarian算法和KalmanTracker算法所实现的稳定追踪算法。算法需要依赖opencv库,请确保安装opencv库并正确引入所需头文件。使用时请包含头文件./include/SortTracker.hpp,以及opencv库文件。源文件为./src/SortTracker.cpp

调用接口

算法整体包含在命名空间trk中,追踪接口为SortTracker类中的

list<TrackingBox> SortTracking(vector<TrackingInput>& inputs)

函数。输入为vector<TrackingInput>& inputs,代表需要跟踪的1帧中的目标数据。数组内部为TrackingInput结构体,记录了每一帧中识别的目标。结构内容如下文代码所示。内部变量成员_frame,_obj_id,_classes,_confidence,_box,分别代表帧编号(处理的哪一帧),目标id(识别的目标id),类别(检测目标类别),置信度,矩形框坐标(左上角坐标与矩形框的宽和高)。

struct TrackingInput //输入结构体
{int _frame=0;//帧编号int _obj_id=0;//帧目标idint _classes=0;//类别 0 or 1 float _confidence=0.0;//置信度 Rect_<float> _box;//矩形框左上角坐标与矩形框的宽和高
};

输出为list<TrackingBox>,代表一帧追踪后的结果,内部为TrackingBox结构体,表示每一个追踪目标的状态。结构体内容如代码下所示。内部成员包含_obj_id,_classes,_continuous,_disappear,_confidence,_box,分别代表追踪后的目标id,目标类别,连续命中帧数,连续消失帧数,置信度,目标矩形框的坐标(左上角坐标与矩形框的宽和高)。

struct TrackingBox //输出结构体
{int _obj_id=0;//目标idint _classes=0;//类别 0 or 1int _continuous=0;//连续命中几帧--kalman更新次数int _disappear=0;//连续消失几帧float _confidence=0.0;//置信度Rect_<float> _box;//矩形框左上角坐标与矩形框的宽和高
};

调用时采用SortTracker对象进行调用,创建SortTracker对象时可指定限制参数iou,max_age,min_hit,min_confidence分别代表交并比阈值,最大连续消失帧数阈值,最小连续命中帧数阈值,最小跟踪置信度阈值。iou的大小将影响内部预测框与检测框的重叠质量,越大则代表重叠质量越低。max_age表示跟踪对象在消失max_age帧后就不再追踪。min_hit表示对象只有连续命中min_hit帧后才被追踪输出。不指定参数具体数值将使用默认参数,追踪对象在连续消失3帧时被删除追踪,命中一帧就会追踪显示。最小置信度参数将保证只有大于最小置信度阈值的检测框才会进行稳定追踪。函数代码如下所示。

SortTracker(double iou=0.3,int max_age=3,int min_hit=0,float min_confidence=0.0)
:_iouThreshold(iou)
,_max_age(max_age)
,_min_hit(min_hit)
,_min_confidence(min_confidence)
{}

调用示例

下面代码为SortTracker的调用示例,代码将从输入文档testdata.txt中读取一行行的帧数据,并将数据按照帧号进行分组,填充到vector<vector<TrackingInput>> detFrameData中,其中每一行都代表一个需要追踪的帧。调用SortTracker实例对象st内部的SortTracking函数进行追踪,并将追踪结果list<TrackingBox> output写入输出文档test_output.txt。

void test1()
{cout <<"test SortTracking...." << endl;string filename = "./testdata.txt";//读取文件string outfile = "test_output.txt";//输出文件ifstream testfile;testfile.open(filename);ofstream resultfile;resultfile.open(outfile);if(!testfile.is_open()){cerr << "Error: can not find file " << filename << endl;return;}if (!resultfile.is_open()){cerr << "Error: can not create file " << outfile << endl;return;}//读取数据并将数据按照帧号进行分组string detLine;vector<TrackingInput> detData;while ( getline(testfile, detLine) ){istringstream ss;ss.str(detLine);TrackingInput tb;char ch;float tpx, tpy, tpw, tph, confidence;ss >> tb._frame >> ch >> tb._obj_id >> ch;ss >> tpx >> ch >> tpy >> ch >> tpw >> ch >> tph>>ch;ss >> confidence >> ch >> tb._classes;tb._confidence = confidence;ss.str("");tb._box = Rect_<float>(Point_<float>(tpx, tpy), Point_<float>(tpx + tpw, tpy + tph));//采用矩形框左上角和右下角坐标进行构建detData.push_back(tb);}testfile.close();int maxFrame = 0; //最大的帧分组数for (auto tb : detData) // find max frame number{//cout<<tb._frame<<endl;if (maxFrame < tb._frame)maxFrame = tb._frame;}vector<vector<TrackingInput>> detFrameData;vector<TrackingInput> tempVec;for (int fi = 0; fi < maxFrame; fi++){for (auto tb : detData)if (tb._frame == fi + 1) // frame num starts from 1tempVec.push_back(tb);detFrameData.push_back(tempVec);tempVec.clear();}//创建SortTracker对象,并将每帧数据进行追踪SortTracker st();cout<

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

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

相关文章

Linux进程信号总结

目录 信号入门 生活中的信号 技术应用角度的信号 信号的发送与记录 信号处理常见方式概述 产生信号 通过终端按键产生信号 通过系统函数向进程发信号 由软件条件产生信号 ​编辑 由硬件异常产生信号 阻塞信号 信号其他相关常见概念 在内核中的表示 sigset_t …

【Python】Arcpy将excel点生成shp文件

根据excel点经纬度数据&#xff0c;生成shp&#xff0c;参考博主的代码&#xff0c;进行了修改&#xff0c;在属性表中保留excel中的数据。 参考资料&#xff1a;http://t.csdnimg.cn/OleyT 注意修改以下两句中的数字。 latitude float(row[1]) longitude float(row[2])imp…

ARIMA模型(AutoRegressive Integrated Moving Average Model)

ARIMA模型&#xff08;AutoRegressive Integrated Moving Average Model&#xff09;是一种广泛应用于时间序列数据分析和预测的统计模型。该模型结合了自回归&#xff08;AR&#xff09;、差分&#xff08;I&#xff09;和移动平均&#xff08;MA&#xff09;三个主要组件&…

为什么MySQL会选择B+树作为索引

为什么MySQL会选择B树作为索引 在数据库管理系统中&#xff0c;索引是提升查询效率的关键技术之一。MySQL作为广泛使用的关系型数据库管理系统&#xff0c;其核心存储引擎InnoDB选择B树作为其索引结构&#xff0c;这一选择背后蕴含了深刻的性能和存储效率考量。本文将简要介绍…

输出调节求解跟踪问题(二阶线性系统)

本文研究了一种基于增广系统的领导者-跟随者控制框架&#xff0c;旨在实现跟随者系统对领导者参考信号的精确跟踪。首先&#xff0c;建立了跟随者和领导者的独立状态空间方程&#xff0c;分别描述了它们的动态行为和输出关系。随后&#xff0c;通过将两者的状态空间方程结合成增…

在Windows环境下安装pycharm

Python环境搭建 第一步下载安装python 等待安装完成 验证python是否安装成功 Python开发工具安装部署 JetBrains: Essential tools for software developers and teams PyCharm: the Python IDE for data science and web development 下载社区版本的PyCharm 双击打开下载好的…

Web 中POST为什么会发送两次请求

文章目录 前言一、浏览器的重试机制二、跨域请求与预检请求三、表单的自动提交四、服务器配置问题五、前端代码的重复执行六、同源策略与CORS总结 前言 我们在做Web开发时&#xff0c;经常会使用浏览器F12查看请求参数是否正确&#xff0c;但是会发现POST请求&#xff0c;一个地…

【运维资料大全】运维全套资料整理(word原件完整版)

信息安全类、运维类资料整合&#xff1a; 1. 等保测评模板 2. 安全检查表&#xff08;IDS&#xff0c;Linux&#xff0c;数据库&#xff0c;Tomcat&#xff0c;防火墙等&#xff09; 3. 服务器安全巡检表 4. 网络定向攻击风险分析表 5. 应用系统常规检测表 6. 企业漏洞管理50个…

TS 入门(三):Typescript函数与对象类型

目录 前言回顾1. 函数类型a. 基本函数类型b. 可选参数和默认参数c. 剩余参数 2. 对象类型a. 基本对象类型b. 可选属性和只读属性 3. 类型别名和接口a. 类型别名b. 接口扩展 4. 类型推断和上下文类型a. 类型推断b. 上下文类型 扩展知识点&#xff1a;函数重载结语 前言 在前两章…

【银河麒麟操作系统】虚机重启lvs丢失现象分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 环境及现象描述 40台虚机强制重启后&#xff0c;其中8台虚机找不到逻辑卷导致启动异常&#xff0c;后续通过pvcreate 修复重建pv&#xff0c;激活vg和lv并修复…

大模型基础知识-LoRA与QLoRA

介绍 LoRA 与 QLoRA 1. LoRA (Low-Rank Adaptation) LoRA 是一种用于大规模语言模型 (LLM) 的参数高效微调技术&#xff0c;旨在减少微调大模型所需的计算资源和存储空间。LoRA 的核心思想是将全量参数更新分解为低秩矩阵的形式&#xff0c;从而显著减少参数数量和计算开销。 …

WSL-Ubuntu20.04训练环境配置

1.YOLOv8训练环境配置 训练环境配置的话就仍然以YOLOv8为例&#xff0c;来说明如何配置深度学习训练环境。这部分内容比较简单&#xff0c;主要是安装miniAnaconda以及安装torch和torchvision. 首先是miniAnaconda的安装(参考官网的教程Miniconda — Anaconda )&#xff0c;执行…

CH552G使用IAP下载

常见下载中的方式ISP&#xff0c;IAP&#xff0c;ICP 参考&#xff0c;CH552G中文手册&#xff0c;参考1 ISP&#xff1a;In System Programing&#xff0c;在系统编程。是常见的&#xff0c;使用软件&#xff0c;先将某个引脚&#xff08;例如boot&#xff09;连接到合适的电…

Spring源码注解篇三:深入理解@Component注解

Component及其派生注解的源码 Spring框架作为Java开发中不可或缺的一部分&#xff0c;其依赖注入机制的核心是通过注解来实现的。本文将深入探讨Spring中Component及其派生注解的源码实现&#xff0c;分析Spring如何通过类路径扫描&#xff08;Classpath Scanning&#xff09;和…

【笔记】一起齿轮箱的故障和相应的数学模拟实验

1.齿轮箱故障一例 出处&#xff1a;设备的故障识别 GearBox的频谱图&#xff0c;原作者不知道是从哪里拷贝来的&#xff0c;待会儿确认一下。 齿轮啮合频率GMF等于齿数乘以齿轮转速频率&#xff1a; ★齿轮啮合频率两边有边频&#xff0c;间距为1X&#xff08;这是由冲击响应…

JS【实用教程】(2024最新版)

JS 简介 JavaScript 简称 JS&#xff0c;可运行于浏览器 或 node 环境。 JS 的特点 单线程——同一时间只能执行一个任务&#xff0c;多个任务时会排队&#xff0c;后续任务必须等到前一个任务结束才能开始执行。 为什么JavaScript不能有多个线程&#xff1f; 因为作为浏览器脚…

BERT架构的深入解析

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google在2018年提出的一种基于Transformer架构的预训练模型&#xff0c;迅速成为自然语言处理&#xff08;NLP&#xff09;领域的一个里程碑。BERT通过双向编码器表示和预训练策略&am…

17-5 向量数据库之野望5 - 使用 Rust 实现矢量数据库

​​​​​​ 与存储标量数据(如整数、字符串等)的传统数据库不同,矢量数据库旨在有效地存储和检索矢量数据——表示多维空间中的点的数值集合。 本文将探讨如何在 Rust 中实现基本的向量数据库。 让我们开始吧!🦀 什么是矢量数据库? 矢量数据库是一种针对存储和查询…

Neo4j数据库相关

Neo4j 使用指南 目录 什么是 Neo4jNeo4j 的特点Neo4j 的使用场景安装 Neo4j 使用 Docker 安装 Neo4j直接安装 Neo4j 启动和访问 Neo4j使用 Cypher 查询语言 创建节点和关系查询节点和关系更新和删除操作 使用 Python 访问 Neo4j 安装 py2neoPython 代码示例 高级功能和扩展 插…