使用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):当我们有一个快速的目标检测器时,在每一帧中检测多个对象,然后运行一个跟踪查找算法来识别一个帧中的哪个矩形与下一个帧中的矩形相对应是有意义的。

这些算法各有优缺点,可以根据实际应用场景选择适合的算法。

具体调用步骤如下:

  1. 打开视频帧第一帧
  2. 框选目标,每选择一个目标按Enter键确认选择
  3. 按Esc退出框选模式
  4. 程序执行跟踪算法并绘制预测框
#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;}
}

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

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

相关文章

软考之软件工程基础理论知识

软件工程基础 软件开发方法 结构化方法 将整个系统的开发过程分为若干阶段&#xff0c;然后依次进行&#xff0c;前一阶段是后一阶段的工作依据按顺序完成。应用最广泛。特点是注重开发过程的整体性和全局性。缺点是开发周期长文档设计说明繁琐&#xff0c;工作效率低开发前要…

Golang Gin 接口返回 Excel 文件

文章目录 1.Web 页面导出数据到文件由后台实现还是前端实现&#xff1f;2.Golang Excel 库选型3.后台实现示例4.xlsx 库的问题5.小结参考文献 1.Web 页面导出数据到文件由后台实现还是前端实现&#xff1f; Web 页面导出表数据到 Excel&#xff08;或其他格式&#xff09;可以…

One-to-N N-to-One: Two Advanced Backdoor Attacks Against Deep Learning Models

One-to-N & N-to-One: Two Advanced Backdoor Attacks Against Deep Learning Models----《一对N和N对一&#xff1a;针对深度学习模型的两种高级后门攻击》 1对N&#xff1a; 通过控制同一后门的不同强度触发多个后门 N对1&#xff1a; 只有当所有N个后门都满足时才会触发…

centos7完全卸载和安装mysql8

问题描述 最近安装了MYSQL8&#xff0c;遇到了各种问题&#xff0c;总体汇总一下&#xff0c;凡是无法启动就是my.cnf和初始化的参数不匹配。 第一种 启动前设置了mysqld --initialize --usermysql --lower-case-table-names1&#xff0c;my.cnf文件却没有修改就去启动。 第…

测试为什么分白盒、黑盒、单元、集成测试?

对于想进入测试行业的小萌新&#xff0c;本文的诉求主要分为三块&#xff1a; 1、想知道分为这么多种测试的原因 2、解决各种概念问题 3、提供各种软件测试工具 安排&#xff01; 一、为什么测试的概念这么多 一个软件项目就好比一部复杂的汽车&#xff0c;有很多零件&#x…

Java作业二

一、使用方法编写求圆面积和周长的程序&#xff0c;运行时提示输入圆半径&#xff0c;然后输出计算结果。运行效果如下图所示&#xff1a; import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner input new Scanner(System.in);Syste…

Vue使用Object.definedproperty的数据监听 使用js实现一种发布订阅的模式

Vue是一款流行的JavaScript框架&#xff0c;它可以帮助开发者构建交互式的Web应用程序。在Vue中&#xff0c;我们可以使用Object.definedproperty来实现数据的监听&#xff0c;也可以使用发布订阅模式来实现组件之间的通信。本文将详细讲解这两个主题&#xff0c;并提供代码注释…

pycharm更改远程服务器地址

一、问题描述 在运行一些项目时&#xff0c;我们常需要在pycharm中连接远程服务器&#xff0c;但万一远程服务器的ip发生了变化&#xff0c;该如何修改呢&#xff1f;我们在file-settings-python interpreter中找到远程服务器&#xff0c;但是发现ip是灰色的&#xff0c;没有办…

最新Ai智能创作系统源码V3.0,AI绘画系统/支持GPT联网提问/支持Prompt应用+搭建部署教程

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

docker--基本操作

第 1 章 Docker基础 1.1 docker简介 在这一部分我们主要讲两个方面&#xff1a; docker是什么、docker特点 1.1.1 docker是什么 docker是什么&#xff1f; docker的中文解释是码头工人。 官方解释&#xff1a; Docker是一个开源的容器引擎&#xff0c;它基于LCX容器技术&…

设计模式之两阶段终止模式

文章目录 1. 简介 2. 常见思路3. 代码实战 1. 简介 两阶段终止模式&#xff08;Two-Phase Termination Pattern&#xff09;是一种软件设计模式&#xff0c;用于管理线程或进程的生命周期。它包括两个阶段&#xff1a;第一阶段是准备阶段&#xff0c;该阶段用于准备线程或进程…

Go语言的键盘输入和打印输出

键盘输入和打印输出 一、打印输出 1.1 fmt包 fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb&#xff08;‘verb’&#xff09;源自C语言但更简单。 详见官网fmt的API&#xff1a;https://golang.google.cn/pkg/fmt/ 1.2 导入包 import "fmt"1.3 常…

elasticsearch中highlight的“假匹配”

elasticsearch中highlight的“假匹配” 一个highlight的假高亮现象&#xff1a; /company_meta_info/_search?rest_total_hits_as_inttrue {"_source": {"includes": ["name","address"]},"query": {"bool": {&…

[笔记] 字符串输入 #字符输入

字符串的多组输入格式 scanf("%c", &ch)读取单个字符&#xff0c;用EOF作为结束的判断标志。 刷题记录&#xff1a;[题] 查找最大元素 #字符输入 逐个字符手动读取&#xff0c;因为题目的要求&#xff0c;要对每个字符逐个操作&#xff0c;所以就输入的时候顺便…

android一些经验记录

1.应用程序闪退&#xff0c;连画面都没有&#xff0c;先去看看程序的xml文件中的控件是不是有错误。

C++:string类!

Cstring 是C中的字符串。 字符串对象是一种特殊类型的容器&#xff0c;专门设计来操作的字符序列。 不像传统的c-strings,只是在数组中的一个字符序列&#xff0c;我们称之为字符数组&#xff0c;而C字符串对象属于一个类&#xff0c;这个类有很多内置的特点&#xff0c;在操作…

软考 系统架构设计师系列知识点之设计模式(11)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之设计模式&#xff08;10&#xff09; 所属章节&#xff1a; 老版&#xff08;第一版&#xff09;教材 第7章. 设计模式 第2节. 设计模式实例 相关试题 10. 设计模式按照目的可划分三类&#xff0c;其中&#xff0c;…

某国产中间件企业:提升研发安全能力,助力数字化建设安全发展

​某国产中间件企业是我国中间件领导者&#xff0c;国内领先的大安全及行业信息化解决方案提供商&#xff0c;为各个行业领域近万家企业客户提供先进的中间件、信息安全及行业数字化产品、解决方案及服务支撑&#xff0c;致力于构建安全科学的数字世界&#xff0c;帮助客户实现…

c语言刷题(9周)(6~10)

输入10个不等的整数创建数组a[10]&#xff0c;在数组a中找是否存在整数t。若存在显示找到了及下标位置&#xff0c;若不存在显示error。 题干输入10个不等的整数创建数组a[10]&#xff0c;在数组a中找是否存在整数t。若存在显示找到了及下标位置&#xff0c;若不存在显示error…

进程空间管理:用户态和内核态

用户态虚拟空间里面有几类数据&#xff0c;例如代码、全局变量、堆、栈、内存映射区等。在 struct mm_struct 里面&#xff0c;有下面这些变量定义了这些区域的统计信息和位置。 unsigned long mmap_base; /* base of mmap area */ unsigned long total_vm; /* Total page…