Opencv——目标跟踪Tracker
OpenCV有八种不同的目标追踪工具,他们都可以运用到计算机视觉领域中。本文只用了以下六种对我现有数据的测试
MIL Tracker:追踪器精确,但是失败率比较高。(最低支持OpenCV 3.0.0)
KCF Tracker:比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)
CSRT Tracker:比KCF稍精确,但速度不如后者。(最低支持OpenCV 3.4.2)
MedianFlow Tracker:在报错方面表现得很好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)
TLD Tracker:我不确定是不是OpenCV和TLD有什么不兼容的问题,但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)
MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)
经过本人你的一番测试,发现与其他五种相比较CSRT Tracker这个跟踪效果最好,即使在遮挡的情况下,但是有一缺点就是处理速度慢,慢到你能很明显看出来是一帧一帧场景的播放。其他几个速度快的精度差,精度好的速度慢。
GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行。这个本人这次没有测试。
用到的函数
返回值是rect,选区的坐标和大小
selectROI(const String
& windowName
,
InputArray img
,
bool showCrosshair
= true,
bool fromCenter
= false);
cv
::Ptr
<cv
::Tracker
> tracker
= cv
::TrackerMIL
::create();
cv
::Ptr
<cv
::Tracker
> tracker
= cv
::TrackerKCF
::create();
cv
::Ptr
<cv
::Tracker
> tracker
= cv
::TrackerCSRT
::create();
cv
::Ptr
<cv
::Tracker
> tracker
= cv
::TrackerMedianFlow
::create();
cv
::Ptr
<cv
::Tracker
> tracker
= cv
::TrackerMOSSE
::create();
cv
::Ptr
<cv
::Tracker
> tracker
= cv
::TrackerTLD
::create();
tracker
->init(InputArray image
, const Rect2d
& boundingBox
);
tracker
->update(InputArray image
, CV_OUT Rect2d
& boundingBox
);
代码
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/features2d/features2d.hpp>
#include <opencv2/video/tracking.hpp>
#include <opencv2/tracking/tracker.hpp>
using namespace std
;
cv
::Mat frame
, image1
, output
;
bool roi
= false;
bool video
= true;
cv
::Rect2d rect
;
int main()
{
cv
::VideoCapture capture
;
capture
.open("vtest.avi");
if (!capture
.isOpened())
{
cout
<< "the video isn't opened" << endl
;
}
capture
>> image1
;
cv
::Ptr
<cv
::Tracker
> tracker
= cv
::TrackerCSRT
::create();
while (true)
{
capture
>> image1
;
if (cv
::waitKey(30) == 112)
{
rect
= cv
::selectROI("image1", image1
);
roi
= true;
video
= false;
}
if (roi
)
{
tracker
->init(image1
, rect
);
tracker
->update(image1
, rect
);
image1
.copyTo(output
);
cv
::rectangle(output
, rect
, cv
::Scalar(255, 255, 255), 2);
cout
<< rect
.x
<< "-" << rect
.y
<< endl
;
cv
::imshow("image1", output
);
}
if (video
)
{
cv
::imshow("image1", image1
);
}
if(cv
::waitKey(60) == 27)
break;
cv
::waitKey(60);
}
cv
::waitKey();
}
CSRT效果