3 * Hybrid Tracking in OpenCV
4 * Usage: ./hybridtrackingsample live
6 * For Benchmarking against the Bonn benchmark dataset
7 * wget http://www.iai.uni-bonn.de/~kleind/tracking/datasets/seqG.zip
8 * unzip seqG.zip -d ./seqG
9 * ffmpeg -i seqG/Vid_G_rubikscube.avi seqG/%04d.png
10 * ./hytrack seqG/Vid_G_rubikscube.txt
18 #include "opencv2/highgui/highgui.hpp"
19 #include "opencv2/contrib/hybridtracker.hpp"
21 #ifndef _CRT_SECURE_NO_WARNINGS
22 # define _CRT_SECURE_NO_WARNINGS
31 bool selectObject = false;
35 static void drawRectangle(Mat* img, Rect win) {
36 rectangle(*img, Point(win.x, win.y), Point(win.x + win.width, win.y
37 + win.height), Scalar(0, 255, 0), 2, CV_AA);
40 static void onMouse(int event, int x, int y, int, void*) {
42 selection.x = MIN(x, origin.x);
43 selection.y = MIN(y, origin.y);
44 selection.width = std::abs(x - origin.x);
45 selection.height = std::abs(y - origin.y);
46 selection &= Rect(0, 0, image.cols, image.rows);
50 case EVENT_LBUTTONDOWN:
52 selection = Rect(x, y, 0, 0);
64 printf("Usage: ./hytrack live or ./hytrack <test_file> \n\
65 For Live View or Benchmarking. Read documentation is source code.\n\n");
69 int main(int argc, char** argv)
78 char test_file[20] = "";
80 if (strcmp(argv[1], "live") != 0)
82 sprintf(test_file, "%s", argv[1]);
83 f = fopen(test_file, "r");
85 int values_read = fscanf(f, "%s\n", vid);
86 CV_Assert(values_read == 1);
87 cout << "Benchmarking against " << vid << endl;
95 cout << "Failed to open camera" << endl;
98 cout << "Opened camera" << endl;
99 cap.set(CAP_PROP_FRAME_WIDTH, 640);
100 cap.set(CAP_PROP_FRAME_HEIGHT, 480);
104 HybridTrackerParams params;
105 // motion model params
106 params.motion_model = CvMotionModel::LOW_PASS_FILTER;
107 params.low_pass_gain = 0.1f;
109 params.ms_tracker_weight = 0.8f;
110 params.ms_params.tracking_type = CvMeanShiftTrackerParams::HS;
111 // feature tracking params
112 params.ft_tracker_weight = 0.2f;
113 params.ft_params.feature_type = CvFeatureTrackerParams::OPTICAL_FLOW;
114 params.ft_params.window_size = 0;
116 HybridTracker tracker(params);
117 char img_file[20] = "seqG/0001.png";
118 char img_file_num[10];
119 namedWindow("Win", 1);
121 setMouseCallback("Win", onMouse, 0);
137 int values_read = fscanf(f, "%d %f %f %f %f\n", &i, &w[0], &w[1], &w[2], &w[3]);
138 CV_Assert(values_read == 5);
139 sprintf(img_file, "seqG/%04d.png", i);
140 image = imread(img_file, IMREAD_COLOR);
143 selection = Rect(cvRound(w[0]*image.cols), cvRound(w[1]*image.rows),
144 cvRound(w[2]*image.cols), cvRound(w[3]*image.rows));
147 sprintf(img_file_num, "Frame: %d", i);
148 putText(image, img_file_num, Point(10, image.rows-20), FONT_HERSHEY_PLAIN, 0.75, Scalar(255, 255, 255));
154 tracker.newTracker(image, selection);
160 tracker.updateTracker(image);
161 drawRectangle(&image, tracker.getTrackingWindow());
164 if (selectObject && selection.width > 0 && selection.height > 0)
166 Mat roi(image, selection);
167 bitwise_not(roi, roi);
170 drawRectangle(&image, Rect(cvRound(w[0]*image.cols), cvRound(w[1]*image.rows),
171 cvRound(w[2]*image.cols), cvRound(w[3]*image.rows)));
172 imshow("Win", image);