Opencv——⽬标跟踪Tracker
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)
rectangle函数opencvMOSSE 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;
}
//ad(image2);
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);
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效果

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。