扩展模块的目标跟踪算法有:
- MIL: TrackerMIL 以在线方式训练分类器将对象与背景分离;多实例学习避免鲁棒跟踪的漂移问题.
- OLB: TrackerBoosting 基于AdaBoost算法的在线实时对象跟踪.分类器在更新步骤中使用周围背景作为反例以避免漂移问题.
- MedianFlow: TrackerMedianFlow 跟踪器适用于非常平滑和可预测的运动,物体在整个序列中可见.
- TLD: TrackerTLD 将长期跟踪任务分解为跟踪,学习和检测.跟踪器在帧之间跟踪对象.探测器本地化所观察到的所有外观,并在必要时纠正跟踪器.学习估计检测器的错误并进行更新以避免再出现这些错误.追踪器能够处理快速运动,部分遮挡,物体缺失等情况.
- KCF: TrackerKCF 使用目标周围区域的循环矩阵采集正负样本,利用脊回归训练目标检测器,并成功的利用循环矩阵在傅里叶空间可对角化的性质将矩阵的运算转化为向量的Hadamad积,即元素的点乘,大大降低了运算量,提高了运算速度,使算法满足实时性要求.
单目标跟踪 步骤:
1.实例化跟踪器 :Ptr<Tracker> tracker = TrackerKCF::create();
2.鼠标框选ROL目标:Rect2d roi = selectROI("input", frame);
3.初始化目标:tracker->init(frame, roi);
4.更新目标:tracker->update(frame, roi);
5.画出目标:rectangle(frame, roi, Scalar(255, 0, 0), 2, 8)。
#include<opencv2\opencv.hpp>
#include<opencv2\tracking.hpp>
using namespace cv;
using namespace std;
//单目标跟踪
int main(int arc, char** argv) {
VideoCapture capture(0);
//capture.open("vtest.avi");
namedWindow("output", CV_WINDOW_AUTOSIZE);
//扩展模块跟踪器有:TrackerKCF,TrackerMedianFlow,TrackerBoosting,TrackerTLD
//【1】实例化一个跟踪器类
Ptr<Tracker> tracker = TrackerKCF::create();
Mat frame;
capture.read(frame);
capture.read(frame);
Rect2d roi = selectROI("input", frame);
//【2】初始化目标
tracker->init(frame, roi);
while (capture.read(frame)) {
imshow("input", frame);
//【3】更新目标
tracker->update(frame, roi);
rectangle(frame, roi, Scalar(255, 0, 0), 2, 8);
imshow("output", frame);
char c = waitKey(100);
if (c == 27) { break; }
}
waitKey(0);
return 0;
}
多目标跟踪 步骤:
1.实例化跟踪器 :MultiTracker trackers;
2.鼠标框选ROL目标:vector<Rect> rois;
selectROIs("input", frame, rois, false);
3.传入的边界框数据类型是Rect2d,因为涉及到计算,所以需要double类型,儿框选的ROI是Rect类型的的,需要转换一下;
3.添加目标:trackers.add(algorithms, frame, obj);
4.更新目标:trackers.update(frame, obj);
5.画出目标:rectangle(frame, obj[i] ,Scalar(255, 0, 0), 2, 8)。
#include<opencv2\opencv.hpp>
#include<opencv2\tracking.hpp>
using namespace cv;
using namespace std;
int main(int arc, char** argv) {
VideoCapture capture(0);
capture.open("vtest.avi");
namedWindow("input", CV_WINDOW_AUTOSIZE);
namedWindow("output", CV_WINDOW_AUTOSIZE);
//Ptr<MultiTracker> trackers = MultiTracker::create();
//【1】实例化一个多目标跟踪器的对象
MultiTracker trackers;
Mat frame;
capture.read(frame);
//【2】选择目标
vector<Rect> rois;
selectROIs("input", frame, rois, false);
//传入的边界框数据类型是Rect2d,因为涉及到计算,所以需要double类型,需要转换一下。
vector<Rect2d> obj;
vector<Ptr<Tracker>> algorithms;
for (auto i = 0; i < rois.size(); i++) {
obj.push_back(rois[i]);
algorithms.push_back(TrackerKCF::create());
}
//【3】添加目标
trackers.add(algorithms, frame, obj);
while (capture.read(frame)) {
imshow("input", frame);
//【4】更新目标
trackers.update(frame, obj);
for (auto j = 0; j < obj.size(); j++) {
rectangle(frame, obj[j], Scalar(255, 0, 0), 2, 1);
}
/*for (auto j = 0; j < trackers.getObjects().size(); j++) {
rectangle(frame, trackers.getObjects()[j], Scalar(255, 0, 0), 2, 1);
}*/
imshow("output", frame);
char c = waitKey(100);
if (c == 27) { break; }
}
waitKey(0);
return 0;