opencv实现目标跟踪,python opencv目标检测与跟踪
本文主要介绍如何使用OpenCV内置的八种不同的目标跟踪算法来跟踪目标。文中的样例代码讲解的很详细,有兴趣的可以看看。
目录
OpenCV对象跟踪OpenCV对象跟踪器对象跟踪摘要
OpenCV 对象跟踪
本文使用OpenCV中内置的八种不同的对象跟踪算法来跟踪对象。
首先,介绍了八种跟踪算法。
然后,演示如何使用OpenCV实现这些跟踪算法。
最后,对本文进行了总结。
OpenCV 对象跟踪器
OpenCV八个物体跟踪器:
BOOSTING Tracker:基于与驱动Haar cascade (AdaBoost)背后的机器学习所使用的相同算法,但与Haar cascade一样,它也有十多年的历史。这个追踪器很慢,而且不太好用。只对遗留原因和比较其他算法感兴趣。(最低OpenCV 3.0.0)
MIL Tracker:它比BOOSTING tracker更精确,但在报告故障方面做得很差。(最低OpenCV 3.0.0)
KCF跟踪器:核相关滤波器。比增压和密耳快。类似于米尔和KCF,它不能很好地处理完全闭塞。(最低OpenCV 3.1.0)
Rttracker:判别相关滤波器(具有信道和空间可靠性)。通常比KCF更准确,但速度稍慢。(最低OpenCV 3.4.2)
MedianFlow Tracker:做好故障报告;但是,如果运动中的跳跃太大,例如快速移动的物体或外观快速变化的物体,则模型将失败。(最低OpenCV 3.0.0)
TLD追踪器:我不确定是TLD追踪器的OpenCV实现有问题还是实际算法本身有问题,但是TLD追踪器容易出现误报。我不推荐使用这个OpenCV对象跟踪器。(最低OpenCV 3.0.0)
非常非常快。不如CSRT或KCF准确,但如果你需要纯粹的速度,这是一个不错的选择。(最低OpenCV 3.4.1)
go turn tracker:opencv中唯一基于深度学习的目标检测器。它需要额外的模型文件来运行(本文不会涉及)。我最初的实验表明,虽然据说它可以很好地处理观看变化,但使用起来仍然有点痛苦(尽管我最初的实验没有证实这一点)。我将在以后的帖子中尝试介绍它,但在此期间,请看看Satya的文章。(最低OpenCV 3.2.0)
个人建议:
当需要更高的对象跟踪精度并且可以容忍较慢的FPS吞吐量时,请在需要更快的FPS吞吐量但可以处理稍低的对象跟踪精度时使用KCF CSRT,在需要纯速度时使用MOSSE。
物体跟踪
在开始算法之前,先写辅助方法和类。
fps类:
导入日期时间
FPS:级
def __init__(self):
#定义开始时间、结束时间和总帧数
自我。_start=无
自我。_end=无
自我。_numFrames=0
定义开始(自身):
#开始计时
自我。_start=datetime.datetime.now()
回归自我
定义停止(自我):
#停止计时
自我。_end=datetime.datetime.now()
定义更新(自身):
#增加开始和结束间隔期间检查的总帧数
自我。_numFrames=1
def elapsed(自身):
#返回开始和结束间隔之间的总秒数
回归(自我。_end - self。_start)。总计_秒()
def fps(self):
#计算每秒的帧数
回归自我。_numFrames/self.elapsed()
请打开一个新文件,将其命名为object_tracker.py,定义调整大小方法,并按相等比例缩放。
放图片。
import cv2
定义全局变量:
videos = 0
我们的命令行参数包括:
videos:输入视频文件或者摄像头的ID。
tracker_type:跟踪器的类型,接下来的代码定义了跟踪器列表。
接下来定义不同类型的跟踪器:
# 提取 OpenCV 版本信息
在OpenCV 3.3之前,必须使用cv2.Tracker_create创建跟踪器对象,并传递跟踪器名称的大写字符串。
对于OpenCV 3.3+,可以使用各自的函数调用创建每个跟踪器,例如cv2.TrackerCSRT_create。字典OPENCV_OBJECT_TRACKERS包含8个内置OpenCV对象跟踪器中的七个。它将对象跟踪器命令行参数字符串(键)与实际的OpenCV对象跟踪器函数(值)进行映射。
# 初始化我们要追踪的物体的边界框坐标
initBB初始化为None,此变量将保存我们使用鼠标选择的对象的边界框坐标。
接下来,初始化VideoCapture对象和FPS计数器。
让我们开始循环来自视频流的帧:
# 循环播放视频流中的帧
抓住一个帧,如果获取不到帧,则退出。
为了使对象跟踪算法能够更快地处理帧,我们将输入帧的大小调整为500像素。
然后输出框架的高和宽。
如果已选择对象,则需要更新对象的位置。 update方法将定位对象的新位置并返回成功布尔值和对象的边界框。
如果成功,我们在框架上绘制新的,更新的边界框位置。
更新FPS。
初始化显示的文本信息列表。随后,绘制到frame上。
显示输出帧。
# 使用s键选择一个边界框来跟踪
按下s键时,使用cv2.selectROI选择对象ROI。此时,视频帧冻结,用鼠标绘制跟踪对象的边界框。
绘制完边界框,然后按ENTER或SPACE确认选择。如果需要重新选择区域,只需按ESCAPE即可。
然后,启动OpenCV 对象跟踪器,再启动 FPS 吞吐量估计器。
最后一个段代码只是处理我们已经脱离循环的情况。释放所有指针并关闭窗口。
总结
在今天的博客文章中,您学习了如何利用OpenCV进行对象跟踪。具体来说,我们回顾了OpenCV库中包含的8个对象跟踪算法(从OpenCV 3.4开始):
CSRT、KCF、Boosting、MIL、TLD、MedianFlow、MOSSE、GOTURN。
建议对大多数对象跟踪应用程序使用CSRT,KCF或MOSSE:
当需要更高的对象跟踪精度并且可以容忍更慢的FPS吞吐量时,请使用CSRT
当需要更快的FPS吞吐量时使用KCF,但可以处理稍低的对象跟踪精度
当需要纯粹的速度时使用MOSSE
到此这篇关于利用OpenCV进行对象跟踪的示例代码的文章就介绍到这了,更多相关OpenCV对象跟踪内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。