-
Notifications
You must be signed in to change notification settings - Fork 5.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1552 from amuhic:master
Implementation of CSR-DCF tracker (#1552) * Initial commit for CSR-DCF tracker implementation * Fixes for automatic build * General code fixes * Removed unused parameters. Added CSRT to automatic tests. * Fixed VS build warnings. Fixed a bug with gray sequences. * Fixed VS build errors for samples file.
- Loading branch information
Showing
11 changed files
with
2,354 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,144 @@ | ||
#include <opencv2/core/utility.hpp> | ||
#include <opencv2/tracking.hpp> | ||
#include <opencv2/videoio.hpp> | ||
#include <opencv2/highgui.hpp> | ||
#include <iostream> | ||
#include <cstring> | ||
#include <fstream> | ||
#include "samples_utility.hpp" | ||
|
||
using namespace std; | ||
using namespace cv; | ||
|
||
int main(int argc, char** argv) | ||
{ | ||
// show help | ||
if (argc<2) { | ||
cout << | ||
" Usage: example_tracking_csrt <video_name>\n" | ||
" examples:\n" | ||
" example_tracking_csrt Bolt/img/%04.jpg\n" | ||
" example_tracking_csrt Bolt/img/%04.jpg Bolt/grouondtruth.txt\n" | ||
" example_tracking_csrt faceocc2.webm\n" | ||
<< endl; | ||
return 0; | ||
} | ||
|
||
// create the tracker | ||
Ptr<TrackerCSRT> tracker = TrackerCSRT::create(); | ||
|
||
// const char* param_file_path = "/home/amuhic/Workspace/3_dip/params.yml"; | ||
// FileStorage fs(params_file_path, FileStorage::WRITE); | ||
// tracker->write(fs); | ||
// FileStorage fs(param_file_path, FileStorage::READ); | ||
// tracker->read( fs.root()); | ||
|
||
// set input video | ||
std::string video = argv[1]; | ||
VideoCapture cap(video); | ||
// and read first frame | ||
Mat frame; | ||
cap >> frame; | ||
|
||
// target bounding box | ||
Rect2d roi; | ||
if (argc > 2) { | ||
// read first line of ground-truth file | ||
std::string groundtruthPath = argv[2]; | ||
std::ifstream gtIfstream(groundtruthPath.c_str()); | ||
std::string gtLine; | ||
getline(gtIfstream, gtLine); | ||
gtIfstream.close(); | ||
|
||
// parse the line by elements | ||
std::stringstream gtStream(gtLine); | ||
std::string element; | ||
std::vector<int> elements; | ||
while (std::getline(gtStream, element, ',')) | ||
{ | ||
elements.push_back(cvRound(std::atof(element.c_str()))); | ||
} | ||
|
||
if (elements.size() == 4) { | ||
// ground-truth is rectangle | ||
roi = cv::Rect(elements[0], elements[1], elements[2], elements[3]); | ||
} | ||
else if (elements.size() == 8) { | ||
// ground-truth is polygon | ||
int xMin = cvRound(min(elements[0], min(elements[2], min(elements[4], elements[6])))); | ||
int yMin = cvRound(min(elements[1], min(elements[3], min(elements[5], elements[7])))); | ||
int xMax = cvRound(max(elements[0], max(elements[2], max(elements[4], elements[6])))); | ||
int yMax = cvRound(max(elements[1], max(elements[3], max(elements[5], elements[7])))); | ||
roi = cv::Rect(xMin, yMin, xMax - xMin, yMax - yMin); | ||
|
||
// create mask from polygon and set it to the tracker | ||
cv::Rect aaRect = cv::Rect(xMin, yMin, xMax - xMin, yMax - yMin); | ||
cout << aaRect.size() << endl; | ||
Mat mask = Mat::zeros(aaRect.size(), CV_8UC1); | ||
const int n = 4; | ||
std::vector<cv::Point> poly_points(n); | ||
//Translate x and y to rects start position | ||
int sx = aaRect.x; | ||
int sy = aaRect.y; | ||
for (int i = 0; i < n; ++i) { | ||
poly_points[i] = Point(elements[2 * i] - sx, elements[2 * i + 1] - sy); | ||
} | ||
cv::fillConvexPoly(mask, poly_points, Scalar(1.0), 8); | ||
mask.convertTo(mask, CV_32FC1); | ||
tracker->setInitialMask(mask); | ||
} | ||
else { | ||
std::cout << "Number of ground-truth elements is not 4 or 8." << std::endl; | ||
} | ||
|
||
} | ||
else { | ||
// second argument is not given - user selects target | ||
roi = selectROI("tracker", frame, true, false); | ||
} | ||
|
||
//quit if ROI was not selected | ||
if (roi.width == 0 || roi.height == 0) | ||
return 0; | ||
|
||
// initialize the tracker | ||
int64 t1 = cv::getTickCount(); | ||
tracker->init(frame, roi); | ||
int64 t2 = cv::getTickCount(); | ||
int64 tick_counter = t2 - t1; | ||
|
||
// do the tracking | ||
printf("Start the tracking process, press ESC to quit.\n"); | ||
int frame_idx = 1; | ||
for (;;) { | ||
// get frame from the video | ||
cap >> frame; | ||
|
||
// stop the program if no more images | ||
if (frame.rows == 0 || frame.cols == 0) | ||
break; | ||
|
||
// update the tracking result | ||
t1 = cv::getTickCount(); | ||
bool isfound = tracker->update(frame, roi); | ||
t2 = cv::getTickCount(); | ||
tick_counter += t2 - t1; | ||
frame_idx++; | ||
|
||
if (!isfound) { | ||
cout << "The target has been lost...\n"; | ||
waitKey(0); | ||
return 0; | ||
} | ||
|
||
// draw the tracked object and show the image | ||
rectangle(frame, roi, Scalar(255, 0, 0), 2, 1); | ||
imshow("tracker", frame); | ||
|
||
//quit on ESC button | ||
if (waitKey(1) == 27)break; | ||
} | ||
|
||
cout << "Elapsed sec: " << static_cast<double>(tick_counter) / cv::getTickFrequency() << endl; | ||
cout << "FPS: " << ((double)(frame_idx)) / (static_cast<double>(tick_counter) / cv::getTickFrequency()) << endl; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.