OpenCV使用扩展模块中的TrackerKCF实现视频中单对象跟踪
作者:互联网
一、概述
案例:使用TrackerKCF实现单对象跟踪,而TrackerKCF是扩展模块中的内容所以需要导入头文件:<opencv2/tracking.hpp>
实现步骤:
1.实例化VideoCapture
2.利用VideoCapture.open方法打开视频文件
3.VideoCapture.read读取视频的第一帧
4.利用selectROI选取ROI区域
5.实例化TrackerKFC
6.使用tracker->init方法初始化
7.while循环读取视频帧
8.tracker->update方法更新frame
9.使用rectangle绘制roi区域
10.显示最终frame
ps:此跟踪方法,的roi区域不会随着目标对象的大小变化而变化。
二、代码示例
Extend_KCF_Single_Object_Tracking::Extend_KCF_Single_Object_Tracking(QWidget *parent) : MyGraphicsView{parent} { this->setWindowTitle("扩展模块中的但对象跟踪"); QPushButton *btn = new QPushButton(this); btn->setText("选择视频"); connect(btn,&QPushButton::clicked,[=](){ choiceVideo(); }); } void Extend_KCF_Single_Object_Tracking::choiceVideo(){ path = QFileDialog::getOpenFileName(this,"请选择视频","/Users/yangwei/Downloads/",tr("Image Files(*.mp4 *.avi)")); qDebug()<<"视频路径:"<<path; showExtendKCFSingleObjectTracking(path.toStdString().c_str()); } void Extend_KCF_Single_Object_Tracking::showExtendKCFSingleObjectTracking(const char* filePath){ VideoCapture capture; capture.open(filePath); if(!capture.isOpened()){ qDebug()<<"无法加载视频文件"; return; } Mat frame; //读取第一帧 capture.read(frame); //选取ROI区域 Rect rect = selectROI(frame); if(rect.width<=0||rect.height<=0){ qDebug()<<"必须选择一个roi区域"; return; } //实例化KCF,ps:这属于高版本的4.5.5,低版本的创建方法不是这样的 Ptr<TrackerKCF> tracker = TrackerKCF::create(); //初始化ROI区域 tracker->init(frame,rect); //循环读取视频帧并跟踪 while(capture.read(frame)){ //更新frame tracker->update(frame,rect); //将roi区域绘制出来 rectangle(frame,rect,Scalar(0,255,0),3,8,0); //限制最终的跟踪frame imshow("frame",frame); int c = waitKey(1); if(c == 27){ break; } } capture.release(); }
三、演示图像
标签:视频,roi,frame,中单,OpenCV,tracker,跟踪,TrackerKCF 来源: https://www.cnblogs.com/tony-yang-flutter/p/16194495.html