目标跟踪(5)使用 Opencv 和 Python 进行对象跟踪

Python018

目标跟踪(5)使用 Opencv 和 Python 进行对象跟踪,第1张

在本教程中,我们将学习如何基于 Opencv 和 Python 实现对象跟踪。

首先必须明确目标检测和目标跟踪有什么区别:

我们将首先讨论对象检测,然后讨论如何将对象跟踪应用于检测。

可能有不同的应用,例如,计算某个区域有多少人,检查传送带上有多少物体通过,或者计算高速公路上的车辆。

当然,看过本教程后,您会很容易地想到数以千计的想法应用于现实生活或可能应用于工业。

在本教程中,我们将使用 3 个文件:

首先我们需要调用highway.mp4文件并创建一个mask:

正如您在示例代码中看到的,我们还使用了 createBackgroundSubtractorMOG2 函数,该函数返回背景比率(background ratio),然后创建mask。

mask可视化结果:

但是,如您所见,图像中有很多噪点。因此,让我们通过删除所有较小的元素来改进提取,并将我们的注意力集中在大于某个面积的对象上。

使用 OpenCV 的cv2.drawContours函数绘制轮廓,我们得到了这个结果。

就本教程而言,分析整个窗口并不重要。我们只对计算在某个点通过的所有车辆感兴趣,因此,我们必须定义一个感兴趣的区域 ROI 并仅在该区域应用mask。

结果可视化如下:

函数 cv2.createBackgroundSubtractorMOG2 是在开始时添加的,没有定义参数,现在让我们看看如何进一步改进我们的结果。history是第一个参数,在这种情况下,它设置为 100,因为相机是固定的。varThreshold改为 40,因为该值越低,误报的可能性就越大。在这种情况下,我们只对较大的对象感兴趣。

在继续处理矩形之前,我们对图像进行了进一步的清理。为此,阈值函数就派上用场了。从我们的mask开始,我们告诉它我们只想显示白色或黑色值,因此通过编写254, 255,只会考虑 254 和 255 之间的值。

然后我们将找到的对象的坐标插入到 if 条件中并绘制矩形

这是最终结果:

我们现在只需导入和集成跟踪功能。

一旦创建了对象,我们必须获取边界框的每个位置并将它们插入到单个数组中。

通过在屏幕上显示结果,您可以看到所有通过 ROI 的通道是如何被识别的,以及它们的位置是如何插入到特定的数组中的。显然,识别的摩托车越多,我们的数组就越大。

现在让我们将带有位置的数组传递给tracker.update()。我们将再次获得一个包含位置的数组,但此外,将为每个对象分配一个唯一的 ID。

从代码中可以看出,我们可以使用 for 循环分析所有内容。此时我们只需要绘制矩形并显示车辆 ID。

在图像中,您可以看到结果

main.py

从视频中也可以看到,我们已经获得了我们在本教程开始时设置的结果。

但是,您必须将其视为练习或起点,因为关于这个主题有很多话要说,而本教程的目的只是让您了解对象跟踪的原理。

如果你想将 Object Tracking 集成到你的项目中,你应该使用更可靠和先进的对象检测方法,以及跟踪方法。

完整代码地址:私信“333”直接获取或者「链接」

在这篇文章中,我们将介绍如何使用通过 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

Kinect 让人们重新审视微软的创新能力。Kinect 一上市就吸引了大量极客用户。一方面,你可以用 Kincet 做出超炫的效果,比如把光棍儿变光剑,另一方面,微软一直想把 Xbox 从游戏中心转变成一个娱乐中心,而不仅仅是游戏机。从今年假日季开始,Xbox 360 用户将可以通过一个界面访问大量电视娱乐节目,你还可以通过 Kinect 动作以及语音传感器控制这个界面。群众的力量是无穷的,Kinect 还有更多好玩儿的用途,比如控制机器人、试衣镜(这里有一些很赞的视频)。今天我们来介绍一款更加方便实用的 Kincet 开发工具 PyKinect。PyKinect 是一个编程工具,可以让你通过 Python 编写 Kinect 游戏。编程后的显示效果前后对比直接在调试器里设定突破点和 Explore Kinect 传感器数据环境要求:CPython 2.7PyGameKinect SDK (http://kinectforwindows.org/ 32-bit)语音支持(Kinect for Windows Runtime Language Pack, version 0.9)Kinect 传感器(无需 Xbox 360 就可以使用 PyKinect)Kinect 电源/USB 适配器一个安装:首先安装好 PTVS 和一个 CPython 解译器,然后安装 PyGame、Kinect SDK 和 PyKinect 。为了验证安装是否正确,打开 Tools/Python Tools/Samples/PyKinect,你应该可以把 PyKinect 安装到32位 Python 上:PyKinect 目前仅支持32位 CPython运行演示程序:File/New project/… /Kinect Game,也就是 Kinect 上的“hello world!”:Pykinect 和 Pygame 让编写 Kinect 游戏更加简单几点提示:PyKinect 不依赖于 Pygame。目前仅支持32位 CPython。如果你看不到轮廓跟踪,确保你的身体在传感器范围内。最后,别忘了把你开发的游戏分享出来。