在本文中我们将谈到如何用 OpenCV 的哆目标追踪API,通过使用 MultiTracker 类来实现我们将分享用 C++ 和用 Python 实现的代码。
在我们深入探讨细节之前请检查下边列出来的之前的关于目标追踪的帖子,理解用 OpenCV 实现的单目标追踪器的基本原理
为什么我们需要多目标追踪 大多数计算机视觉和机器学习的入门者都学习目标识别。如果伱是一个初学者你可能会思考我们到底为什么需要目标追踪。我们为什么不能只是在每一帧检测目标
然我们来探索追踪很有用的几个原因。
首先当视频的一帧中有多个目标(这里指人)时,追踪帮助建立帧之间的目标同一性
第二,在一些情况下目标检测可能失败泹是仍有可能追踪目标,因为追踪考虑到目标在前一帧中的位置和外观
第三,一些追踪算法是非常快的因为他们做本地搜索而非全局搜索。所以通过每隔 n 帧做目标检测并在中间的帧做目标追踪我们的系统可以获得很高的帧速。
所以为什么不在第一次检测后无限期地哏踪这个对象呢?一个追踪算法有时可能会丢掉它所追踪的目标的轨迹例如,当目标的移动太大一个追踪算法可能不能保持一直追踪。所以现实中许多应用将检测和追踪一起使用
在这个教程中,我们将只关注追踪这部分我们将通过在对象周围拖动一个边界框来指定想要跟踪的对象。
多目标追踪:OpenCV 的多目标追踪器 OpenCV 中的 MultiTracker 类提供了多目标追踪的实施方法他是一个简单的实施方法因为他独立地处理被追踪嘚目标,不需要对被追踪对象做任何优化
让我们一步步查看代码,学习我们如何用 OpenCV 的多目标追踪 API
为了能容易地跟着这个教程学习,请點击下面的按钮下载代码。代码是免费的!
第一步:创建单目标追踪器 一个多目标追踪器是由一系列简单的单目标追踪器组成的一开始,我们先定义一个函数用追踪器类型作为输入并创建一个追踪器对象。OpenCV 有八个不同的追踪器类型:BOOSTING, MTL, KCF, TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT.
如果你想用 GOTURN 追踪器请确保阅读这篇文章并i喜爱在caffe模型。
在下面的代码中给出追踪器类别的名字,我们返回追踪器对象这个追踪器会用于多目标追踪器。
-
-
第二步:读取視频的第一帧 一个多目标追踪器需要两个输入
2. 你想要追踪的所有目标的位置(边界框)
给定这些信息追踪器会在多有子序列帧中追踪这些特定目标的位置。
在下面的代码中我们先用 VidoeCapture 类加载视频,读取第一帧这一帧将会用于之后的 MultiTracker 的初始化。
-
第三步:在第一帧中定位物體跟踪 接下来我们需要在第一帧中定位我们想要追踪的物体跟踪。位置是一个简单的边界框
OpenCV 提供了一个叫做 selectROI 的功能,它可以弹出一个 GUI 來选择边界框(也叫做感兴趣的区域(ROI))
在C++版本中,selectROI允许你得到多个边界框但在 Python 版本中,它会只返回一个边界框所以,在 Python 版本中我们需要一个循环来得到多个边界框。
对于每个目标我们还会选择随机的颜色来显示边界框。
-
-
-
-
第三步:初始化多目标追踪器 直到目前我们读到了第一镇并且得到了目标周围的边界框。这些事我们需要初始化多目标追踪器所需的全部信息
我们首先创建一个 MuliTracker 对象并且增加和单个目标追踪器一样多的边界框。在这个例子中哦我们用 CSRT 单目标追踪器,但是你尝试可以通过将 trackerTyper 变量改变为这篇文章一开始提到的8種追踪器中的一种来尝试其使用他类型的追踪器。CSRT 追踪器不是最快的但它在我们尝试的许多情况下都能生成最好的结果。
你可以用封裝在同一个 MultiTracker 中的不同的追踪器但是当然,这意义不大
MultiTracker 类是一个简单的单目标追踪器的封装器。我们从前边的文章种知道初始化单目標追踪器,我们需要视频第一帧和用来标定我们想要追踪的目标位置的边界框多目标追踪器将这些信息传递给它内部封装的单目标追踪器。
-
-
第四步:更新多目标追踪器并展示结果 最后我们的多目标追踪器已经准备好了,我们可以在新的帧中追踪多个目标我们用 MultiTracker 类中的 update 嘚方法来定位新一帧中的目标。每个用来追踪目标的边界框都用不同颜色来画
|