opencv_contrib集成了八种工具包括:
BOOSTING Tracker:和Haar cascades(AdaBoost)背后所用的机器学习算法相同,但是距其诞生已有十多年了。这一追踪器速度较慢,并且表现不好,但是作为元老还是有必要提及的。(最低支持OpenCV 3.0.0)
MIL Tracker:比上一个追踪器更精确,但是失败率比较高。(最低支持OpenCV 3.0.0)
KCF Tracker:比BOOSTING和MIL都快,但是在有遮挡的情况下表现不佳。(最低支持OpenCV 3.1.0)
CSRT Tracker:比KCF稍精确,但速度不如后者。(最低支持OpenCV 3.4.2)
MedianFlow Tracker:在报错方面表现得很好,但是对于快速跳动或快速移动的物体,模型会失效。(最低支持OpenCV 3.0.0)
TLD Tracker:我不确定是不是OpenCV和TLD有什么不兼容的问题,但是TLD的误报非常多,所以不推荐。(最低支持OpenCV 3.0.0)
MOSSE Tracker:速度真心快,但是不如CSRT和KCF的准确率那么高,如果追求速度选它准没错。(最低支持OpenCV 3.4.1)
GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行,本文不详细讲解。(最低支持OpenCV 3.2.0)
我个人的建议:
如果追求高准确度,又能忍受慢一些的速度,那么就用CSRT
如果对准确度的要求不苛刻,想追求速度,那么就选KCF
纯粹想节省时间就用MOSSE
本人的配置是opencv3.2,故而CSRT与MOSSE不做验证:
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
VideoCapture capture;
capture.open("D:/picture/opencv/images/04.mp4");
if (!capture.isOpened()) {
printf("could not load video data...\n");
return -1;
}
Mat frame;
namedWindow("tracker demo", CV_WINDOW_AUTOSIZE);
//KCF失踪不好重新捕获,
//BOOSTING这个分类器需要在运行时用对象的正和负例子训练,给定新帧,对先前位置的邻域中的每个像素运行分类器,并记录分类器的得分。 对象的新位置是得分最大的位置,现在用得很少了。
//MIL
//TLD学习时间长速度非常慢
//MEDIANFLOW跟踪roi的size越来越大直到失真
Ptr<Tracker> tracker = Tracker::create("MEDIANFLOW");
capture.read(frame);
Rect2d roi = selectROI("tracker demo", frame);
if (roi.width == 0 || roi.height == 0) {
return -1;
}
tracker->init(frame, roi);
while (capture.read(frame)) {
tracker->update(frame, roi);
rectangle(frame, roi, Scalar(255, 0, 0), 2, 8, 0);
imshow("tracker demo", frame);
char c = waitKey(20);
if (c == 27) {
break;
}
}
capture.release();
waitKey(0);
return 0;
}