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

Python017

目标跟踪(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

import base64

code = 'aW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHNodXRpbAppbXBvcnQgcmFuZG9tCgpkZWYgbWFpbigpOgogICAgcCA9IG9zLnBhdGguam9pbihvcy5jdXJkaXIsJ3RlbXAnKQogICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHApOgogICAgICAgIHByaW50KCfmnKrmib7liLB0ZW1w55uu5b2VJykKICAgICAgICBzeXMuZXhpdCgtMSkKICAgICMg6I635Y+W5paH5Lu25YiX6KGoCiAgICBmaWxlcyA9IGdldF9maWxlcyhwKQogICAgcHJpbnQoZiflhbHmib7liLAgW3tsZW4oZmlsZXMpfV0g5Liq5paH5Lu2JykKICAgICMg5Yib5bu65Zu+54mH5paH5Lu25aS5CiAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbihvcy5jdXJkaXIsJ+WbvueJhycpCiAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModGFyZ2V0X3BhdGgpOgogICAgICAgIG9zLm1rZGlyKHRhcmdldF9wYXRoKTsKICAgIGNudCA9IDAKICAgICMg5b6q546v5om+5Yiw5omA5pyJ5Zu+54mHLOW5tuaLt+i0nQogICAgZm9yIGYgaW4gZmlsZXM6CiAgICAgICAgZGF0YSA9IGZbOjotMV0uc3BsaXQob3Muc2VwKVswXVs6Oi0xXS5zcGxpdCgnLicpCiAgICAgICAgaWYgbGVuKGRhdGEpPjEgYW5kIGRhdGFbLTFdLmxvd2VyKCkgaW4gWydqcGcnLCdibXAnLCdwbmcnLCdnaWYnLCdqcGVnJ106CiAgICAgICAgICAgIG5ld19maWxlID0gZ2V0X25ld19maWxlbmFtZSh0YXJnZXRfcGF0aCwgZGF0YVstMV0pCiAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZShmLCBuZXdfZmlsZSkKICAgICAgICAgICAgY250ICs9IDEKICAgIHByaW50KGYn5YWx5ou36LSdIFt7Y250fV0g5Liq5Zu+54mHJykKCmRlZiBnZXRfbmV3X2ZpbGVuYW1lKHRhcmdldF9wYXRoLCBleHQpOgogICAgd2hpbGUgVHJ1ZToKICAgICAgICBuZXdfbmFtZSA9IG9zLnBhdGguam9pbih0YXJnZXRfcGF0aCwgZid7cmFuZG9tLnJhbmRpbnQoMTAwMDAwMDAwMCw5OTk5OTk5OTk5KX0ue2V4dH0nKQogICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhuZXdfbmFtZSk6CiAgICAgICAgICAgIHJldHVybiBuZXdfbmFtZQoKZGVmIGdldF9maWxlcyhwYXRoKToKICAgIGZpbGVzID0gW10KICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIocGF0aCk6CiAgICAgICAgcCA9IG9zLnBhdGguam9pbihwYXRoLGl0ZW0pCiAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwKToKICAgICAgICAgICAgZmlsZXMuZXh0ZW5kKGdldF9maWxlcyhwKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBmaWxlcy5hcHBlbmQocCkKICAgIHJldHVybiBmaWxlcwoKaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgIG1haW4oKQ=='

print(base64.b64decode(code).decode('utf-8'))

计算机毕业设计

基于Python的SIFT和KCF的运动目标匹配与跟踪 毕业论文+项目源码

基于Python决策树算法的学生学习行为数据分析 设计报告+代码及数据

基于Sring+bootstrap+MySQL的住房公积金管理系统 课程报告+项目源码及数据库文件

基于C++的即时通信软件设计 毕业论文+项目源码

基于JavaWeb+MySQL的图书管理系统 课程报告+项目源码及数据库文件

基于Android Studio+Android SDK的手机通讯录管理软件设计 课程报告+项目源码

基于JSP+MySQL的校园网上订餐系统 毕业论文+项目源码及数据库文件

基于AndroidStudio的花艺分享平台APP设计 报告+源码及APK文件

基于Python的酒店评论情感分析 课程报告+答辩PPT+项目源码

基于QT的教务选课管理系统设计与实现 毕业论文+项目源码

基于Android+Springboot+Mybatis+Mysql的个人生活APP设计 说明书+项目源码

基于Vue.js+Go的Web3D宇宙空间数据可视化系统 设计报告+前后端源码及数据

基于java+android+SQLite的保健型果饮在线销售APP设计 毕业论文+源码数据库及APK文件

基于Vue.js+SpringBoot+MyBatis+MySQL的高校综合资源发布分享社交二手平台 毕业论文+项目源码及数据库文件+演示视频

基于Delphi+MySQL的大学生竞赛发布及组队系统 设计报告+源码数据库及可执行文件+使用说明书

基于Android的名片信息管理系统设计与实现 毕业论文+任务书+外文翻译及原文+演示视频+项目源码

基于Python的电影数据可视化分析系统 设计报告+答辩PPT+项目源码

基于JavaWeb的企业公司管理系统设计与实现 毕业论文+答辩PPT+演示视频+项目源码

高校成绩管理数据库系统的设计与实现 毕业论文+项目源码

基于JavaWeb的家庭食谱管理系统设计与实现 毕业论文+项目源码及数据库文件

基于Python+SQLSERVER的快递业务管理系统的设计与实现 毕业论文+项目源码及数据库文件

基于Python的语音词频提取云平台 设计报告+设计源码

在推荐系统中引入 Serendipity 的算法研究 毕业论文+参考文献+项目源码

基于Html+Python+Django+Sqlite的机票预订系统 毕业论文+项目源码及数据库文件

基于Python的卷积神经网络的猫狗图像识别系统 课程报告+项目源码

基于C++的云安全主动防御系统客户端服务端设计 毕业论文+项目源码

基于JavaSSM的学生成绩管理APP系统设计与实现 毕业论文+答辩PPT+前后台源码及APK文件

基于JavaSwing+MySQL的清朝古代名人数据管理系统设计 毕业论文+任务书+项目源码及数据库文件

基于Python_Django的社会实践活动管理系统设计与实现 毕业论文

基于Servlet WebSocket MySQL实现的网络在线考试系统 毕业论文+项目源码

基于JavaWEB+MySQL的学生成绩综合管理系统 毕业论文+项目源码及数据库文件

基于SpringBoot+Vue和MySQL+Redis的网络课程平台设计与实现 毕业论文+任务书+开题报告+中期报告+初稿+前后台项目源码

基于Java的毕业设计题目收集系统 课程报告+项目源码

基于Java+Python+html的生产者与消费者算法模拟 毕业论文+任务书+项目源码

基于JavaWeb+MySQL的学院党费缴费系统 毕业论文+项目源码及数据库文件

基于Java+MySQL的学生成绩管理系统 毕业论文+任务书+答辩PPT+项目源码及数据库文件

基于Java+MySQL的学生和客户信息管理系统 课程报告+项目源码及数据库文件

基于Java的长整数加减法算法设计 毕业论文+项目源码

基于vue+MySQL的毕业设计网上选题系统 毕业论文+项目源码

基于背景建模和FasterR-CNN的视频前景和目标检测 毕业论文+答辩PPT+项目源码

基于Python的智能视频分析之人数统计的多种实现 毕业论文+答辩PPT+项目源码

基于C#+SQL server的校园卡消费信息管理系统 毕业论文+项目源码及数据库文件