今天周六,我要做一个上进的妈妈,所以学习了这篇深度好文,开始翻译~~~
先把英文原版放出来,英文好的可以自行阅读
http://www.learnopencv.com/object-tracking-using-opencv-cpp-python/?winzoom=1
在本教程中,给大家介绍基于opencv3.0的目标跟踪的API, 我们将学习如何以及何时使用OpenCV 3.2中提供的6种不同的跟踪器-BOOSTING,MIL,KCF,TLD,MEDIANFLOW和GOTURN。 我们还将学习现代跟踪算法背后的基本理论。
OpenCV Object Tracker Demo
如果你没有时间读完整个文章,只需看看下面整个视频,学学如何使用这些。但是如果你想更深入的学习目标跟踪,请继续阅读。
(youtube的视频,需)
什么是目标跟踪?
简单地说,跟踪就是在连续的视频帧中定位某一物体。
整个概念定义听起来很直接,但在计算机视觉和机器学习中,跟踪是一个非常光泛的名词,涵盖概念上类似但技术上不同的理念。 例如,通常在对象跟踪下研究范畴,但是相关的理念不同,有如下几种:
1. 密集光流
这些算法是基于估计视频帧中每个像素的运动矢量。
2.稀疏光流:
这些算法跟踪图像中几个特征点的位置,如KLT特征跟踪器。
3. 卡尔曼滤波:
一个非常流行的基于先验运动信息来预测运动对象的当前位置的信号处理算法。 这种算法的早期应用之一是导弹指导!正如这里所提到的,“引导阿波罗11月球模块下降到月球的车载计算机具有卡尔曼滤波器”。--好牛逼,简单快速相对精准。
4. MeanShift算法和CamShift定位
这是一个密度函数的最大值的算法。它们也用于跟踪。Opencv有样例。
5.单对象跟踪
在此类跟踪器中,第一帧使用矩形标记,以指示要跟踪的对象的位置。 然后使用跟踪算法在随后的帧中跟踪对象。 在大多数现实生活应用中,这些跟踪器与对象检测器结合使用。
6.多目标跟踪算法
在我们有一个快速实时性高的目标检测器的情况下,检测每个帧中的多个目标,然后运行轨迹找到算法,识别一个帧中的哪个矩形对应于下一个帧中的矩形就会变得有意义。
你曾经使用过OpenCV的人脸检测吗,你会发现它是实时的,你可以很容易地检测到每一帧的脸。那么,为什么需要跟踪在第一个地方? 让我们来探索探索,你可能要跟踪的视频中的对象的不同原因,而不仅仅是重复检测。
1.跟踪速度比检测快
通常,跟踪算法比检测算法快。原因很简单。当你跟踪在上一帧中检测到的对象时,你会非常了解目标的外观。你也知道在前一帧中的位置和它的运动的方向和速度。因此,在下一帧中,可以使用所有这些信息来预测下一帧中目标的位置,并对对象的预期位置进行小范围搜索,以准确定位目标。一个好的跟踪算法将使用其关于对象的所有信息直到那一点,而检测算法总是从头开始。因此,在设计高效的系统时,通常在每n帧上运行对象检测,而在其间的n-1帧中采用跟踪算法。
为什么我们不是简单地检测第一帧中的对象然后后面就跟踪哪?实际上,跟踪从附加信息中获益,但是当它们被障碍物遮挡一段时间或者它们移动的很快以致跟踪算法不能赶上时,也可能失去对物体的跟踪。跟踪算法累积误差也是常见的,并且跟踪对象的边界框慢慢地偏离它跟踪的对象。为了解决跟踪算法中的这些问题,检测算法每隔一段时间运行一次。在对象的大量示例上训练检测算法。因此,它们对对象的一般类有更多的了解。另一方面,跟踪算法更多地了解它们正在跟踪的类的特殊实例。
2.当检测失败时跟踪来帮助
如果你正在一个视频上运行一个人脸检测器,人脸被一个对象遮挡,这时面部检测器很可能失败。 此时,一个好的跟踪算法将处理某种程度的遮挡。在下面这个视频中,你可以看到MILtracker的防遮挡功能。
(又是youtubu)
3.跟踪保留身份信息
(我自己插段话,这个意思就是检测告诉有很多人,而跟踪告诉你这个人是谁)
目标检测的输出是包含目标的矩形数组。 但是,没有标识附加到对象。 例如,检测红点的检测器将输出与其在帧中检测到的所有点相对应的矩形。 在下一帧中,它将输出另一个矩形数组。 在第一帧中,特定点可以由矩阵在阵列中的位置10处表示,并且在第二帧中,其可以在位置17.当在帧上使用检测时,我们不知道哪个矩形对应于哪个对象。另一方面,跟踪提供了一种方式来连接点。
OpenCV 3 Tracking API
该说代码了~~
Opencv3 引入了一些针对单目标跟踪的API,见 OpenCV 3.2 — BOOSTING, MIL, KCF, TLD,MEDIANFLOW, and GOTURN.
注意:opencv3.1是补充了五种跟踪器:BOOSTING, MIL, KCF, TLD, MEDIANFLOW;opencv3.0是4种:BOOSTING,MIL, TLD, MEDIANFLOW.
先看看怎么启动和使用吧。下面这代码展示了BOOSTING, MIL, KCF, TLD, MEDIANFLOW or GOTURN 的使用。首先,打开视频抓取一帧。在第一帧的时候初始化一个目标跟踪框,然后从视频中读取视频帧并通过跟踪器循环更新跟踪目标的位置。
// Standard include files
#include
#include
usingnamespacecv;
usingnamespacestd;
intmain(intargc, char**argv)
{
// Set up tracker.
// Instead of MIL,you can also use
// BOOSTING, KCF,TLD, MEDIANFLOW or GOTURN
Ptr tracker= Tracker::create( "MIL");
// Read video
VideoCapturevideo("videos/chaplin.mp4");
// Check video isopen
if(!video.isOpened())
{
cout<< "Could not read video file"<< endl;
return1;
}
// Read firstframe.
Mat frame;
video.read(frame);
// Define aninitial bounding box
Rect2d bbox(287,23, 86, 320);
// Uncomment theline below if you
// want to choosethe bounding box
// bbox =selectROI(frame, false);
// Initializetracker with first frame and bounding box
tracker->init(frame,bbox);
while(video.read(frame))
{
//Update tracking results
tracker->update(frame,bbox);
//Draw bounding box
rectangle(frame,bbox, Scalar( 255, 0, 0 ), 2, 1 );
//Display result
imshow("Tracking",frame);
intk = waitKey(1);
if(k== 27) break;
}
return0;
}