OpenCv-C++-视频分析与对象跟踪-扩展模块中的多对象跟踪

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/Daker_Huang/article/details/86711505

在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;

}

猜你喜欢

转载自blog.csdn.net/Daker_Huang/article/details/86711505
今日推荐