|
6 | 6 | import cv2 as cv
|
7 | 7 |
|
8 | 8 | from lib.utils.lmdb_utils import decode_img
|
| 9 | +from pathlib import Path |
| 10 | +import numpy as np |
9 | 11 |
|
10 | 12 |
|
11 | 13 | def trackerlist(name: str, parameter_name: str, dataset_name: str, run_ids = None, display_name: str = None,
|
@@ -147,6 +149,128 @@ def _store_outputs(tracker_out: dict, defaults=None):
|
147 | 149 |
|
148 | 150 | return output
|
149 | 151 |
|
| 152 | + def run_video(self, videofilepath, optional_box=None, debug=None, visdom_info=None, save_results=False): |
| 153 | + """Run the tracker with the vieofile. |
| 154 | + args: |
| 155 | + debug: Debug level. |
| 156 | + """ |
| 157 | + |
| 158 | + params = self.get_parameters() |
| 159 | + |
| 160 | + debug_ = debug |
| 161 | + if debug is None: |
| 162 | + debug_ = getattr(params, 'debug', 0) |
| 163 | + params.debug = debug_ |
| 164 | + |
| 165 | + params.tracker_name = self.name |
| 166 | + params.param_name = self.parameter_name |
| 167 | + # self._init_visdom(visdom_info, debug_) |
| 168 | + |
| 169 | + multiobj_mode = getattr(params, 'multiobj_mode', getattr(self.tracker_class, 'multiobj_mode', 'default')) |
| 170 | + |
| 171 | + if multiobj_mode == 'default': |
| 172 | + tracker = self.create_tracker(params) |
| 173 | + |
| 174 | + elif multiobj_mode == 'parallel': |
| 175 | + tracker = MultiObjectWrapper(self.tracker_class, params, self.visdom, fast_load=True) |
| 176 | + else: |
| 177 | + raise ValueError('Unknown multi object mode {}'.format(multiobj_mode)) |
| 178 | + |
| 179 | + assert os.path.isfile(videofilepath), "Invalid param {}".format(videofilepath) |
| 180 | + ", videofilepath must be a valid videofile" |
| 181 | + |
| 182 | + output_boxes = [] |
| 183 | + |
| 184 | + cap = cv.VideoCapture(videofilepath) |
| 185 | + display_name = 'Display: ' + tracker.params.tracker_name |
| 186 | + cv.namedWindow(display_name, cv.WINDOW_NORMAL | cv.WINDOW_KEEPRATIO) |
| 187 | + cv.resizeWindow(display_name, 960, 720) |
| 188 | + success, frame = cap.read() |
| 189 | + cv.imshow(display_name, frame) |
| 190 | + |
| 191 | + def _build_init_info(box): |
| 192 | + return {'init_bbox': OrderedDict({1: box}), 'init_object_ids': [1, ], 'object_ids': [1, ], |
| 193 | + 'sequence_object_ids': [1, ]} |
| 194 | + |
| 195 | + if success is not True: |
| 196 | + print("Read frame from {} failed.".format(videofilepath)) |
| 197 | + exit(-1) |
| 198 | + if optional_box is not None: |
| 199 | + assert isinstance(optional_box, (list, tuple)) |
| 200 | + assert len(optional_box) == 4, "valid box's foramt is [x,y,w,h]" |
| 201 | + tracker.initialize(frame, _build_init_info(optional_box)) |
| 202 | + output_boxes.append(optional_box) |
| 203 | + else: |
| 204 | + while True: |
| 205 | + # cv.waitKey() |
| 206 | + frame_disp = frame.copy() |
| 207 | + |
| 208 | + cv.putText(frame_disp, 'Select target ROI and press ENTER', (20, 30), cv.FONT_HERSHEY_COMPLEX_SMALL, |
| 209 | + 1.5, (0, 0, 0), 1) |
| 210 | + |
| 211 | + x, y, w, h = cv.selectROI(display_name, frame_disp, fromCenter=False) |
| 212 | + init_state = [x, y, w, h] |
| 213 | + tracker.initialize(frame, _build_init_info(init_state)) |
| 214 | + output_boxes.append(init_state) |
| 215 | + break |
| 216 | + |
| 217 | + while True: |
| 218 | + ret, frame = cap.read() |
| 219 | + |
| 220 | + if frame is None: |
| 221 | + break |
| 222 | + |
| 223 | + frame_disp = frame.copy() |
| 224 | + |
| 225 | + # Draw box |
| 226 | + out = tracker.track(frame) |
| 227 | + state = [int(s) for s in out['target_bbox'][1]] |
| 228 | + output_boxes.append(state) |
| 229 | + |
| 230 | + cv.rectangle(frame_disp, (state[0], state[1]), (state[2] + state[0], state[3] + state[1]), |
| 231 | + (0, 255, 0), 5) |
| 232 | + |
| 233 | + font_color = (0, 0, 0) |
| 234 | + cv.putText(frame_disp, 'Tracking!', (20, 30), cv.FONT_HERSHEY_COMPLEX_SMALL, 1, |
| 235 | + font_color, 1) |
| 236 | + cv.putText(frame_disp, 'Press r to reset', (20, 55), cv.FONT_HERSHEY_COMPLEX_SMALL, 1, |
| 237 | + font_color, 1) |
| 238 | + cv.putText(frame_disp, 'Press q to quit', (20, 80), cv.FONT_HERSHEY_COMPLEX_SMALL, 1, |
| 239 | + font_color, 1) |
| 240 | + |
| 241 | + # Display the resulting frame |
| 242 | + cv.imshow(display_name, frame_disp) |
| 243 | + key = cv.waitKey(1) |
| 244 | + if key == ord('q'): |
| 245 | + break |
| 246 | + elif key == ord('r'): |
| 247 | + ret, frame = cap.read() |
| 248 | + frame_disp = frame.copy() |
| 249 | + |
| 250 | + cv.putText(frame_disp, 'Select target ROI and press ENTER', (20, 30), cv.FONT_HERSHEY_COMPLEX_SMALL, 1.5, |
| 251 | + (0, 0, 0), 1) |
| 252 | + |
| 253 | + cv.imshow(display_name, frame_disp) |
| 254 | + x, y, w, h = cv.selectROI(display_name, frame_disp, fromCenter=False) |
| 255 | + init_state = [x, y, w, h] |
| 256 | + tracker.initialize(frame, _build_init_info(init_state)) |
| 257 | + output_boxes.append(init_state) |
| 258 | + |
| 259 | + # When everything done, release the capture |
| 260 | + cap.release() |
| 261 | + cv.destroyAllWindows() |
| 262 | + |
| 263 | + if save_results: |
| 264 | + if not os.path.exists(self.results_dir): |
| 265 | + os.makedirs(self.results_dir) |
| 266 | + video_name = Path(videofilepath).stem |
| 267 | + base_results_path = os.path.join(self.results_dir, 'video_{}'.format(video_name)) |
| 268 | + |
| 269 | + tracked_bb = np.array(output_boxes).astype(int) |
| 270 | + bbox_file = '{}.txt'.format(base_results_path) |
| 271 | + np.savetxt(bbox_file, tracked_bb, delimiter='\t', fmt='%d') |
| 272 | + |
| 273 | + |
150 | 274 | def get_parameters(self):
|
151 | 275 | """Get parameters."""
|
152 | 276 | param_module = importlib.import_module('lib.test.parameter.{}'.format(self.name))
|
|
0 commit comments