目标跟踪(3)MultiTracker : 基于 OpenCV (C++Python) 的多目标跟踪

Python015

目标跟踪(3)MultiTracker : 基于 OpenCV (C++Python) 的多目标跟踪,第1张

在这篇文章中,我们将介绍如何使用通过 MultiTracker 类实现的 OpenCV 的多对象跟踪 API。我们将共享C++ 和 Python 代码。

大多数计算机视觉和机器学习的初学者都学习对象检测。如果您是初学者,您可能会想为什么我们需要对象跟踪。我们不能只检测每一帧中的对象吗?

让我们来探究一下跟踪是有用的几个原因。

首先,当在视频帧中检测到多个对象(例如人)时,跟踪有助于跨帧建立对象的身份。

其次,在某些情况下,对象检测可能会失败,但仍可能跟踪对象,因为跟踪考虑了对象在前一帧中的位置和外观。

第三,一些跟踪算法非常快,因为它们做的是局部搜索,而不是全局搜索。因此,我们可以通过每n帧进行目标检测,并在中间帧中跟踪目标,从而为我们的系统获得很高的帧率。

那么,为什么不在第一次检测后无限期地跟踪对象呢?跟踪算法有时可能会丢失它正在跟踪的对象。例如,当对象的运动太大时,跟踪算法可能跟不上。许多现实世界的应用程序同时使用检测和跟踪。

在本教程中,我们只关注跟踪部分。我们想要跟踪的对象将通过拖动它们周围的包围框来指定。

OpenCV 中的 MultiTracker 类提供了多目标跟踪的实现。它是一个简单的实现,因为它独立处理跟踪对象,而不对跟踪对象进行任何优化。

让我们逐步查看代码,了解如何使用 OpenCV 的多目标跟踪 API。

2.1 第 1 步:创建单一对象跟踪器

多目标跟踪器只是单目标跟踪器的集合。我们首先定义一个函数,该函数接受一个跟踪器类型作为输入,并创建一个跟踪器对象。OpenCV有8种不同的跟踪器类型:BOOSTING, MIL, KCF,TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT。

如果您想使用 GOTURN 跟踪器,请务必阅读这篇文章并下载 caffe 模型。

在下面的代码中,给定跟踪器类的名称,我们返回跟踪器对象。这将在稍后用于多目标跟踪器。

Python

C++

2.2 第 2 步:读取视频的第一帧

多目标跟踪器需要两个输入

给定这些信息,跟踪器在所有后续帧中跟踪这些指定对象的位置。 在下面的代码中,我们首先使用 VideoCapture 类加载视频并读取第一帧。这将在稍后用于初始化 MultiTracker。

Python

C++

2.3 第 3 步:在第一帧中定位对象

接下来,我们需要在第一帧中定位我们想要跟踪的对象。该位置只是一个边界框。 OpenCV 提供了一个名为 selectROI 的函数,该函数会弹出一个 GUI 来选择边界框(也称为感兴趣区域 (ROI))。 在 C++ 版本中,selectROI 允许您获取多个边界框,但在 Python 版本中,它只返回一个边界框。所以,在 Python 版本中,我们需要一个循环来获取多个边界框。 对于每个对象,我们还选择一种随机颜色来显示边界框。 代码如下所示。

Python

C++

getRandomColors 函数相当简单

2.4 第 3 步:初始化 MultiTracker

到目前为止,我们已经读取了第一帧并获得了对象周围的边界框。这就是我们初始化多目标跟踪器所需的所有信息。

我们首先创建一个 MultiTracker 对象,并向其中添加与边界框一样多的单个对象跟踪器。在此示例中,我们使用 CSRT 单对象跟踪器,但您可以通过将下面的 trackerType 变量更改为本文开头提到的 8 个跟踪器之一来尝试其他跟踪器类型。 CSRT 跟踪器不是最快的,但在我们尝试的许多情况下它产生了最好的结果。

您还可以使用包裹在同一个 MultiTracker 中的不同跟踪器,但当然,这没什么意义。

MultiTracker 类只是这些单个对象跟踪器的包装器。正如我们从上一篇文章中知道的那样,单个对象跟踪器是使用第一帧初始化的,并且边界框指示我们想要跟踪的对象的位置。 MultiTracker 将此信息传递给它在内部包装的单个对象跟踪器。

Python

C++

2.5 第 4 步:更新 MultiTracker 并显示结果

最后,我们的 MultiTracker 已准备就绪,我们可以在新帧中跟踪多个对象。我们使用 MultiTracker 类的 update 方法来定位新框架中的对象。每个跟踪对象的每个边界框都使用不同的颜色绘制。

Python

C++

C++

Python

OpenCV 2.0已经发布5年了,它带来了全新的C++接口,标志着这个项目的开始。在2.0的整个生命周期中,我们增加了新的平台支持,包括iOS和Andriod,通过CUDA和OpenCL实现了GPU加速,为Python和java用户提供了接口,基于github和buildbot构建了充满艺术感的持续集成系统,所以才有了稳定的OpenCV 2.4.x,它被全世界的很多公司和学校所采用。

现在,我们很高兴地宣布3.0时代的开始(OpenCV 3.0 release 预计会在今年圣诞节左右发布)。在3.0时代不会有像2.0时代一样激进的尝试,它有足够稳定的改进,这为我们,也为你们以及伟大的OpenCV社区带来了许多全新的机会。请查看更新日志,我们简要说几点。

1. 项目架构的改变。

最初的时候,OpenCV是一个相对整体的项目,都是以整体的形式构建和装配,在很多年的时间里,这都是一个很好的策略。然而,随着功能的增加,包括bleeding-edge算法发布前的几分钟,一个pull请求提交到我们的仓库,越来越多的贡献者(非常感谢你们),我们决定像其他大项目一样,抛弃整体架构,使用内核+插件的架构形式。

除了我们的主仓库和增加的”test data“仓库,我们还有了http://github.com/itseez/opencv_contrib,这里有很多让人兴奋的功能,包括你们已经知道的面部识别和文本探测,还包括文本识别、新的边缘检测器、充满艺术感的修复、深度地图处理、新的光线流和追踪算法等。

opencv与opencv_contrib之间的区别是:

他们都由我们的持续集成系统维护,尽管opencv_contrib的单元测试并不常规运行。

全部或者一些额外的模块可以用我们的构建系统构建,把OPENCV_EXTRA_MODULES_PATH=/modules传递给CMake。

contrib的文档是自动生成的,可以在docs.opencv.org/master获得,它会在OpenCV 3.0 beta版本的时候更加完善、并发布。

主OpenCV是Itseez支持的代码,有非常稳定的API以及一点点创新。

opencv_contrib是大多数实验性代码放置的地方,一些API可能会改变,我们欢迎贡献者贡献你们新的精彩算法。

2. 感谢Intel和AMD公司的支持,我们让很多视觉算法实现的GPU加速,并且对于用户来说,都是十分易得的。这个技术可以称之为T-API (“transparent API”),关于这个话题的单独指南在准备当中,仍然非常欢迎你来看一下,试一下我们的T-API的例子,研究一下它如何工作。

3. Intel公司还给了我们另一份大礼。IPP的一个子集默认接入OpenCV,用户可以轻松得到。其中包含了可以将使用IPP加速的OpenCV再次分发的许可。如下图所示,在IPP的帮助下,很多函数都实现了显著的加速。

4. 最后,OpenCV 3.0带来了很新的功能,这是其中的一部分:

Text detection and recognition by Lluis Gomez

HDR by Fedor Morozov and Alexander Shishkov

KAZE/A-KAZE by Eugene Khvedchenya, the algorithm author Pablo Alcantarilla and some improvements by F. Morozov.

Smart segmentation and edge-aware filters by Vitaly Lyudvichenko, Yuri Gitman, Alexander Shishkov and Alexander Mordvintsev

Car detection using Waldboost, ACF by Vlad Shakhuro and Nikita Manovich

TLD tracker and several common-use optimization algorithms by Alex Leontiev

Matlab bindings by Hilton Bristow, with support from Mathworks.

Greatly extended Python bindings, including Python 3 support, and several OpenCV+Python tutorials by Alexander Mordvintsev, Abid Rahman and others.

3D Visualization using VTK by Ozan Tonkal and Anatoly Baksheev.

RGBD module by Vincent Rabaud

Line Segment Detector by Daniel Angelov

Many useful Computational Photography algorithms by Siddharth Kherada

Shape descriptors, matching and morphing shapes (shape module) by Juan Manuel Perez Rua and Ilya Lysenkov

Long-term tracking + saliency-based improvements (tracking module) by Antonella Cascitelli and Francesco Puja

Another good pose estimation algorithm and the tutorial on pose estimation by Edgar Riba and Alexander Shishkov

Line descriptors and matchers by Biagio Montesano and Manuele Tambourin

Myriads of improvements in various parts of the library by Steven Puttemansthank you a lot, Steven!

Several NEON optimizations by Adrian Stratulat, Cody Rigney, Alexander Petrikov, Yury Gorbachev and others.

Fast foreach loop over cv::Mat by Kazuki Matsuda

Image alignment (ECC algorithm) by Georgios Evangelidis

GDAL image support by Marvin Smith

RGBD module by Vincent Rabaud

Fisheye camera model by Ilya Krylov

OSX framework build script by Eugene Khvedchenya

Multiple FLANN improvements by Pierre-Emmanuel Viel

Improved WinRT support by Gregory Morse

Latent SVM Cascade by Evgeniy Kozhinov and NNSU team (awaiting integration)

Logistic regression by Rahul Kavi

Five-point pose estimation algorithm by Bo Li

springboot是什么框架

1. Spring Boot是什么,解决哪些问题 1) Spring Boot使编码变简单 2) Spring Boot使配置变简单 3) Spring Boot使部署变简单 4) Spring Boot使监控变简单 5) Spring Boot的不足 2. Spring Boot在平台中的定位,相关技术如何融合 1) SpringBoot与S...

springboot框架

你说的应该是web容器吧 springboot有自带的tomcat 和ty

springboot框架怎么搭建

目前java方面,我了解到 用jersey框架来搭建restful服务,据说jersey框架对restful服务来说是比较原汁原味的,你可以去了解一下。 用springMVC这个也是restful的风格 目前springMVC比较流行,看你想用哪个了

如何搭建一个springboot +mybatis+gradle框架

parameter'articleName'notfound.这个引数没有找到,你看是否传进来了,或者是否在配置档案中注入了。

jsp 框架是什么 WebWork是由OpenSymphony组织开发的,致力于元件化和程式码重用的拉出式MVC模式J2EE

Web框架。WebWork目前最新版本是2.1,现在的WebWork2.x前身是Rickard

Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个专案。

Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。

Xwork提供了很多核心功能:前端拦截机(interceptor),执行时表单属性验证,型别转换,强大的表示式语言(OGNL – the Object

Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。

WebWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使用ServletDispatcher将HTTP请求的变成Action(业务层Action类),

session(会话)application(应用程式)范围的对映,request请求引数对映。WebWork2支援多视图表示,检视部分可以使用JSP,

Velocity, FreeMarker,

JasperReports,XML等。在WebWork2.2中添加了对AJAX的支援,这支援是构建在DWR与Dojo这两个框架的基础之上。

2.Struts是一个基于Sun

J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和资讯资源(message

resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个非常不错的应用框架。

3.EasyJWeb是基于java技术,应用于WEB应用程式快速开发的MVC框架,框架设计构思来源于国内众多专案实践,框架充分借签了当前主要流行的开源Web框架(Struts、JSF、Tapestry

、Webwork),吸取了其优点及精华,利用Velocity作为模板页面引擎,是一个实现了页面及程式码完全分离的MVC开发框架。是一个能实现中小型Web应用系统快速开发的简易Web框架。

通过EasyJWeb

Tools提供的配套开发工具,可以实现基于EasyJWeb框架的Web应用快速开发,包括常用应用软体的程式码自生成、资料库添删改查(CRUD)程式码生成、自动页面模版生成、配置档案管理等。

框架特点:

1、零配档案置支援。接触一个开发框架,开始总都要被它的配置档案折腾一番。EasyJWeb实现零配置支援,可以不写一句配置档案就在框架基础上构建运用。(适合小型网站系统)。

2、简易的模板页面设计支援:放弃使用jsp,使用简单Velocity指令码语言作为页面模板。

3、页面程式完全分离:实现显示页面与程式逻辑的完全分离,克服了传统jsp页面难于维护的问题。

4、基于页面元件的框架。灵活的页面元件配置,可以直接通过配置档案设定栏位级的事件元件。

5、快速开发支援:通过EasyJWeb

Tools,可以自动生成应用软体模板程式码,定制并管理自己的J2EE程式码模板,程式码生成模板支援最流行的实用Java开发框架(如hibernate、Spring等)实现快速开发

Extjs框架是什么

ExtJS是一个Ajax框架,是一个用javascript写的,用于在客户端建立丰富多彩的web应用程式介面。ExtJS可以用来开发RIA也即富客户端的AJAX应用。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。

ExtJs最开始基于YUI技术,由开发人员JackSlocum开发,通过参考JavaSwing等机制来组织视觉化元件,无论从UI介面上CSS样式的应用,到资料解析上的异常处理,都可算是一款不可多得的JavaScript客户端技术的精品。

Ext的UI元件模型和开发理念脱胎、成型于Yahoo元件库YUI和Java平台上Swing两者,并为开发者遮蔽了大量跨浏览器方面的处理。相对来说,EXT要比开发者直接针对DOM、W3C物件模型开发UI元件轻松。

title框架是什么

Tiles框架为建立Web页面提供了一种模板机制,它能将网页的布局和内容分离。它允许先建立模板,然后在执行时动态地将内容插入到模板中。Tiles 框架建立在JSP的include指令的基础上,但它提供了比JSP的 include指令更强大的功能。Tiles框架具有如下特性:

??建立可重用的模板

??动态构建和装载页面

??定义可重用的Tiles元件

??支援国际化

Tiles框架包含以下内容:

??Tiles标签库

??Tiles元件的配置档案

??TilesPlugIn外挂

在开发Web站点时,常常要求同一站点的所有Web页面保持一致的外观,比如有相同的布局、页头、页尾和选单。

采用基本的JSP语句建立复合式网页

建立动态Web页面的最基本的办法是为每个页面建立独立的JSP档案。如果网页的相同部分发生需求变更,必须手工修改所有的JSP档案。可见,采用基本的JSP语句来编写上述网页,会导致JSP程式码的大量冗余,增加开发与维护成本。

采用JSP的include指令建立复合式网页

为了减少程式码的冗余,可以把index.jsp和product.jsp中相同部分放在单独的JSP档案中,然后在index.jsp和 product.jsp档案中通过JSP include指令把其他JSP档案包含进来。这样提高了程式码的可重用性。但是JSP include指令不能完全避免程式码冗余,尽管这种方案减少了重复程式码,但JSP档案的数量增加了,由原来的2个档案增加到7个档案,所以软体的复杂度也增加了。

采用Tiles:Insert标签建立复合式网页

Tiles标签库的tiles:insert标签和JSP include指令具有相同的功能,也能把其他的JSP页面插入到当前页面中。用tiles:insert标签取代JSP include指令来建立复合式页面,程式码仅有稍微的差别,两者的利弊也很相似。单纯使用tiles:insert标签来建立复合式页面,还没有充分发挥 Tiles框架的优势。

以下两条语句的作用是相同的:

<jsp:include page="indexContent.jsp"/>

<tiles:insert page="indexContent.jsp"/>

采用Tiles模板建立复合式网页

尽管使用了tiles:insert标签,index.jsp和product.jsp档案还是存在很多的重复程式码。为了提高Web页面的可重用性和可维护性,可以引入Tiles的模板机制。通俗的讲,Tiles模板是一种描述页面布局的JSP页面。Tiles模板仅仅定义Web页面的样式,而不指定内容。在Web应用执行时,才把特定内容插入到模板页面中。同一模板可以被多个Web页面共用。使用模板,可以轻松的实现Web应用的所有页面保持相同的外观和布局,无需为每个页面硬编码。在一个应用中,大多数页面使用同一模板,某些页面可能需要不同的外观,使用其他的模板,因此一个应用可能有一个以上模板。

<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>

<tiles:insert attribute="sidebar"/>

<tiles:insert attribute="header"/>

<tiles:insert attribute="content"/>

<tiles:insert attribute="footer"/>

<%@ page contentType="text/charset=UTF-8" %>

<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>

<tiles:insert page="layout.jsp" flush="true">

<tiles:put name=sidebar value="sidebar.jsp"/>

<tiles:put name=header value="header.jsp"/>

<tiles:put name=content value="indexContent.jsp"/>

<tiles:put name=footer value="footer.jsp"/>

</tiles:insert>

python框架是什么

你说的是,网路框架吧?

简单说:

Django

Grok

Pylons

TurboGears

web2py

Zope2

复杂说:

自己去看:

【整理】Python中常见的Web框架

(此处不给帖地址,请自己用google搜标题,就可以找到帖子地址了)

Junit框架是什么

JUnit是一个开放原始码的Java测试框架,用于编写和执行可重复的测试。他是用于单元测试框架体系xUnit的一个例项(用于java语言)。它包括以下特性:  

 1、用于测试期望结果的断言(Assertion)

2、用于共享共同测试资料的测试工具  

 3、用于方便的组织和执行测试的测试套件  

 4、图形和文字的测试执行器

(来自百度百科)

dorado是什么框架?

dorado 是上海锐道公司开发的展现层中介软体,能与目前的Spring ,hibernate等开源框架结合,使开发的速度能大大提高,它可以java web开发,前端应用,很容易上手