版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_15642411/article/details/84065004
代码如下:
#include <iostream>
#include<opencv2/opencv.hpp>
#include<string>
#include<boost/format.hpp>
#include<opencv2/tracking.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core.hpp>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
Mat frame;
if(argc<2){
throw runtime_error("请输入待追踪的视屏");
}
VideoCapture cap(argv[1]);
cap>>frame;
//写视屏
int frame_width = cap.get(CV_CAP_PROP_FRAME_WIDTH);
int frame_height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
VideoWriter video("tracker.avi",CV_FOURCC('M','J','P','G'),10, Size(frame_width,frame_height));
//
vector<Rect2d> rois;
for(auto i=0;i<2;++i)
{
rois.push_back(selectROI(frame, false));
}
//selectROIs始终有问题,那么就采用循环选择两次的roi
if(rois.size()<1){
return EXIT_FAILURE;
}
MultiTracker trackers;
// vector<Rect2d> obj;
vector<Ptr<Tracker>> algorithm;
// algorithm.push_back(TrackerKCF::create());
// algorithm.push_back(TrackerGOTURN::create());//goturn 测试始终不好
for(int i=0;i<2;++i)
{
algorithm.push_back(TrackerKCF::create());
}
// for (auto i = 0; i < rois.size(); i++)
// {
// obj.push_back(rois[i]);
// }
trackers.add(algorithm,frame,rois);//add相当于单目标中init函数
while (cap.read(frame))
{
bool ok = trackers.update(frame);
if (ok)
{
for (auto j = 0; j < trackers.getObjects().size(); j++)
{
rectangle(frame, trackers.getObjects()[j], Scalar(0, 0, 255), 2, 1);
}
}
else
{
putText(frame, "Tracking failure detected", Point(100,80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0,0,255),2);
}
video.write(frame);
imshow("tracker",frame);
int k=waitKey(40);
if(k==27){
break;
}
}
video.release();
cap.release();
destroyAllWindows();
return 0;
}