实现步骤与单目标跟踪一样,只是创建和初始化的时候用的是数组
//创建:Create multitracker
Ptr<MultiTracker> multiTracker = cv::MultiTracker::create();
//初始化:initialize multitracker
//add指定不同的方法
for(int i=0; i < bboxes.size(); i++)
multiTracker->add(createTrackerByName(trackerType), frame, Rect2d(bboxes[i]));
下面是代码:
void main()
{ string trackerType = "CSRT";
string videoPath = "../test.mp4";
vector<Rect> bboxes;
cv::VideoCapture cap(videoPath);
Mat frame;
if(!cap.isOpened())
{
cout << "Error opening video file " << videoPath << endl;
return ;
}
//读一帧
cap >> frame;
bool showCrosshair = true;
bool fromCenter = false;
cv::selectROIs("MultiTracker", frame, bboxes, showCrosshair, fromCenter);
if(bboxes.size() < 1)
return 0;
vector<Scalar> colors;
getRandomColors(colors, bboxes.size());
//1.创建 多个跟踪器Create multitracker
Ptr<MultiTracker> multiTracker = cv::MultiTracker::create();
//2.initialize 跟踪器
for(int i=0; i < bboxes.size(); i++)
multiTracker->add(createTrackerByName(trackerType), frame, Rect2d(bboxes[i]));
while(cap.isOpened())
{
cap >> frame;
if (frame.empty()) break;
//3.更新
multiTracker->update(frame);
for(unsigned i=0; i<multiTracker->getObjects().size(); i++)
{
rectangle(frame, multiTracker->getObjects()[i], colors[i], 2, 1);
}
imshow("MultiTracker", frame);
if (waitKey(1) == 27) break;
}
}