用OpenCV实现目标追踪的八种方法(转)

2023-05-16

原文地址:http://m.elecfans.com/article/722414.html

编者按:目标跟踪作为机器学习的一个重要分支,加之其在日常生活、军事行动中的广泛应用,很多国内外学者都对此颇有研究。本文将讨论OpenCV上八种不同的目标追踪算法。

虽然我们熟知的的质心追踪器表现得很好,但它需要我们在输入的视频上的每一帧运行一个目标探测器。对大多数环境来说,在每帧上进行检测非常耗费计算力。

所以,我们想应用一种一次性的目标检测方法,然后在之后的帧上都能进行目标追踪,使这一任务更加快速、更高效。

这里的问题是:OpenCV能帮我们达到这种目标追踪的目的吗?

答案是肯定的。

OpenCV目标追踪

首先,我们会大致介绍八种建立在OpenCV上的目标检测算法。之后我会讲解如何利用这些算法进行实时目标追踪。最后,我们会比较各个OpenCV目标追踪的效果,总结各种方法能够适应的环境。

八种OpenCV目标追踪安装

无人机拍摄的视频,用MedianFlow进行目标追踪

你可能会惊讶OpenCV竟然有八种不同的目标追踪工具,他们都可以运用到计算机视觉领域中。

这八种工具包括:

BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的机器学习算法相同,但是距其诞生已有十多年了。这一追踪器速度较慢,并且表现不好,但是作为元老还是有必要提及的。(最低支持OpenCV 3.0.0)

MIL Tracker:比上一个追踪器更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)

KCF Tracker:比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)

CSRT Tracker:比KCF稍精确,但速度不如后者。(最低支持OpenCV 3.4.2)

MedianFlow Tracker:在报错方面表现得很好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)

TLD Tracker:我不确定是不是OpenCV和TLD有什么不兼容的问题,但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)

MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)

GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行,本文不详细讲解。(最低支持OpenCV 3.2.0)

我个人的建议:

如果追求高准确度,又能忍受慢一些的速度,那么就用CSRT

如果对准确度的要求不苛刻,想追求速度,那么就选KCF

纯粹想节省时间就用MOSSE

从OpenCV 3开始,目标检测器得到了快速发展,下表总结了不同版本的OpenCV中可食用的追踪器:

开始动手

想要用OpenCV进行目标追踪,首先打开一个新文件,将它命名为opencv_object_tracker.py,然后插入以下代码:

我们开始输入必须的安装包,确保你已经安装了OpenCV(我推荐3.4以上的版本),其次你要安装imutils:

输入安装包后,我们开始分析命令行参数:

我们的命令行参数包括:

--video:到达输入视频文件的替代路线。如果该参数失效,那么脚本将会使用你的网络摄像头。

--tracker:假设默认追踪器设置的是kcf,一整列可能的追踪器代码表示下一个代码块或下方的部分。

让我们处理追踪器的不同类别:

图2中我们提到,并不是所有追踪器都使用OpenCV 3以上的版本。在3.3版本上,同样发生了安装上的变化,在3.3之前,追踪器必须用cv2. Tracker_create创造,并且要在追踪器的名字上用大写字符串标注(22和23行)。

对于3.3以上的版本,每个追踪器可以用各自的函数创造,如cv2. TrackerKCF_create。词典OPENCV_OBJECT_TRACKERS包含了7种OpenCV的目标追踪器(30—38行)。它将目标追踪器的命令行参数字符串映射到实际的OpenCV追踪器函数上。

其中42行里的tracker目的是根据追踪器命令行参数以及从OPENCV_OBJECT_TRACKERS得来的相关重要信息。

注意:这里我没有将GOTURN加入到追踪器设置中因为它还需要额外的模型文件。

我们还对initBB进行初始化(46行),当我们用鼠标选中目标物体时,该变量会显示目标物体的边界框坐标。

接下来,让我们对视频流和FPS进行初始化:

49—52行是访问网络摄像头的步骤,这里我们设定一个一秒钟的暂停时间,好让摄像头传感器进行“热身”。

接着--video命令行参数会出现,所以我们可以从视频文件中对视频流进行初始化(55—56行)。

下面是从视频流中进行帧数迭代循环的步骤:

在65和66行中我们提取一个frame,同时在69和70行处理视频文件中没有帧数的情况。

为了让我们的算法处理帧数的速度更快,我们用resize将输入的视频帧调整为50像素(74行),这里处理的数据越少,速度就会越快。

之后,我们提取视频帧的宽度和高度,之后我们会用到高度(75行)。

目标物体选定之后,我们就可以用以下代码进行处理:

如果目标物体已经被选定,我们需要不断更新目标物体的位置,为了做到这一点,我们在80行使用update方法,它会定位目标物体的新位置并且返回一个success和box值。

如果顺利的话,我们可以在frame中得到更新后的边界框位置。注意,追踪器可能会跟丢目标物并且报错,所以success可能不会一直是True。接着更新FPS估计器。

接着,让我们展示一下frame,以及用鼠标选取目标物体:

我们将展示frame,并且继续迭代循环,键入其他指令才会停止。

当键入“s”后,我们用cv2.selectROI“选择”一个目标ROI。这一函数可以让你在视频暂停的时候手动选择一个ROI:

用户必须画出边界框后按回车或空格键来确定所选区域。如果你需要重新选择,就按“ESCAPE”键。

同样,我们还能用真实的目标探测器来进行手动选择。

最后,如果视频有更多的帧,或者出现了“quit”的情况,如何退出这一循环:

最后一个模块展示了我们如何停止循环,这时所有的指标都输出并且窗口关闭。

目标追踪结果

提示:为了确保你跟上本文的进度,并且用到了文章中的OpenCV方法,请先确保你在“下载资料”中下载了代码和视频。

之后,打开一个终端并执行以下命令:

如果你下载了本教程的源代码和视频,那么--video的可用参数在以下文件中:

american_pharoah.mp4

dashcam_boston.mp4

drone.mp4

nascar_01.mp4

nascar_02.mp4

race.mp4

……

--tracker中的参数在:

csrt

kcf

boosting

mil

tld

medianflow

mosse

你也可以用计算机的摄像头:

下面的实例会展示OpenCV的追踪器如何在较长一段时间中进行追踪,以及与短时间片段进行对比:

总结

这篇文章讲解了如何用OpenCV进行目标物体追踪。具体来说,我们回顾了库里的八种算法:

CSRF

KCF

Boosting

MIL

TLD

MedianFlow

MOSSE

GOTURN

我们可以将OpenCV的这八种追踪器用于不同的任务,包括短跑比赛、赛马、赛车、无人机追踪等高速视频上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用OpenCV实现目标追踪的八种方法(转) 的相关文章

随机推荐

  • stm32 串口发送多字节数据(结构体版本)

    话不多说先上代码 typedef struct shuju u8 sj0 帧头 u8 sj1 u8 sj2 u8 sj3 u8 sj4 u8 sj5 u8 sj6 u8 sj7 u8 sj8 u8 sj9 帧尾 shuju 实际使用 shu
  • C++ Primer Plus(第六版)读书笔记

    文章目录 C 43 43 Primer Plus xff08 第六版 xff09 第1章 预备知识第2章 开始学习C 43 43 2 1 进入C 43 43 2 2 1 main 指令 2 2 C 43 43 语句2 2 2 赋值语句 第3
  • STM32 (5) 自己写库 构建库函数雏形1 寄存器结构体定义

    前面把基础部分讲得差不多 xff0c 比如说什么是寄存器 xff0c 寄存器映射 xff0c 怎么样来寄存器编程 xff0c 寄存器编程的时候应该参考官方的什么手册 xff0c 前面讲了什么是寄存器 怎么使用寄存器编程 寄存器编程的时候应该
  • 编译器优化对自定义延时程序的影响(volatile详解实验一)

    由此可见 xff08 C语言volatile关键字详解 xff09 xff0c 编译器优化会对自定义延时程序有影响 xff0c 我们深入汇编程序去探讨产生怎样的影响 xff01 首先是未加 volatie 使用和未使用编译器优化汇编程序的对
  • C语言之大小端转换

    include lt stdio h gt unsigned int reverse byte char c char num unsigned int r 61 0 int i for i 61 0 i lt num i 43 43 r
  • 世界坐标系、相机坐标系和图像坐标系的转换

    相机标定笔记 坐标系转换四个不同类型的坐标系1 世界坐标系2 相机坐标系3 图像物理坐标系4 图像像素坐标系 坐标转换世界坐标 相机坐标 xff08 刚性变换 xff09 绕 X X X 旋转
  • 【C++】strpbrk() 字符串检索函数

    strpbrk 字符串检索函数 需要包含头文件 string h xff1b 声明 span class token keyword char span span class token operator span span class t
  • 干货 | 手把手教你搭建一套OpenStack云平台

    1 前言 今天我们为一位朋友搭建一套OpenStack云平台 我们使用Kolla部署stein版本的OpenStack云平台 kolla是用于自动化部署OpenStack的一个项目 xff0c 它基于docker和ansible来实现 xf
  • 完全卸载nginx的详细步骤

    一个执着于技术的公众号 前言 在开局配置Nginx时有可能会配置错误 xff0c 报各种错误代码 看不懂或者懒得去看这个报错时 xff0c 其实最简单的方式是卸载并重装咯 今天就带大家一起学习下 xff0c 如何彻底卸载nginx程序 卸载
  • Windows 11的这19个新功能,你都知道吗?

    参考资料 xff1a https www windowslatest com 2021 10 06 windows 11 new features everything you need to know Windows 11 是 Windo
  • HttpClient 4.3 - 实现HTTP摘要认证(Digest authentication)

    HttpClient 4 实现HTTP摘要认证 HttpClient 4 实现HTTP摘要认证 什么是摘要认证用DefaultHttpClient实现HttpClient 4 3 实现 什么是摘要认证 说到摘要认证 Digest authe
  • 全国DNS服务器IP地址大全、公共DNS大全

    各省公共DNS服务器IP大全 名称各省公共DNS服务器IP大全 114 DNS114 114 114 114114 114 115 115阿里 AliDNS223 5 5 5223 6 6 6百度 BaiduDNS180 76 76 76
  • 如何在CentOS7上禁用或关闭SELinux

    介绍 SELinux 是内置于 Linux 内核中的强制访问控制 MAC 执行器 它限制了可能对系统构成威胁的个别服务的权限 没有 SELinux 的 CentOS 系统依赖于其所有特权软件应用程序的配置 单个错误配置可能会危及整个系统 为
  • 运维常用的 35 个Linux Shell 脚本,一定能帮到你!

    作为一名 Linux 工程师 xff0c 会写好的脚本不仅能提高工作效率 xff0c 还能有更多的时间做自己的事 最近在网上冲浪的时候 xff0c 也注意收集一些大佬写过的脚本 xff0c 汇总整理一下 xff0c 欢迎收藏 xff0c 与
  • 超好用的开源 IP 地址管理系统,告别传统 Excel 统计方式!

    来自 xff1a 释然IT杂谈 一 前言 xff1a 对于运维管理人员 xff0c ip地址进行管理很重要 xff0c 很多公司都是采用电子文档的形式 xff0c 以手工更新为主 xff0c 对ip地址和子网的实际使用情况无法进行有效的实时
  • Linux运维从入门到精通,看这一篇就够了~

    作为一名 Linux 运维工程师 xff0c 总是会有种 书到用时方恨少 的感觉 xff0c 其根本原因还是技能掌握的不够扎实 所以运维朋友一定要多学习 xff0c 提升技能 xff0c 下面分享一份专门针对运维朋友的资料包 xff0c 相
  • K8S CPU 请求和限制,是否有很好的选择?

    Limits 和 Requests 并不是 CPU 管理的灵丹妙药 xff0c 在某些情况下 xff0c 其他替代方案可能是更好的选择 在这篇博文中 xff0c 您将了解到 xff1a CPU requests 如何工作CPU limits
  • 作为一名Linux用户,你得了解这15个工具!

    来源 xff1a 浩道Linux 在普通人眼里 xff0c 使用Linux系统的用户本身已经很有 极客范儿 了 xff0c 但是在技术人员眼中 xff0c 这只是很普通的层级 使用本文推荐的几个Linux系统下的工具 xff0c 能让你瞬间
  • 虚拟网络namespace 到bridge

    前言 容器的网络是一大难点 xff0c 不管是docker 还是kubernetes 都绕不开计算机网络 以下的介绍主要以计算机网络的namespace 和bridge 两个方面来展开介绍 xff0c 方便深入理解容器的网络原理 1 nam
  • 用OpenCV实现目标追踪的八种方法(转)

    原文地址 xff1a http m elecfans com article 722414 html 编者按 xff1a 目标跟踪作为机器学习的一个重要分支 xff0c 加之其在日常生活 军事行动中的广泛应用 xff0c 很多国内外学者都对