Merge pull request #2887 from ilya-lavrenov:ipp_morph_fix
[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 #ifndef _CRT_SECURE_NO_WARNINGS
22 # define _CRT_SECURE_NO_WARNINGS
23 #endif
24
25 using namespace cv;
26 using namespace std;
27
28 Mat frame, image;
29 Rect selection;
30 Point origin;
31 bool selectObject = false;
32 int trackObject = 0;
33 int live = 1;
34
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);
38 }
39
40 static void onMouse(int event, int x, int y, int, void*) {
41     if (selectObject) {
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);
47     }
48
49     switch (event) {
50     case EVENT_LBUTTONDOWN:
51         origin = Point(x, y);
52         selection = Rect(x, y, 0, 0);
53         selectObject = true;
54         break;
55     case EVENT_LBUTTONUP:
56         selectObject = false;
57         trackObject = -1;
58         break;
59     }
60 }
61
62 static void help()
63 {
64     printf("Usage: ./hytrack live or ./hytrack <test_file> \n\
65 For Live View or Benchmarking. Read documentation is source code.\n\n");
66 }
67
68
69 int main(int argc, char** argv)
70 {
71     if(argc != 2) {
72         help();
73         return 1;
74     }
75
76     FILE* f = 0;
77     VideoCapture cap;
78     char test_file[20] = "";
79
80     if (strcmp(argv[1], "live") != 0)
81     {
82         sprintf(test_file, "%s", argv[1]);
83         f = fopen(test_file, "r");
84         char vid[20];
85         int values_read = fscanf(f, "%s\n", vid);
86         CV_Assert(values_read == 1);
87         cout << "Benchmarking against " << vid << endl;
88         live = 0;
89     }
90     else
91     {
92         cap.open(0);
93         if (!cap.isOpened())
94         {
95             cout << "Failed to open camera" << endl;
96             return 0;
97         }
98         cout << "Opened camera" << endl;
99         cap.set(CAP_PROP_FRAME_WIDTH, 640);
100         cap.set(CAP_PROP_FRAME_HEIGHT, 480);
101         cap >> frame;
102     }
103
104     HybridTrackerParams params;
105     // motion model params
106     params.motion_model = CvMotionModel::LOW_PASS_FILTER;
107     params.low_pass_gain = 0.1f;
108     // mean shift params
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;
115
116     HybridTracker tracker(params);
117     char img_file[20] = "seqG/0001.png";
118     char img_file_num[10];
119     namedWindow("Win", 1);
120
121     setMouseCallback("Win", onMouse, 0);
122
123     int i = 0;
124     float w[4];
125     for(;;)
126     {
127         i++;
128         if (live)
129         {
130             cap >> frame;
131             if( frame.empty() )
132                 break;
133             frame.copyTo(image);
134         }
135         else
136         {
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);
141             if (image.empty())
142                 break;
143             selection = Rect(cvRound(w[0]*image.cols), cvRound(w[1]*image.rows),
144                              cvRound(w[2]*image.cols), cvRound(w[3]*image.rows));
145         }
146
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));
149         if (!image.empty())
150         {
151
152             if (trackObject < 0)
153             {
154                 tracker.newTracker(image, selection);
155                 trackObject = 1;
156             }
157
158             if (trackObject)
159             {
160                 tracker.updateTracker(image);
161                 drawRectangle(&image, tracker.getTrackingWindow());
162             }
163
164             if (selectObject && selection.width > 0 && selection.height > 0)
165             {
166                 Mat roi(image, selection);
167                 bitwise_not(roi, roi);
168             }
169
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);
173
174             waitKey(100);
175         }
176         else
177             i = 0;
178     }
179
180     fclose(f);
181     return 0;
182 }