在OpenCv扩展模块中,有一个API可以实现视频中的多对象跟踪,它跟单对象跟踪有一定的区别但又有一定的联系。
多对象跟踪中我们需要选择对个ROI区域,这里主要是用KCF方法,因为它速度快,基本好用,但是一旦对象离开窗口再出现时就会有极大的误差。
对应论文:High-Speed Tracking with Kernelized Correlation Filters
其余跟踪算法及KCF相关原理:https://blog.csdn.net/LOVE1055259415/article/details/81006596
这里着重使用OpenCv中的 MultiTracker () 这个方法,在我的电脑上,使用的是OpenCv4.0.0版本,针对版本不同,写法也可能不同,具体的需要查看参考文档。
#include <opencv2/core/utility.hpp>
#include <opencv2/tracking.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <cstring>
#include <ctime>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
VideoCapture capture(1);
if (!capture.isOpened())
{
return -1;
}
Mat frame;
capture.read(frame);
namedWindow("tracker", WINDOW_AUTOSIZE);
MultiTracker trackers;
vector<Rect> ROIs;
vector< Rect2d>objects; //存储多个ROI区域数据
vector<Ptr<Tracker>> algorithms;
selectROIs("tracker", frame, ROIs);
for (size_t i = 0; i < ROIs.size(); i++) {
objects.push_back(ROIs[i]);
algorithms.push_back(TrackerKCF::create());
}
if (ROIs.size() < 1)
{
return -1;
}
if (objects.size() < 1)
{
return -1;
}
trackers.add(algorithms, frame, objects);
while (capture.read(frame))
{
trackers.update(frame,objects);
for (size_t t = 0; t < objects.size(); t++) {
rectangle(frame, objects[t], Scalar(0, 0, 255), 2, 8, 0);
}
imshow("tracker", frame);
char c = waitKey(20);
if (c == 27)
{
break;
}
}
waitKey(0);
return 0;
}