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

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

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

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

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

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

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

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

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


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

mask可视化结果:

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


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

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


结果可视化如下:

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


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

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


这是最终结果:

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


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

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

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

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

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


mainpy


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

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

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

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

之前写的微信抢红包软件效果还可以,反正过年家里的群里面的红包永远是我第一个抢到;其实微信抢红包还是比较简单的,稍微理一下逻辑也是比较容易实现的,基本上没什么难点。但是想要实现自动偷取蚂蚁森林的能量还是有点难度的,这里分享一下实现思路。

功能是这样的,运行辅助软件后,自动跳转到支付宝页面,然后我们手动打开蚂蚁森林,手动进入好友总排名,然后辅助就开始找到那些可以收取能量的好友,进去收取能量,然后返回来继续。其实是可以实现全自动的,但是我实现以后觉得有点蠢,还是只实现偷好友能量这步比较好。

蚂蚁森林的界面都是一个标题栏加一个网页,内容都在网页里面。单纯的靠Android辅助功能是无法获取里面控件,无法实现这个功能的;图象识别配合模拟点击是万能的;只要识别出页面中这个 可收取的能量 的这个手的图标的位置,再通过模拟点击,就可以进入朋友的森林界面,再次通过图象识别,识别出可以收取的能量的位置,就可以进行能量的收取;

首先是获取屏幕的截图,获取截图可以使用Android的录屏功能来实现,在开启辅助前,开启录屏功能,然后到这个界面的时候,通过当前页面的类名和标题是可以知道当前处于总排行榜界面的,这时候获取当前界面的截屏,然后进行图象识别,获取到第一个可收取能量的图标的位置,点击进入朋友的森林界面, 进行能量的收取 ,然后返回,返回的时候,重新截图识别,找下一个可收取能量的图标;当识别不到可收取的图标的时候,模拟滑动进行翻页,然后继续进行识别。

图象识别的话,之前有使用过openCV,里面的模板匹配应该比较符合这里的用法;这样的图象识别在做辅助软件的时候特别容易用到,之前都是根据需要写的一些用颜色作为识别的算法,每次都要重新写,比较 *** 心,所以我自己想写一些通用的、简单的图象识别方法,可以复用,类似两张,找出小的在大图中的位置这种模板匹配;自己利用图象上的点的颜色来进行对比判断写了个识别方法(如果两张每个点颜色都相同,那肯定就一样了呀),还行能用,识别一张2960x1440的大概需要700毫秒左右;如下图,识别出图标的位置,我使用半透明的标志了一下位置

在好友的森林界面的偷能量,也是通过当前页面的类名和标题去判断当前界面处于好友的森林界面

偷能量的 *** 作,也是图象识别去实现,看图可以知道可收取的能量的颜色有些不同,写个简单的算法,通过颜色来判断一个点是否有可以获取的能量,然后模拟点击进行收取

总体效果还是不错的,收收能量没什么问题;其实也实现也比较简单,就是图像识别加上模拟点击。

X6PlusD目前官网报价:2998元。
x6plusD的主要参数如下:
*** 作系统:最新版本为基于Android 51的Funtouch OS 25系统
屏幕:57英寸分辨率:10801920(OLED)
拍照:前置800万像素/后置1300万像素(PDAF)
处理器: MTK八核 64位 17GHz
外观尺寸:1584x801x685mm
电池容量:3000 mAh,不可拆卸电池
重量: 171g
网络支持:支持联通移动双4G网络、联通移动双3G网络,同时支持移动、联通2G网络
机身内存:4G RAM+64G ROM
扩展存储:不支持SD卡扩展

用来提供相册的清理相似、清理截屏、压缩三个功能。

额外需要引入的框架:

Photos 引用了系统的 AssetsLibrary 框架,需要额外导入,否则会报错:

引入方式:

作用是无需创建实例,通过类方法直接调用。

在这个方法中加载的包括相似图、截屏图以及可瘦身的,所以是公共部分。

第一步: 加载照片之前首先要清除旧数据。

第二步: 判断相册授权状态。如果相册授权状态为没决定,则开启权限提示,在 infoplist 中添加上 Privacy - Photo Library Usage Description ,提示语句可为:获取相册权限。

如果相册授权状态为拒绝,则d出提示框,点击前往设置则跳转到设置APP开启权限。

第三步: 如果已经授权则直接获取相册中的数据。

第四步: requestImageWithIndex: 方法通过索引位置来获取 assetArray 中对应的。这个方法在 index+1 后不断递归调用自己,直到遍历完整个 assetArray 。传入缩略图和原图后,即进入了本文章的关键部分,即的处理流程了。

第五步: 的处理方法 dealImageWithIndex: 对传入的缩略图和原图进行三步处理,分别判断其是否为相似、截屏、可以瘦身的,如果是则将其加入到对应数组中保存作为数据源。处理完一张后将 index+1 ,再调用 requestImageWithIndex: 处理下一张,这是个递归过程,直到全部处理完成。

因为资源数组 assetArray 是按照创建时间排序的,所以可以通过和上一个的创建时间相比较来对按照是否为同一天创建的标准来分组显示。如果是同一天创建的,则将其分为一组。是否为同一天的比较方法如下:

第六步: 加载完成,计算相似、截屏、可瘦身的的数量和可节省内存的大小,最后将各类可节省内存的大小加起来得到总的可节省内存的大小。

其中获取数量及可以节省的内存空间大小的 getInfoWithDataArray: 方法的实现如下:

在 ClearPhotoManager 中定义:

当我们在相册新增加了一张的时候,控制台输出如下:

在 ClearPhotoViewController 中使用:页面显示前或者相册发生变动了则更新数据源

在 SimilarPhotoAndScreenShotsViewController 中使用:删除后通知更新相册和数据源

在 ThinPhotoViewController 中使用:压缩后通知更新相册和数据源

删除一张后的内存变化:

注意:这里进行了个小实验,可以看到即使照片相同,但是如果创建日期不同的话,APP也对它进行了单独分组,因为我们是按照日期的标准来划分组的。实际使用过程中,这种情况很少,因为会产生相似的原因大都是复制和连拍,而复制的、连拍的日期都是相同的。

属性的懒加载方法实现如下:

这里用到了相似度算法,其原理包括五步:
1、缩小尺寸
2、简化色彩
3、计算平均值
4、比较像素的灰度
5、计算哈希值

该算法的具体实现我们不用去关心,只需要导入 ImageCompareh 这个文件即可。在该文件内部用到了:

所以还需要导入这个框架: opencv2framework 。这两份文件在我的 demo 里都已经提供了。

如果上一张存在并且是现在的的创建时间是同一天,而且还满足相似度算法,则更新相似数据源,否则说明和上一张并不相似。

其中以创建日期作为字典的 key ,其方法 stringWithDate: 的实现如下:

这是最关键的一步,也是非常绕脑袋的一步,理解的关键是分清楚下面的数组和字典的作用和区别:

similarArray的内容打印结果如下:

similarArray中每一个lastDictionary打印结果如下:

lastDictionary的allValues:

您好,Python可以使用OpenCV库来识别屏幕上固定区域的数字。OpenCV是一个开源的计算机视觉库,可以帮助开发者实现计算机视觉任务,比如图像处理、图像分析、计算机视觉等。OpenCV可以通过捕获屏幕上的图像,然后使用图像处理技术来识别屏幕上的固定区域的数字。OpenCV可以通过使用图像处理技术,如图像分割、边缘检测、形态学处理等,来识别屏幕上的固定区域的数字。此外,OpenCV还可以使用机器学习技术,如深度学习、神经网络等,来识别屏幕上的固定区域的数字。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13212055.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-06-21
下一篇 2023-06-21

发表评论

登录后才能评论

评论列表(0条)

保存