ubuntu16.04上利用opencv目标跟踪工具实现8种目标跟踪

2023-11-17

一共八种工具,八种工具包括:

  • 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

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

 

 

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

ubuntu16.04上利用opencv目标跟踪工具实现8种目标跟踪 的相关文章

  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • 让 VoiceChannel.members 和 Guild.members 返回完整列表的问题

    每当我尝试使用 VoiceChannel members 或 Guild members 时 它都不会提供适用成员的完整列表 我从文本命令的上下文中获取 VoiceChannel 和 Guild 如下所示 bot command name
  • Gunicorn 工作人员无论如何都会超时

    我正在尝试通过gunicorn运行一个简单的烧瓶应用程序 但是无论我做什么 我的工作人员都会超时 无论是否有针对应用程序的活动 工作人员在我设置任何内容后总是会超时timeout值到 是什么导致它们超时 当我发出请求时 请求成功通过 但工作
  • 如何在 Matplotlib 饼图周围绘制箭头以将每个标签指向圆圈中各自的部分?

    我一直在用 Matplotlib 绘制一些图表 我有一个饼图 想要在图表周围绘制箭头 使每个标签都指向图表 我有一个例子 这是我当前的代码 import matplotlib pyplot as plt plt rcParams font
  • 为什么 dataclasses.astuple 返回类属性的深层副本?

    在下面的代码中astuple函数正在执行数据类的类属性的深层复制 为什么它不能产生与函数相同的结果my tuple import copy import dataclasses dataclasses dataclass class Dem
  • 在 Celery 任务中调用 Google Cloud API 永远不会返回

    我正在尝试拨打外部电话Google Cloud Natural Language API从一个内Celery任务 使用google cloud python包裹 问题是对 API 的调用永远不会返回 挂起 celery task def g
  • 我应该使用 Python 双端队列还是列表作为堆栈? [复制]

    这个问题在这里已经有答案了 我想要一个可以用作堆栈的 Python 对象 使用双端队列还是列表更好 元素数量较少还是数量较多有什么区别 您的情况可能会根据您的应用程序和具体用例而有所不同 但在一般情况下 列表非常适合堆栈 append is
  • 嵌套列表的重叠会产生不必要的间隙

    我有一个包含三个列表的嵌套 这些列表由 for 循环填充 并且填充由 if 条件控制 第一次迭代后 它可能类似于以下示例 a 1 2 0 0 0 0 0 0 4 5 0 0 0 0 0 0 6 7 根据条件 它们不重叠 在第二次迭代之后 新
  • 在 Django Admin 中调整字段大小

    在管理上添加或编辑条目时 Django 倾向于填充水平空间 但在某些情况下 当编辑 8 个字符宽的日期字段或 6 或 8 个字符的 CharField 时 这确实是一种空间浪费 字符宽 然后编辑框最多可容纳 15 或 20 个字符 我如何告
  • 为什么 web2py 在启动时崩溃?

    我正在尝试让 web2py 在 Ubuntu 机器上运行 所有文档似乎都表明要在 nix 系统上运行它 您需要下载源代码并执行以下操作 蟒蛇 web2py py 我抓住了source http www web2py com examples
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • 打印包含字符串和其他 2 个变量的变量

    var a 8 var b 3 var c hello my name is var a and var b bye print var c 当我运行程序时 var c 会像这样打印出来 hello my name is 8 and 3 b
  • 如何将特定范围内的标量添加到 numpy 数组?

    有没有一种更简单 更节省内存的方法可以单独在 numpy 中执行以下操作 import numpy as np ar np array a l r ar c a a 0 l ar tolist a r 它可能看起来很原始 但它涉及获取给定数
  • 未知错误:Chrome 无法启动:异常退出

    当我使用 chromedriver 对 Selenium 运行测试时 出现此错误 selenium common exceptions WebDriverException Message unknown error Chrome fail
  • 通过Python连接到Bigquery:ProjectId和DatasetId必须非空

    我编写了以下脚本来通过 SDK 将 Big Query 连接到 Python 如下所示 from google cloud import bigquery client bigquery Client project My First Pr
  • Django 视图中的“请求”是什么

    在 Django 第一个应用程序的 Django 教程中 我们有 from django http import HttpResponse def index request return HttpResponse Hello world
  • Python - 如何确定解析的 XML 元素的层次结构级别?

    我正在尝试使用 Python 解析 XML 文件中具有特定标记的元素并生成输出 excel 文档 该文档将包含元素并保留其层次结构 我的问题是我无法弄清楚每个元素 解析器在其上迭代 的嵌套深度 XML 示例摘录 3 个元素 它们可以任意嵌套
  • 找到一个数字所属的一组范围

    我有一个 200k 行的数字范围列表 例如开始位置 停止位置 该列表包括除了非重叠的重叠之外的所有类型的重叠 列表看起来像这样 3 5 10 30 15 25 5 15 25 35 我需要找到给定数字所属的范围 并对 100k 个数字重复该
  • 带有 LSTM 的 GridSearchCV/RandomizedSearchCV

    我一直在尝试通过 RandomizedSearchCV 调整 LSTM 的超参数 我的代码如下 X train X train reshape X train shape 0 1 X train shape 1 X test X test
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这

随机推荐

  • 第38讲 Android Camera2 API 通过CropRegion控制Zoom缩放

    本讲是Android Camera专题系列的第38讲 我们介绍Android Camera2 API专题的通过CropRegion控制Zoom缩放 包括如下内容 Android Zoom简介 如何查询当前Camera支持的Zoom能力 通过
  • pycharm中from,import文件/模块出现问题(最全方法)

    1 引用本地文件 如上图所示 在pycharm中可能会出现引用 本地项目文件夹中的 py文件出现问题的时候 这时我们需要考虑是否是IDE环境未将项目路径设置到引用环境变量中 有一下几种方法可以解决 1 这时可以通过sys path inse
  • iOS开源系列——OC框架排名列表

    Objective C框架排名 快点我
  • PRD文档范例,产品经理值得收藏的写作手册

    2015年 我写了一篇梳理PRD的文章 PRD到底该怎么写 获得3 5万次阅读 423次收藏 至今已过去5年 在这5年里 我一直从事产品产品相关的工作 也经历过一次完整的创业 对PRD又有了一些新的思考 这篇文章是 PRD怎么写 的升级版
  • 软件测试方法——静态测试与动态测试

    从测试方法的角度可以分为手工测试和自动化测试 1 静态测试 所谓静态测试 static testing 就是不实际运行被测软件 而只是静态地检查程序代码 界面或文档中可能存在的错误的过程 从概念中我们可以知道 其包括对代码测试 界面测试和文
  • Python re.match函数的使用详解

    正则表达式是用于匹配和操作文本的强大工具 在Python中 re模块提供了一组函数来处理正则表达式 其中 re match函数用于尝试从字符串的起始位置匹配一个模式 本文将详细介绍re match函数的使用方法 并提供相应的源代码示例 re
  • MiniDump不生成或者生成0字节

    今天在使用C写一个Windows多线程程序时 发现退出过程中有段错误 为了方便快速的定位问题 我使用了MiniDump MiniDump c源码如下 include
  • 2021年系统集成项目管理工程师(软考中级)连夜整理考前重点

    一 信息与信息化 1 信息论奠基者香农认为 信息就是能够用来消除不确定性的东西 8种状态需要3位比特表示 5位比特则可表示64种状态 信息 物质材料 能源是三大戓略资源 2 信息论两个层次 本体论和认识论 3 信息传输模型 信源 编码 信道
  • Qt鼠标单击与长按

    在Qt中 可以通过重载QWidget的mousePressEvent mouseReleaseEvent 和mouseMoveEvent 等事件来实现对鼠标事件的处理 判断鼠标是长按还是点击 可以通过记录鼠标按下的时间和释放的时间 通过两个
  • 15.DDT+unittest+excel ddt框架结合单元测试

    Excel读取数据的三种方式 1 一次性读取所有的数据 对内存的要求高点 必须掌握 2 需要用的时候读取所有的数据 就是磁盘读写要求高点 磁盘 速度最低 内存 速度中间 CPU 速度最高 3 使用DDT进行参数化 方法一 一次性读取所有的数
  • 缓存相关

    缓存雪崩怎么解决 如果缓存因为某个原因不可用 导致大量请求涌向数据库 可能会导致数据库崩溃 缓存雪崩目前主要有两种方案 1 使用集群 集群部署缓存 当一台宕机时 其他机器仍能提供缓存服务 2 Hystrix 熔断器 起到熔断 降级 限流三个
  • 文章内容无法复制复制不了

    一些文档 什么的复制不了 主要有几种方法 目录 1 禁用js 2 ctrl P打印 3 选中要复制的内容 gt 拖到网址输入框 另外 通过一些浏览器插件 感觉用处不大 1 禁用js 优点 可以直接复制原有段落文字的格式 缺点 有点麻烦 对百
  • 通俗理解三大范式

    关系型数据库中我们用的最多的就是第一范式 1NF 第二范式 2NF 第三范式 3NF 所以需要我们深入理解三大范式 第一范式 1NF 要求数据库的每一列都是不可分割的原子数据项 在上面的表中 家庭信息 和 学校信息 列均不满足原子性的要求
  • Windows下C语言操作硬件设备的方法

    本文作者 Fezl 本文原地址 http blog csdn net u010147522 article details 49912221 之前都是在linux下操作硬件设备 open read write ioctl 相当方便 最近要检
  • jQuery 入门教程(23): jQuery UI Autocomplete示例(一)

    AutoComplete 在获取焦点后 随着用户键入的内容 可以在预订的数据源中查找和已输入的内容相匹配的内容列表供用户选择 这可以用作之前输入过的内容也可以用作自动填充相关内容 比如根据城市名 自动填充邮编等 你可以使用本地数据源或是远程
  • nvm的安装及使用、下载cnpm以及git的配置

    nvm下载 下载图中安装包 下载完了就有这个 双击安装 路劲把C改为D即可 这是直接下载选择好安装路劲之后 没配置的环境变量 配置后的环境变量 1 文件夹设置 2 环境变量配置 查询nvm版本号 nvm常用命令如下 使用nvm下载 node
  • 适合初学者的强化学习教程(1): python使用gym实践和注意事项

    作者 知乎 Ai酱 安装步骤和报错问题 安装 pip install gym 报错 AttributeError module gym envs box2d has no attribute BipedalWalker 这是因为gym没有安
  • C语言for循环必备练习题

    话不多说 直接上题 笔者的一贯要求 速度 1 作业标题 663 关于while 条件表达式 循环体 以下叙述正确的是 假设循环体里面没有break continue return goto等等语句 作业内容 A 循环体的执行次数总是比条件表
  • 构造函数初始化列表

    目录 一 初始化列表 二 初始化列表的使用 三 注意 1 每个成员变量在初始化列表中只能出现一次 初始化只能初始化一次 2 类中包含以下成员 必须放在初始化列表位置进行初始化 3 尽量使用初始化列表初始化 因为不管你是否使用初始化列表 对于
  • ubuntu16.04上利用opencv目标跟踪工具实现8种目标跟踪

    一共八种工具 八种工具包括 BOOSTING Tracker 和Haar cascades AdaBoost 背后所用的机器学习算法相同 但是距其诞生已有十多年了 这一追踪器速度较慢 并且表现不好 但是作为元老还是有必要提及的 最低支持Op