在本教程中,我们将学习如何基于 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”直接获取或者「链接」
作为一个 开源 项目,一个由数百个贡献者组成的社区不断改进完善着 Jaeger。Jaeger 基于与供应商无关的 OpenTracing API 和工具。
共享出行公司 Uber 在 2015 年开发了开源项目 Jaeger 。2017 年,Jaeger 纳入云原生计算基金会(CNCF)的孵化项目,2019 年,Jaeger 正式毕业。
Jaeger 将执行请求显示为一条条迹线(trace)。迹线代表系统中的数据/执行路径。
一个迹线包含一个或多个跨度(span)。跨度是 Jaeger 中作业的逻辑单元。每个跨度都由作业名称、开始时间和持续时间组成。跨度可以进行嵌套和排序。
Jaeger 内含多个组件,这些组件可以协同工作,一起收集、存储和可视化跨度与迹线。
Jaeger 客户端包括含用于分布式跟踪的 OpenTracing API 的特定语言实施。您可以手动使用这些实施,也可以将其与各种开源框架一起使用。
Jaeger 代理是一个网络守护进程,可侦听通过用户数据报协议发送的跨度。该代理应与所检测的应用放置在同一主机上。这通常是通过 Kubernetes 等容器环境中的 sidecar 实现的。
Jaeger 收集器可接收跨度并将它们放在队列中等待处理。
收集器需要持久的存储后端,因此 Jaeger 还具有可插拔的跨度存储机制。
查询是一项从存储中检索迹线的服务。
Jaeger 控制台是用于直观查看分布式跟踪数据的用户界面。
Span: 跟踪的最小逻辑单位,包括操作名,操作开始时间,和操作耗时。Span间可以是嵌套关系
Trace: 一个Trace是由多个Span组成的有向无环图,代表一次完整的跟踪
https://www.jianshu.com/p/2f5d5638b8b0
1、服务内同步调用链路
2、服务内异步调用链路
使用参数注入的方式,修改入参值tracer_across_threads_scope_context将span信息传递到函数内
3、服务内其他服务跨到本服务调用链路
步骤:1、标记文件开始,并用来识别文件自己和字节顺序。
2、Major:2Byte:当前文件主要的版本号。
3、Minor:2Byte:当前文件次要的版本号。
4、ThisZone:4Byte:当地的标准时间,直接写00000000。Python由荷兰数学和计算机科学研究学会的吉多范罗苏姆于1990年代初设计,作为一门叫做ABC语言的替代品,Python提供了高效的高级数据结构,还能简单有效地面向对象编程。