1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/tracking.hpp>
bool track(const cv::Ptr<cv::Tracker> &tracker, const cv::Mat& frame, cv::Rect2d &bbox, double& fps);
void trackVideo(std::string videoPath, std::string trackerName = "CSRT");
int main(int argc, char* argv[]) { trackVideo("C:\\Users\\XXX\\Desktop\\video.mp4", "MIL"); return 0; }
bool track(const cv::Ptr<cv::Tracker>& tracker, const cv::Mat& frame, cv::Rect2d &bbox, double& fps) { if (!frame.data) return false; if (!tracker) return false;
cv::Scalar color(255, 0, 0); double t = double(cv::getTickCount());
bool success = tracker->update(frame, bbox);
fps = cv::getTickFrequency() / (double(cv::getTickCount()) - t);
return success; }
void trackVideo(std::string videoPath, std::string trackerName) { cv::VideoCapture cap(videoPath);
cv::Ptr<cv::Tracker> tracker;
cv::Mat frame; int curFrame = 0, frameNum = (int)cap.get(CV_CAP_PROP_FRAME_COUNT); cv::Scalar color(255, 0, 0); while (true) { if (cap.read(frame)) { cv::Rect2d procArea; if (curFrame == 0) { procArea = cv::selectROI(frame);
if (trackerName == "BOOSTING") tracker = cv::TrackerBoosting::create(); if (trackerName == "MIL") tracker = cv::TrackerMIL::create(); if (trackerName == "KCF") tracker = cv::TrackerKCF::create(); if (trackerName == "TLD") tracker = cv::TrackerTLD::create(); if (trackerName == "MEDIANFLOW") tracker = cv::TrackerMedianFlow::create(); if (trackerName == "MOSSE") tracker = cv::TrackerMOSSE::create(); if (trackerName == "CSRT") tracker = cv::TrackerCSRT::create(); tracker->init(frame, procArea); cv::rectangle(frame, procArea, color); } else { double fps; if (!track(tracker, frame, procArea, fps)) {
cv::putText(frame, "Tracking failure detected", cv::Point(100, 80), cv::FONT_HERSHEY_SIMPLEX, 0.75, color, 2); break; } else { cv::rectangle(frame, procArea, color); }
cv::putText(frame, "FPS : " + std::to_string(int(fps)), cv::Point(100, 50), cv::FONT_HERSHEY_SIMPLEX, 0.75, color, 2); } cv::namedWindow("video", 1); cv::imshow("video", frame); if (cv::waitKey(30) == 27) { break; } }
curFrame++; if (curFrame == frameNum) { curFrame = 0; cap.set(CV_CAP_PROP_POS_FRAMES, 0); } } }
|