Opencv——目标跟踪Tracker

mac2024-03-30  32

Opencv——目标跟踪Tracker

OpenCV有八种不同的目标追踪工具,他们都可以运用到计算机视觉领域中。本文只用了以下六种对我现有数据的测试

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)

经过本人你的一番测试,发现与其他五种相比较CSRT Tracker这个跟踪效果最好,即使在遮挡的情况下,但是有一缺点就是处理速度慢,慢到你能很明显看出来是一帧一帧场景的播放。其他几个速度快的精度差,精度好的速度慢。

GOTURN Tracker:这是OpenCV中唯一一深度学习为基础的目标检测器。它需要额外的模型才能运行。这个本人这次没有测试。

用到的函数

返回值是rect,选区的坐标和大小 selectROI(const String& windowName, //窗口的名字 InputArray img, //输入图片 bool showCrosshair = true, //显示矩形 bool fromCenter = false); //选择矩形为初始位置。 cv::Ptr<cv::Tracker> tracker = cv::TrackerMIL::create(); cv::Ptr<cv::Tracker> tracker = cv::TrackerKCF::create(); cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create(); cv::Ptr<cv::Tracker> tracker = cv::TrackerMedianFlow::create(); cv::Ptr<cv::Tracker> tracker = cv::TrackerMOSSE::create(); cv::Ptr<cv::Tracker> tracker = cv::TrackerTLD::create(); tracker->init(InputArray image, const Rect2d& boundingBox); tracker->update(InputArray image, CV_OUT Rect2d& boundingBox );

代码

#include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/features2d/features2d.hpp> #include <opencv2/video/tracking.hpp> #include <opencv2/tracking/tracker.hpp> using namespace std; cv::Mat frame, image1, output; bool roi = false; bool video = true; cv::Rect2d rect; int main() { cv::VideoCapture capture; capture.open("vtest.avi"); if (!capture.isOpened()) { cout << "the video isn't opened" << endl; } //capture.read(image2); capture >> image1; cv::Ptr<cv::Tracker> tracker = cv::TrackerCSRT::create(); while (true) { capture >> image1; if (cv::waitKey(30) == 112) { rect = cv::selectROI("image1", image1); roi = true; video = false; } if (roi) { tracker->init(image1, rect); tracker->update(image1, rect); image1.copyTo(output); cv::rectangle(output, rect, cv::Scalar(255, 255, 255), 2); cout << rect.x << "-" << rect.y << endl; cv::imshow("image1", output); } if (video) { cv::imshow("image1", image1); } if(cv::waitKey(60) == 27) break; cv::waitKey(60); } cv::waitKey(); }

CSRT效果

最新回复(0)