-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
231 lines (155 loc) · 6.04 KB
/
main.cpp
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include <opencv2/opencv.hpp>
#include <opencv2/video/tracking.hpp>
#include <opencv2/core/ocl.hpp>
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/dnn.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <sys/time.h>
#include <dasiamtracker.h>
using namespace std;
using namespace cv;
//initial normalized global values for the static bbox, make them volatile to be able to change them with interrupts
volatile float bbox_x = 0.5;
volatile float bbox_y = 0.5;
volatile float bbox_w = 0.22;
volatile float bbox_h = 0.3;
//create a value for fps and score
volatile int fps, score;
//boolean value to update the static bbox using normalized global values for the static bbox, make it volatile to be able to change them with interrupts
volatile bool if_bbox_change = true;
//boolean value to check if tracking signal recieved, make it volatile to be able to change them with interrupts
volatile bool track = false;
int main( int argc, char** argv)
{
//create matricies for frames
Mat frame;
//create the video capture object
VideoCapture cap;
//CHANGE THE CAPTURE OPTION HERE IF GSTREAMER DO NOT DESIRED TO BE USED
//cap = VideoCapture(0);
cap = VideoCapture("v4l2src device=/dev/video0 ! image/jpeg ! jpegdec ! videoconvert ! appsink");
//if video couldn't captured, exit
if (!cap.isOpened())
{
cout << "Error opening video file " << endl;
return -1;
}
//get the capture dimensions
int w = cap.get(CAP_PROP_FRAME_WIDTH);
int h = cap.get(CAP_PROP_FRAME_HEIGHT);
int org_fps = cap.get(CAP_PROP_FPS);
DaSiamTracker* tracker = new DaSiamTracker(w,h);
//create a value t detect the pressed key
int f;
//print original dimensions
cout << "original w: " << w << ", original h: " << h << ", original fps: " << org_fps << endl << endl;
//read the first frame
cap >> frame;
//if fail to read the frame, exit
if ( frame.empty() )
{
cout << "Error reading the first frame" << endl;
return -1;
}
//set a named window
namedWindow("Tracker", 1);
//perform the tracking process
printf("Start the tracking process, press ESC to quit, press t to track.\n\n");
for( ;; )
{
//detect key
f = waitKey(1);
//if esc is pressed, break
if(f == 27) break;
//if t is pressed, start tracking
if(f==116) track = true;
//if there is a change in the bbox coordinates, update the static_bbox and downscaled_bbox
if(if_bbox_change)
{
//update the static bbox coordinates
tracker->set_static_bbox(bbox_x * w, bbox_y * h, bbox_w * w, bbox_h * h);
//set if_bbox_change to false
if_bbox_change = false;
}
//get frame from the video
cap >> frame;
//if fail to read the frame
if ( frame.empty() )
{
cout << "Error while reading the frame" << endl << endl;
return -1;
}
//if track signal recieved, initialize tracking
if(track)
{
tracker->set_frame(&frame);
//initialize the tracker
tracker->initialize_tracking();
//print the message
cout << "Tracker initialized" << endl << endl;
//set the track value to false again
track = false;
}
// update the tracking result if tracking initialized
if(tracker->if_tracking_initialized())
{
tracker->set_frame(&frame);
//update the tracker
tracker->track();
//draw the tracked bbox
rectangle( frame, tracker->get_current_tracked_bbox(), Scalar( 255, 0, 0 ), 2, 1 );
}
// draw the static bbox
rectangle( frame, tracker->get_current_static_bbox(), Scalar( 0, 255, 0 ), 2, 1 );
if(tracker->if_tracking_initialized()) //tracking already initialized
{
//put the fps to the frame
putText(frame, //target image
"FPS: " + to_string(tracker->get_fps()), //text
Point(30,30), //top-left position
FONT_HERSHEY_COMPLEX,
1.0,
Scalar(200, 0, 200), //font color
2);
score = tracker->get_score() * 100;
//put the fps to the frame
if(tracker->get_score() < 60) //low score
{
putText(frame, //target image
"Tracking with: %" + to_string(tracker->get_score()) + " score", //text
Point(30,80), //top-left position
FONT_HERSHEY_DUPLEX,
0.8,
Scalar(0, 0, 255), //font color
2);
}
else //high score
{
putText(frame, //target image
"Tracking with: %" + to_string(tracker->get_score()) + " score", //text
Point(30,80), //top-left position
FONT_HERSHEY_DUPLEX,
0.8,
Scalar(0, 255, 0), //font color
2);
}
}
else//tracking hasn't initialized
{
putText(frame, //target image
"Tracking has not initialized", //text
Point(30,80), //top-left position
FONT_HERSHEY_DUPLEX,
0.8,
Scalar(100, 100, 100), //font color
2);
}
// show image with the tracked object
imshow("Tracker",frame);
}
}