opencv3/C++ 使用Tracker实现简单目标跟踪
简介
MIL:TrackerMIL以在线方式训练分类器将对象与背景分离;多实例学习避免鲁棒跟踪的漂移问题.
OLB:TrackerBoosting基于AdaBoost算法的在线实时对象跟踪.分类器在更新步骤中使用周围背景作为反例以避免漂移问题.
MedianFlow:TrackerMedianFlow跟踪器适用于非常平滑和可预测的运动,物体在整个序列中可见.
TLD:TrackerTLD将长期跟踪任务分解为跟踪,学习和检测.跟踪器在帧之间跟踪对象.探测器本地化所观察到的所有外观,并在必要时纠正跟踪器.学习估计检测器的错误并进行更新以避免再出现这些错误.追踪器能够处理快速运动,部分遮挡,物体缺失等情况.
KCF:TrackerKCF使用目标周围区域的循环矩阵采集正负样本,利用脊回归训练目标检测器,并成功的利用循环矩阵在傅里叶空间可对角化的性质将矩阵的运算转化为向量的Hadamad积,即元素的点乘,大大降低了运算量,提高了运算速度,使算法满足实时性要求.
部分相关API:
TrackerMIL
staticPtrcreate(constTrackerMIL::Params¶meters); CV_WRAPstaticPtr create();
structCV_EXPORTSParams { PARAMS(); //采样器的参数 floatsamplerInitInRadius;//初始收集正面实例的半径 intsamplerInitMaxNegNum;//初始使用负样本 floatsamplerSearchWinSize;//搜索窗口的大小 floatsamplerTrackInRadius;//在跟踪期间收集正面实例的半径 intsamplerTrackMaxPosNum;//在追踪期间使用正面样本 intsamplerTrackMaxNegNum;//在跟踪期间使用的负样本 intfeatureSetNumFeatures;//特征 voidread(constFileNode&fn); voidwrite(FileStorage&fs)const; };
TrackerBoosting
staticPtrcreate(constTrackerBoosting::Params¶meters); CV_WRAPstaticPtr create();
structCV_EXPORTSParams { PARAMS(); intnumClassifiers;//在OnlineBoosting算法中使用的分类器的数量 floatsamplerOverlap;//搜索区域参数 floatsamplerSearchFactor;//搜索区域参数 intiterationInit;//初始迭代 intfeatureSetNumFeatures;//特征 //从文件读取参数 voidread(constFileNode&fn); //从文件写入参数 voidwrite(FileStorage&fs)const; };
示例
首先获取视频的第一帧,通过点击左键框选选择要跟踪的目标,点击右键确认并使用MIL开始跟踪.(从实际情况看来,算法对过程中有遮挡的情况跟踪能力较差.)
(环境:Ubuntu16.04+QT5.8+opencv3.3.1)
#include#include #include #include usingnamespacecv; voiddraw_rectangle(intevent,intx,inty,intflags,void*); MatfirstFrame; PointpreviousPoint,currentPoint; Rect2dbbox; intmain(intargc,char*argv[]) { VideoCapturecapture; Matframe; frame=capture.open("/home/w/mycode/QT/img/runners.avi"); if(!capture.isOpened()) { printf("cannotopen...\n"); return-1; } //获取视频的第一帧,并框选目标 capture.read(firstFrame); if(!firstFrame.empty()) { namedWindow("output",WINDOW_AUTOSIZE); imshow("output",firstFrame); setMouseCallback("output",draw_rectangle,0); waitKey(); } //使用TrackerMIL跟踪 Ptr tracker=TrackerMIL::create(); //Ptr tracker=TrackerTLD::create(); //Ptr tracker=TrackerKCF::create(); //Ptr tracker=TrackerMedianFlow::create(); //Ptr tracker=TrackerBoosting::create(); capture.read(frame); tracker->init(frame,bbox); namedWindow("output",WINDOW_AUTOSIZE); while(capture.read(frame)) { tracker->update(frame,bbox); rectangle(frame,bbox,Scalar(255,0,0),2,1); imshow("output",frame); if(waitKey(20)=='q') return0; } capture.release(); destroyWindow("output"); return0; } //框选目标 voiddraw_rectangle(intevent,intx,inty,intflags,void*) { if(event==EVENT_LBUTTONDOWN) { previousPoint=Point(x,y); } elseif(event==EVENT_MOUSEMOVE&&(flags&EVENT_FLAG_LBUTTON)) { Mattmp; firstFrame.copyTo(tmp); currentPoint=Point(x,y); rectangle(tmp,previousPoint,currentPoint,Scalar(0,255,0,0),1,8,0); imshow("output",tmp); } elseif(event==EVENT_LBUTTONUP) { bbox.x=previousPoint.x; bbox.y=previousPoint.y; bbox.width=abs(previousPoint.x-currentPoint.x); bbox.height=abs(previousPoint.y-currentPoint.y); } elseif(event==EVENT_RBUTTONUP) { destroyWindow("output"); } }
实验对比发现:KCF速度最快,MedianFlow的速度也较快,对于无遮挡情况跟踪效果较好;TLD对部分遮挡处理的效果最好,处理时间相对较慢.
部分遮挡处理效果
MIL对部分遮挡的处理效果:
opencv::TrackerAlgorithms
以上这篇opencv3/C++使用Tracker实现简单目标跟踪就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。