Merge remote-tracking branch 'origin/2.4'
[platform/upstream/opencv.git] / samples / cpp / hybridtrackingsample.cpp
1 /*
2  *
3  * Hybrid Tracking in OpenCV
4  * Usage: ./hybridtrackingsample live
5  *
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
11  *
12  */
13
14 #include <stdio.h>
15 #include <time.h>
16 #include <iostream>
17
18 #include "opencv2/highgui/highgui.hpp"
19 #include "opencv2/contrib/hybridtracker.hpp"
20
21 using namespace cv;
22 using namespace std;
23
24 Mat frame, image;
25 Rect selection;
26 Point origin;
27 bool selectObject = false;
28 int trackObject = 0;
29 int live = 1;
30
31 static void drawRectangle(Mat* img, Rect win) {
32     rectangle(*img, Point(win.x, win.y), Point(win.x + win.width, win.y
33             + win.height), Scalar(0, 255, 0), 2, CV_AA);
34 }
35
36 static void onMouse(int event, int x, int y, int, void*) {
37     if (selectObject) {
38         selection.x = MIN(x, origin.x);
39         selection.y = MIN(y, origin.y);
40         selection.width = std::abs(x - origin.x);
41         selection.height = std::abs(y - origin.y);
42         selection &= Rect(0, 0, image.cols, image.rows);
43     }
44
45     switch (event) {
46     case EVENT_LBUTTONDOWN:
47         origin = Point(x, y);
48         selection = Rect(x, y, 0, 0);
49         selectObject = true;
50         break;
51     case EVENT_LBUTTONUP:
52         selectObject = false;
53         trackObject = -1;
54         break;
55     }
56 }
57
58 static void help()
59 {
60     printf("Usage: ./hytrack live or ./hytrack <test_file> \n\
61 For Live View or Benchmarking. Read documentation is source code.\n\n");
62 }
63
64
65 int main(int argc, char** argv)
66 {
67     if(argc != 2) {
68         help();
69         return 1;
70     }
71
72     FILE* f = 0;
73     VideoCapture cap;
74     char test_file[20] = "";
75
76     if (strcmp(argv[1], "live") != 0)
77     {
78         sprintf(test_file, "%s", argv[1]);
79         f = fopen(test_file, "r");
80         char vid[20];
81         int values_read = fscanf(f, "%s\n", vid);
82         CV_Assert(values_read == 1);
83         cout << "Benchmarking against " << vid << endl;
84         live = 0;
85     }
86     else
87     {
88         cap.open(0);
89         if (!cap.isOpened())
90         {
91             cout << "Failed to open camera" << endl;
92             return 0;
93         }
94         cout << "Opened camera" << endl;
95         cap.set(CAP_PROP_FRAME_WIDTH, 640);
96         cap.set(CAP_PROP_FRAME_HEIGHT, 480);
97         cap >> frame;
98     }
99
100     HybridTrackerParams params;
101     // motion model params
102     params.motion_model = CvMotionModel::LOW_PASS_FILTER;
103     params.low_pass_gain = 0.1f;
104     // mean shift params
105     params.ms_tracker_weight = 0.8f;
106     params.ms_params.tracking_type = CvMeanShiftTrackerParams::HS;
107     // feature tracking params
108     params.ft_tracker_weight = 0.2f;
109     params.ft_params.feature_type = CvFeatureTrackerParams::OPTICAL_FLOW;
110     params.ft_params.window_size = 0;
111
112     HybridTracker tracker(params);
113     char img_file[20] = "seqG/0001.png";
114     char img_file_num[10];
115     namedWindow("Win", 1);
116
117     setMouseCallback("Win", onMouse, 0);
118
119     int i = 0;
120     float w[4];
121     for(;;)
122     {
123         i++;
124         if (live)
125         {
126             cap >> frame;
127             if( frame.empty() )
128                 break;
129             frame.copyTo(image);
130         }
131         else
132         {
133             int values_read = fscanf(f, "%d %f %f %f %f\n", &i, &w[0], &w[1], &w[2], &w[3]);
134             CV_Assert(values_read == 5);
135             sprintf(img_file, "seqG/%04d.png", i);
136             image = imread(img_file, IMREAD_COLOR);
137             if (image.empty())
138                 break;
139             selection = Rect(cvRound(w[0]*image.cols), cvRound(w[1]*image.rows),
140                              cvRound(w[2]*image.cols), cvRound(w[3]*image.rows));
141         }
142
143         sprintf(img_file_num, "Frame: %d", i);
144         putText(image, img_file_num, Point(10, image.rows-20), FONT_HERSHEY_PLAIN, 0.75, Scalar(255, 255, 255));
145         if (!image.empty())
146         {
147
148             if (trackObject < 0)
149             {
150                 tracker.newTracker(image, selection);
151                 trackObject = 1;
152             }
153
154             if (trackObject)
155             {
156                 tracker.updateTracker(image);
157                 drawRectangle(&image, tracker.getTrackingWindow());
158             }
159
160             if (selectObject && selection.width > 0 && selection.height > 0)
161             {
162                 Mat roi(image, selection);
163                 bitwise_not(roi, roi);
164             }
165
166             drawRectangle(&image, Rect(cvRound(w[0]*image.cols), cvRound(w[1]*image.rows),
167                                        cvRound(w[2]*image.cols), cvRound(w[3]*image.rows)));
168             imshow("Win", image);
169
170             waitKey(100);
171         }
172         else
173             i = 0;
174     }
175
176     fclose(f);
177     return 0;
178 }