使用opencv的tracking模块跟踪目标
OpenCV跟踪模块算法介绍
OpenCV的tracking模块是一个功能强大的跟踪算法库,包含多种用于跟踪对象的算法。它可以帮助你在连续的视频帧中定位一个物体,例如人脸、眼睛、车辆等。
在OpenCV的tracking模块中,一些主要的跟踪算法包括:
- 稀疏光流(Sparse optical flow):例如Kanade-Lucas-Tomashi (KLT)特征跟踪算法,跟踪图像中几个特征点的位置。
- 卡尔曼滤波(Kalman Filtering):一种非常流行的基于先验运动信息的信号处理算法,用于预测运动目标的位置。这种算法的早期应用之一是导弹制导。
- Meanshift和Camshift:这是定位密度函数最大值的算法,它们还用于跟踪。
单目标跟踪器(Single object trackers):在这类跟踪器中,第一个帧使用矩形标记,以指示要跟踪的对象的位置。然后使用跟踪算法在后续帧中跟踪对象。在大多数实际应用程序中,这些跟踪器与对象检测器一起使用。 - 多目标跟踪查找算法(Multiple object track finding algorithms):当我们有一个快速的目标检测器时,在每一帧中检测多个对象,然后运行一个跟踪查找算法来识别一个帧中的哪个矩形与下一个帧中的矩形相对应是有意义的。
这些算法各有优缺点,可以根据实际应用场景选择适合的算法。
具体调用步骤如下:
- 打开视频帧第一帧
- 框选目标,每选择一个目标按Enter键确认选择
- 按Esc退出框选模式
- 程序执行跟踪算法并绘制预测框
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include "timestamp.hpp"using namespace cv;
using namespace std;//加载静态库
#if defined(_WIN32)&&defined(_DEBUG)
#pragma comment(lib, "opencv_world346d.lib")
#elif defined(_WIN32)
#pragma comment(lib, "opencv_world346.lib")
#endif// 支持的跟踪算法
vector<string> trackerTypes = { "BOOSTING", "MIL", "KCF", "TLD", "MEDIANFLOW", "GOTURN", "MOSSE", "CSRT" };// 根据名字创建跟踪器
Ptr<Tracker> createTrackerByName(string trackerType)
{Ptr<Tracker> tracker;if (trackerType == trackerTypes[0])tracker = TrackerBoosting::create();else if (trackerType == trackerTypes[1])tracker = TrackerMIL::create();else if (trackerType == trackerTypes[2])tracker = TrackerKCF::create();else if (trackerType == trackerTypes[3])tracker = TrackerTLD::create();else if (trackerType == trackerTypes[4])tracker = TrackerMedianFlow::create();else if (trackerType == trackerTypes[5])tracker = TrackerGOTURN::create();else if (trackerType == trackerTypes[6])tracker = TrackerMOSSE::create();else if (trackerType == trackerTypes[7])tracker = TrackerCSRT::create();else {cout << "Incorrect tracker name" << endl;cout << "Available trackers are: " << endl;for (vector<string>::iterator it = trackerTypes.begin(); it != trackerTypes.end(); ++it)std::cout << " " << *it << endl;}return tracker;
}// Fill the vector with random colors
void getRandomColors(vector<Scalar> &colors, int numColors)
{RNG rng(0);for (int i = 0; i < numColors; i++)colors.push_back(Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)));
}int help(char* argv[])
{std::cout << "please input arguments:" << argv[0] << "tracktype video.mp4 videoiotype"<< std::endl;return -1;
}int main(int argc, char * argv[])
{if(argc < 4){return help(argv);}cout << "默认算法是CSRT" << endl;cout << "支持的算法包括:" << endl;for (vector<string>::iterator it = trackerTypes.begin(); it != trackerTypes.end(); ++it)std::cout << " " << *it << endl;// 设置跟踪器类型。更改此设置以尝试不同的跟踪器。 字符串 trackerType;if(atoi(argv[1]) == 0)trackerType = "MOSSE";else if(atoi(argv[1]) == 1)trackerType = "KCF";elsetrackerType = "CSRT";// 设置跟踪算法和视频的默认值string videoPath = argv[2];// 使用跟踪算法初始化 MultiTrackervector<Rect> bboxes;// 创建视频捕获对象以读取视频cv::VideoCapture cap;if(atoi(argv[3]) == 0)cap.open(0);else{cap.open(videoPath);}Mat frame;// 如果取消读取视频文件,则退出if (!cap.isOpened()){cout << "Error opening video file " << videoPath << endl;return -1;}// read first framecap >> frame;// 在对象上绘制边界框// selectROI 的默认行为是从中心开始绘制框// 当 fromCenter 设置为 false 时,可以从左上角开始绘制框bool showCrosshair = true;bool fromCenter = false;cout << "\n==========================================================\n";cout << "OpenCV 表示按 c 取消对象选择过程" << endl;cout << "这是行不通的。按 Esc 键退出选择过程" << endl;cout << "\n==========================================================\n";cv::selectROIs("MultiTracker", frame, bboxes, showCrosshair, fromCenter);// quit if there are no objects to trackif (bboxes.size() < 1)return 0;vector<Scalar> colors;getRandomColors(colors, bboxes.size());// 创建多跟踪器Ptr<MultiTracker> multiTracker = cv::MultiTracker::create();// 初始化 Multitrackerfor (int i = 0; i < bboxes.size(); i++)multiTracker->add(createTrackerByName(trackerType), frame, Rect2d(bboxes[i]));// 处理视频和跟踪对象cout << "\n==========================================================\n";cout << "开始跟踪,按 ESC 键退出。" << endl;while (cap.isOpened()){// 从视频中获取帧cap >> frame;// 如果到达视频末尾,请停止程序if (frame.empty()) break;{timestamp ti("update");// 使用新帧更新跟踪结果multiTracker->update(frame);}// 绘制跟踪对象for (unsigned i = 0; i < multiTracker->getObjects().size(); i++){rectangle(frame, multiTracker->getObjects()[i], colors[i], 2, 1);}// 显示帧imshow("MultiTracker1", frame);// 退出 X 按钮if (waitKey(1) == 27) break;}
}
相关文章:
使用opencv的tracking模块跟踪目标
OpenCV跟踪模块算法介绍 OpenCV的tracking模块是一个功能强大的跟踪算法库,包含多种用于跟踪对象的算法。它可以帮助你在连续的视频帧中定位一个物体,例如人脸、眼睛、车辆等。 在OpenCV的tracking模块中,一些主要的跟踪算法包括࿱…...

Debian或Ubuntu静态交叉编译arm和aarch64
Debian或Ubuntu静态交叉编译arm和aarch64 介绍术语ARM架构前置条件从源代码编译一个简单的C程序configure和make交叉编译关于静态链接和依赖关系使用 musl libc 实现与 configure 和 make 进行交叉编译 ARM 正在获得越来越多的关注,并且越来越受欢迎。直接在这些基于…...

最新ai系统ChatGPT程序源码+详细搭建教程+以图生图+Dall-E2绘画+支持GPT4+Midjourney绘画
一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...

【设计模式】第16节:行为型模式之“命令模式”
一、简介 命令模式:将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、…...

安装pytorch报错torch.cuda.is_available()=false的解决方法
参考文章: https://blog.csdn.net/qq_46126258/article/details/112708781 https://blog.csdn.net/Andy_Luke/article/details/122503884 https://blog.csdn.net/anmin8888/article/details/127910084 https://blog.csdn.net/zcs2632008/article/details/127025294 …...

自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮
自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮 自定义表格的表头根据后端的数据进行筛选是否进行自定义表头添加按钮 <template><div class"box"><el-table :data"msgMapList" border class"table">&l…...

海上风电应急救援vr模拟安全培训提高企业风险防范能力
相比传统的发电厂,海上风电作业积累的经验少,风险高,因此为了规范施工人员的行为和操作,保障生产安全进行,开展海上风电VR安全培训具有重要意义。 有助于提高员工的安全意识 通过模拟真实的海上风电作业环境࿰…...

自定义SpringBoot启动图标
在SpringBoot项目的resources目录下创建banner.txt文件 在https://www.bootschool.net/网站上复制Ascll艺术字(图)粘贴到banner.txt中保存。 启动项目就会加载 可以修改颜色,和版本号 ${application.version} 输出版本 ${spring-boot.v…...

diffusers-Tasks
https://huggingface.co/docs/diffusers/using-diffusers/unconditional_image_generationhttps://huggingface.co/docs/diffusers/using-diffusers/unconditional_image_generation1.Unconditional image generation 无条件图像生成是一个相对简单的任务。模型仅生成图像&…...
文件下载漏洞, 漏洞原理, 测试方法, 漏洞防御, 常见敏感路径
文件下载漏洞 一, 文件下载漏洞原理 利用条件: 1. 读取文件的路径是用户可控, 且没有校验或检验不严. 2. 使用了读取文件的函数. 3. 输出了文件内容.漏洞场景一: 后端没有限制哪些路径的文件可以下载 后端代码: http://192.168.112.200/security/download.php $file_pat…...

【零参考GAN:Pansharpening】
ZeRGAN: Zero-Reference GAN for Fusion of Multispectral and Panchromatic Images (用于多光谱和全色图像融合的零参考GAN) 本文提出了一种融合低空间分辨率多光谱(LR MS)和高空间分辨率全色(PAN)图像的新的全色锐化方法–零参考生成对抗网络(ZeRGAN…...

Nacos 注册中心介绍与实操
前言 本文为个人SpringCloud学习笔记,主要记录Nacos的注册中心实操、SpringBoot多模块编程实操等 注册中心 注册中心介绍 注册中心是微服务的一个重要组件,用于实现服务的注册与发现,主要作用包括以下: 服务注册:…...

基于51单片机的智能手机充电器设计
**单片机设计介绍,1660【毕设课设】基于51单片机和MAX1898的智能手机充电器设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 51单片机智能手机充电器设计介绍 51单片机智能手机充电器是一种可以实现智能快速充电的…...
nginx 和gateway配置实现动静分离和反向代理
这两个配置文件分别是Nginx和Spring Cloud Gateway的配置文件,它们用于构建网关服务,进行请求的路由和转发。 前端发送请求的时候为了不暴露服务器地址,所以会使用nginx做反向代理的一个主要作用是隐藏后端服务器的真实地址,从而增加网络安全…...

【深度学习实验】网络优化与正则化(二):基于自适应学习率的优化算法详解:Adagrad、Adadelta、RMSprop
文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容0. 导入必要的库1. 随机梯度下降SGD算法a. PyTorch中的SGD优化器b. 使用SGD优化器的前馈神经网络 2.随机梯度下降的改进方法a. 学习率调整b. 梯度估计修正 3. 梯度估计修正:动量法Momen…...

系统韧性研究(3)| 工程系统韧性要求
从最基本的层面上说,系统韧性指的是系统在逆境中继续执行其任务的程度。虽然对操作连续性至关重要,但系统的服务(能力)只是系统继续执行其任务所必须保护的一些资产。该系统必须检测不利因素,对其作出反应,…...

.net 5 发布后swagger页面不显示问题
1:项目右键属性-》生成xml--用于swagger文件读取 2:开启文件配饰swagger读取指定文件...

Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)
目录 前言初始化数据库Docker 部署 xxl-job下载镜像创建容器并运行访问调度中心 SpringBoot 整合 xxl-jobpom.xmlapplication.ymlXxlJobConfig.java执行器注册查看 定时任务测试添加测试任务配置定时任务测试结果 结语附录xxl-job 官方文档xxl-job 源码测试项目源码 前言 xxl-…...

1985-2020年我国30m土地利用覆盖数据介绍
土地覆盖(LC)决定了地球各圈层之间的能量交换、水和碳循环。准确的 LC 信息是环境和气候研究的基本参数。考虑到在过去几十年中,随着经济建设的发展,中国发生了巨大的变化,连续和精细的 LC 监测是迫切需要的。然而,目前࿰…...

Django 社区志愿者管理系统
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 社区志愿者服务管理系统,主要的模块包括查看首页、个人中心、通知公告管理、志愿者管理、普通管理员管理、志愿活动管理、活动宣…...

Appium+python自动化(十二)- Android UIAutomator
Android团队在4.1版本(API 16)中推出了一款全新的UI自动化测试工具UiAutomator,用来帮助开发人员更有效率的完成App的Debug工作,同时对于测试人员也是一大福音,为什么这么说呢? UiAutomator提供了以下两种…...
DHCP 动态主机配置协议(Dynamic host configuration protocol)逐层封装过程: DHCP --> UDP --> IP
📦 DHCP 报文逐层封装结构(自上而下) 应用层(DHCP 报文) ↓ 传输层(UDP 首部) ↓ 网络层(IP 首部) ↓ 数据链路层(以太网帧头) ↓ 物理层&#x…...

408第一季 - 数据结构 - 字符串和KMP算法
闲聊 这章属于难点但考频低 3个名词记一下:模式匹配,主串,字串(模式串) 举个例子 主串 aabaaaabaab 字串 aabaab 模式匹配 从主串找到字串 暴力解法 也是不多说 很暴力就是了 KMP算法 next数组 它只和字串有关 先…...

sqlsugar WhereIF条件的大于等于和等于查出来的坑
一、如下图所示,当我用 .WhereIF(input.Plancontroltype > 0, u > u.Plancontroltype (DnjqPlancontroltype)input.Plancontroltype) 这里面用等于的时候,返回结果一条数据都没有。 上图中生成的SQL如下: SELECT id AS Id ,code AS …...

【JVM】三色标记法原理
在JVM中,三色标记法是GC过程中对象状态的判断依据,回收前给对象设置上不同的三种颜色,三色分为白色、灰色、黑色。根据颜色的不同,决定对象是否要被回收。 白色表示: 初始状态:所有对象未被 GC 访问。含义…...

【uniapp开发】picker组件的使用
项目uniapp,结合fastadmin后端开发 picker组件的官方文档说明 https://en.uniapp.dcloud.io/component/picker.html#普通选择器 先看效果: 1、实现设备类型的筛选;2、实现设备状态的筛选; 前端代码(节选࿰…...
caliper config.yaml 文件配置,解释了每个配置项的作用和注意事项
以下是添加了详细备注的 config.yaml 文件配置,解释了每个配置项的作用和注意事项: # Caliper 性能测试主配置文件 # 文档参考: https://hyperledger.github.io/caliper/# 测试轮次配置 - 可以定义多个测试轮次,每个轮次测试不同的合约或场景 rounds:# 第一个测试轮次 - 测试…...

SDC命令详解:使用set_min_capacitance命令进行约束
相关阅读 SDC命令详解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目录 指定最小需驱动电容值 指定对象列表/集合 简单使用 写在最后 set_min_capacitance命令用于设置输入端口的最小需驱动电容(设置了输入端口的min_c…...

固态继电器与驱动隔离器:电力系统的守护者
在电力系统中, 固态继电器合驱动隔离器像两位“电力守护神”,默默地确保电力设备的安全与稳定运行。它们通过高效、可靠的性能,保障了电力设备在各种环境下的正常工作。 固态继电器是电力控制中的关键组成部分,利用半导体器件来实…...

Ubuntu22.04 安装 Miniconda3
Conda 是一个开源的包管理系统和环境管理系统,可用于 Python 环境管理。 Miniconda 是一个轻量级的 Conda 发行版。Miniconda 包含了 Conda、Python和一些基本包,是 Anaconda 的精简版本。 1.下载安装脚本 在 conda官网 找到需要的安装版本࿰…...