opencv 多目标跟踪,opencv 目标跟踪
本文主要介绍python如何使用OpenCV实现多目标跟踪,以及如何在OpenCV中使用MultiTracker类实现多目标跟踪API。在深入细节之前,请先查看下面列出的关于目标跟踪的帖子,了解一下OpenCV中实现的单个目标跟踪器的基础知识。有需要的朋友可以参考一下。
00-1010 1背景介绍2基于多跟踪器的多目标跟踪2.1创建单个对象跟踪器2.2读取视频的第一帧2.3确定我们在第一帧中跟踪的对象2.4初始化多跟踪器2.5更新多跟踪器并显示结果3结果和代码前言:
在本文中,我们将介绍如何使用OpenCV中的MultiTracker类来实现多目标跟踪API。在进入细节之前,请查看下面列出的关于目标跟踪的帖子,以了解OpenCV中实现的单个目标跟踪器的基础知识。同时需要安装opencv_contrib库。参见:
目录
大多数计算机和机器学习的初学者都学习对象检测。如果你是初学者,你可能会想到为什么我们需要物体跟踪。我们不能只检测每一帧的物体吗?
让我们探讨一下跟踪有用的几个原因:
首先,当在视频帧中检测到多个对象(例如人)时,跟踪有助于确定跨帧的对象的身份。其次,在某些情况下,目标检测可能会失败,但仍然有可能跟踪对象,因为跟踪考虑了对象在前一帧中的位置和外观。第三,有些跟踪算法非常快,因为它们做的是局部搜索,而不是全局搜索。因此,通过每第n帧执行目标检测并在中间帧跟踪对象,我们可以为我们的系统实现非常高的性能。那么,为什么不在第一次检测后无限期地跟踪对象呢?跟踪算法有时可能会丢失它正在跟踪的对象。比如物体移动太大,跟踪算法可能跟不上。通常在跟踪目标一段时间后,会再次检测到目标。
在本教程中,我们将只关注跟踪部分。我们想要跟踪的对象将通过指定它们周围的边界框来获得。
1 背景介绍
OpenCV中多目标跟踪器的MultiTracker类提供了多目标跟踪的实现。但这只是一个初步的实现,因为它只处理被跟踪的对象,没有对被跟踪的对象进行任何优化。
2 基于MultiTracker的多目标跟踪
多对象跟踪器只是单个对象跟踪器的集合。我们首先定义一个函数,它将跟踪器类型作为输入,并创建一个跟踪器对象。
OpenCV有8种不同的跟踪器类型:BOOSTING,米尔,KCF,TLD,梅德恩弗洛,GOTURN,莫斯,CSRT .本文中没有使用GOTURN跟踪器。一般我们先给出tracker类的名字,然后返回单个tracker对象,再建立一个多tracker类。
C++代码:
向量lt;stringgttrackerTypes={BOOSTING , MIL , KCF , TLD , MEDIANFLOW , GOTURN , MOSSE , CSRT };
/**
* @ brief按名称创建跟踪器对象根据设置的类型初始化跟踪器
*
* @param trackerType
* @ return PtrltTrackergt
*/
PtrltTrackergtcreateTrackerByName(字符串trackerType)
{
PtrltTrackergt追踪器;
if(tracker type==tracker types[0])
tracker=tracker boosting :3360 create();
else if(tracker type==tracker types[1])
tracker=tracker mil :3360 create();
else if (trackerType==tracke
rTypes[2])
tracker = TrackerKCF::create();
else if (trackerType == trackerTypes[3])
tracker = TrackerTLD::create();
else if (trackerType == trackerTypes[4])
tracker = TrackerMedianFlow::create();
else if (trackerType == trackerTypes[5])
tracker = TrackerGOTURN::create();
else if (trackerType == trackerTypes[6])
tracker = TrackerMOSSE::create();
else if (trackerType == trackerTypes[7])
tracker = TrackerCSRT::create();
else
{
cout << "Incorrect tracker name" << endl;
cout << "Available trackers are: " << endl;
for (vector<string>::iterator it = trackerTypes.begin(); it != trackerTypes.end(); ++it)
{
std::cout << " " << *it << endl;
}
}
return tracker;
}
python代码:
from __future__ import print_function
2.2 读取视频的第一帧
多对象跟踪器需要两个输入即一个视频帧和我们想要跟踪的所有对象的位置(边界框)。
给定此信息,跟踪器在所有后续帧中跟踪这些指定对象的位置。在下面的代码中,我们首先使用VideoCapture
类加载视频并读取第一帧。稍后将使用它来初始化MultiTracker。
C++代码:
// Set tracker type. Change this to try different trackers. 选择追踪器类型
python代码:
# Set video to load
2.3 在第一帧中确定我们跟踪的对象
接下来,我们需要在第一帧中找到我们想要跟踪的对象。OpenCV提供了一个名为selectROIs的函数,它弹出一个GUI来选择边界框(也称为感兴趣区域(ROI))。在C++版本中可以通过selectROIs允许您获取多个边界框,但在Python版本中,只能通过selectROI获得一个边界框。因此,在Python版本中,我们需要一个循环来获取多个边界框。对于每个对象,我们还选择随机颜色来显示边界框。selectROI函数步骤为先在图像上画框,然后按ENTER确定完成画框画下一个框。按ESC退出画框开始执行程序
C++代码:
// Get bounding boxes for first frame
// Fill the vector with random colors
python代码:
## Select boxes
2.4 初始化MultiTrackerer
到目前为止,我们已经读取了第一帧并获得了对象周围的边界框。这是我们初始化多对象跟踪器所需的所有信息。我们首先创建一个MultiTracker对象,并添加你要跟踪目标数的单个对象跟踪器。在此示例中,我们使用CSRT单个对象跟踪器,但您可以通过将下面的trackerType变量更改为本文开头提到的8个跟踪器时间之一来尝试其他跟踪器类型。该CSRT跟踪器是不是最快的,但它产生在我们尝试很多情况下,最好的结果。
您也可以使用包含在同一MultiTracker
中的不同跟踪器,但当然,它没有多大意义。能用的不多。CSRT精度最高,KCF速度精度综合最好,MOSSE速度最快。
MultiTracker类只是这些单个对象跟踪器的包装器。正如我们在上一篇文章中所知道的那样,使用第一帧和边界框初始化单个对象跟踪器,该边界框指示我们想要跟踪的对象的位置。MultiTracker将此信息传递给它内部包装的单个目标跟踪器。
C++代码:
// Create multitracker 创建多目标跟踪类
python代码:
# Specify the tracker type
2.5 更新MultiTracker和显示结果
最后,我们的MultiTracker
准备就绪,我们可以在新的帧中跟踪多个对象。我们使用MultiTracker
类的update方法在新帧中定位对象。每个被跟踪对象的每个边界框都使用不同的颜色绘制。
Update函数会返回true和false。update
如果跟踪失败会返回false,C++代码加了判断,Python没有加。但是要注意的是update函数哪怕返回了false,也会继续更新函数,给出边界框。所以返回false,建议停止追踪。
C++代码:
while (cap.isOpened())
python代码:
# Process video and track objects
3 结果和代码
就结果而言,多目标跟踪就是生成多个单目标跟踪器,每个单目标跟踪器跟踪一个对象。如果你想和目标检测结合,其中的对象框如果要自己设定,push
一个Rect对象就行了。
//自己设定对象的检测框
//x,y,width,height
//bboxes.push_back(Rect(388, 155, 30, 40));
//bboxes.push_back(Rect(492, 205, 50, 80));
总体来说精度和单目标跟踪器差不多,所耗时间差不多5到7倍,不同算法不同。
完整代码如下:
C++:
// Opencv_MultiTracker.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
Python:
from __future__ import print_function
到此这篇关于python使用OpenCV实现多目标跟踪的文章就介绍到这了,更多相关OpenCV目标跟踪内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。