C++-OpenCV(8)-单目标跟踪

OPenCV支持8种算法的目标跟踪,根据视频特点选择不同的算法。
8种算法的实现步骤:
  1.创建类对象 create() 
  2.对象初始化:    init() 初始帧图像、跟踪目标的初始矩形框位置
               此处用Rect2d 设置矩形框位置,或者手动选取矩形框
  3.while循环    对视频进行逐帧处理
               update(,) 矩形框在下一帧的位置 (新一帧图像,目标矩形框在新一帧图像上的位置)
               update实现所有跟踪计算工作
               返回值:0 表示丢了 1表示OK
上代码:
 

string trackerTypes[8] = { "BOOSTING", "MIL", "KCF", "TLD", "MEDIANFLOW", "GOTURN", "CSRT", "MOSSE" };
	// vector <string> trackerTypes(types, std::end(types));

	// 1.创建:Create a tracker
	string trackerType = trackerTypes[6];
	Ptr<Tracker> tracker;

		if (trackerType == "BOOSTING")
			tracker = TrackerBoosting::create();
		else if (trackerType == "MIL")
			tracker = TrackerMIL::create();
		else if (trackerType == "KCF")
			tracker = TrackerKCF::create();
		else if (trackerType == "TLD")
			tracker = TrackerTLD::create();
		else if (trackerType == "MEDIANFLOW")
			tracker = TrackerMedianFlow::create();
		else if (trackerType == "GOTURN")
			tracker = TrackerGOTURN::create();
		else if (trackerType == "CSRT")
			tracker = TrackerCSRT::create();
		else if (trackerType == "MOSSE")
			tracker = TrackerMOSSE::create();
		else
		{
			cout << "INVALID TRACKER SPECIFIED" << endl;
			cout << "Available Trackers are :" << endl;
			for (int i = 0; i < sizeof(trackerTypes) / sizeof(trackerTypes[0]); i++)
				cout << i << " : " << trackerTypes[i] << endl;
			return ;
		}
	VideoCapture video("../hockey.mp4");
	if (!video.isOpened())
	{
		cout << "Could not read video file" << endl;
		return ;
	}

	Mat frame;
	bool ok = video.read(frame);
	Rect2d bbox(204, 131, 97, 222);
    cout << "Initial bounding box : " << bbox << endl;
	rectangle(frame, bbox, Scalar(255, 0, 0), 2, 1);
	imshow("Tracking", frame);


	//2.初始化
	tracker->init(frame, bbox);
	//3.每帧操作更新
	while (video.read(frame))
	{
		double timer = (double)getTickCount();
		bool ok = tracker->update(frame, bbox);
		float fps = getTickFrequency() / ((double)getTickCount() - timer);
		if (ok)
		{
			// Tracking success : Draw the tracked object
			rectangle(frame, bbox, Scalar(255, 0, 0), 2, 1);
		}
		else
		{
			// Tracking failure detected.
			putText(frame, "Tracking failure detected", Point(100, 80), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(0, 0, 255), 2);
		}
		putText(frame, trackerType + " Tracker", Point(100, 20), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);
		putText(frame, "FPS : " + SSTR(int(fps)), Point(100, 50), FONT_HERSHEY_SIMPLEX, 0.75, Scalar(50, 170, 50), 2);
		imshow("Tracking", frame);

		// Exit if ESC pressed.
		int k = waitKey(1);
		if (k == 27)
		{
			break;
		}

	}


 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中使用OpenCV进行目标跟踪可以使用以下步骤: 1. 读取视频或摄像头数据。 ```cpp cv::VideoCapture cap(0); //打开摄像头 cv::Mat frame; //每一帧图像 if (!cap.isOpened()) return -1; //检查视频是否正确打开 ``` 2. 初始化目标。 可以使用鼠标点击在视频帧中选择目标,并使用该目标的位置进行初始化。 ```cpp cv::Rect2d bbox = cv::selectROI("Tracking", frame, false); //选择ROI cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create(); //创建跟踪器 tracker->init(frame, bbox); //用ROI初始化跟踪器 ``` 3. 循环处理每一帧图像。 在循环中,首先读取图像帧,然后使用跟踪器对目标进行跟踪,并在图像帧中绘制跟踪框。 ```cpp while (cap.read(frame)) { cv::Rect2d bbox; bool ok = tracker->update(frame, bbox); //使用跟踪器更新目标位置 if (ok) { // 目标跟踪成功 cv::rectangle(frame, bbox, cv::Scalar(0, 255, 0), 2, 1); //在图像帧中绘制跟踪框 } else { // 目标跟踪失败 cv::putText(frame, "Tracking failure detected", cv::Point(100, 80), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 255), 2); } cv::imshow("Tracking", frame); //显示图像帧 if (cv::waitKey(1) == 27) break; //按下ESC退出循环 } ``` 完整的C++代码如下: ```cpp #include <opencv2/opencv.hpp> int main() { cv::VideoCapture cap(0); cv::Mat frame; if (!cap.isOpened()) return -1; cv::Rect2d bbox = cv::selectROI("Tracking", frame, false); cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create(); tracker->init(frame, bbox); while (cap.read(frame)) { cv::Rect2d bbox; bool ok = tracker->update(frame, bbox); if (ok) { cv::rectangle(frame, bbox, cv::Scalar(0, 255, 0), 2, 1); } else { cv::putText(frame, "Tracking failure detected", cv::Point(100, 80), cv::FONT_HERSHEY_SIMPLEX, 0.75, cv::Scalar(0, 0, 255), 2); } cv::imshow("Tracking", frame); if (cv::waitKey(1) == 27) break; } return 0; } ``` 注意,跟踪器的类型可以根据应用场景选择不同的类型,例如KCF、MIL、TLD等。此外,也可以使用深度学习模型进行目标跟踪

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值