From 1a879c2820ab2bbed3149dce83b8caa0ea488fe5 Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Tue, 9 Jul 2024 08:24:53 +0200 Subject: [PATCH] - fixed accessing variable outside function - refactored --- ocv_corner_tracker.py | 131 ++++++++++++++++++++++-------------------- 1 file changed, 68 insertions(+), 63 deletions(-) diff --git a/ocv_corner_tracker.py b/ocv_corner_tracker.py index 73ce090..6c8f7f0 100644 --- a/ocv_corner_tracker.py +++ b/ocv_corner_tracker.py @@ -1,6 +1,7 @@ import cv2 import numpy as np import argparse +import sys from util import image_crop, to_rect, bbox_add_position, bbox_center, bbox_round @@ -143,8 +144,8 @@ class CornerTracker: def init_reference_frame(self, _image: np.array): # Draw mask - _mask = CornerTracker.mask_init(image) - CornerTracker.mask_draw(image, _mask) + _mask = CornerTracker.mask_init(_image) + CornerTracker.mask_draw(_image, _mask) # Select search area print(f"Select tracking object") @@ -299,6 +300,7 @@ if __name__ == '__main__': parser.add_argument("--scale", default=1.0) parser.add_argument("--track", action="store_true") parser.add_argument("--path", action="store_true") + parser.add_argument("--loop", action="store_true") args = parser.parse_args() video = cv2.VideoCapture(args.filename) @@ -309,72 +311,75 @@ if __name__ == '__main__': colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 0, 255), (0, 255, 255), (255, 255, 255)] tracker_count = 0 tracker_list = [] - if video.isOpened(): - # Read first frame. - ok, image = video.read() + if not video.isOpened(): + print('Cannot open video file') + sys.exit(1) + # Read first frame. + ok, image = video.read() + if not ok: + print('Cannot read video file') + sys.exit(1) + + for tracker_count in range(0, 6): + select_window = image.copy() + print(f"Draw tracker #{tracker_count}") + ct = CornerTracker(ct_params, colors[tracker_count], name=f"Tracker-{tracker_count}") + ok = ct.init_reference_frame(select_window) if ok: - for tracker_count in range(0, 6): - select_window = image.copy() - print(f"Draw tracker #{tracker_count}") - ct = CornerTracker(ct_params, colors[tracker_count], name=f"Tracker-{tracker_count}") - ok = ct.init_reference_frame(select_window) - if ok: - tracker_list.append(ct) - print(f"Number of active tracker: {len(tracker_list)}") - else: - break - + tracker_list.append(ct) + print(f"Number of active tracker: {len(tracker_list)}") else: - print('Cannot read video file') + break - # rewind to frame 0 - video.set(cv2.CAP_PROP_POS_FRAMES, 0) + # rewind to frame 0 + video.set(cv2.CAP_PROP_POS_FRAMES, 0) - key_wait = -1 - dist_min = [(0, 0)]*len(tracker_list) - dist_max = [(0, 0)]*len(tracker_list) - while True: - # Start timer - timer = cv2.getTickCount() - # Read a new frame - ok, image = video.read() - if ok: - image_anno = image.copy() - i = 0 - cv2.rectangle(image_anno, (25, 0), (int(image_anno.shape[1]), 25*(1+len(tracker_list))), (0, 0, 0), -1) - for ct in tracker_list: - mean_distance = ct.process(image, image_anno) - if mean_distance is not None: - scale = ct_params.scale - scaled_distance = (scale*mean_distance[0], scale*mean_distance[1]) - dist_min[i] = (min(scaled_distance[0], dist_min[i][0]), min(scaled_distance[1], dist_min[i][1])) - dist_max[i] = (max(scaled_distance[0], dist_max[i][0]), max(scaled_distance[1], dist_max[i][1])) - cv2.putText(image_anno, f"Distance [{i}] : ({scaled_distance[0]:+05.2f}, " - f"{scaled_distance[1]:+05.2f}), Min: ({dist_min[i][0]:+05.2f}, {dist_min[i][1]:+05.2f})," - f" Max: ({dist_max[i][0]:+05.2f}, {dist_max[i][1]:+05.2f})", - (25, 25 * (i + 1)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ct.color, 1) - i += 1 - - # Calculate Frames per second (FPS) - fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer) - # Display FPS on frame - cv2.putText(image_anno, "FPS : " + str(int(fps)), (20, image_anno.shape[0] - 20), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (50, 170, 50), 1) - - cv2.imshow(f"Image Anno", image_anno) - else: + key_wait = -1 + dist_min = [(0, 0)]*len(tracker_list) + dist_max = [(0, 0)]*len(tracker_list) + while True: + # Start timer + timer = cv2.getTickCount() + # Read a new frame + ok, image = video.read() + if not ok: + if args.loop: video.set(cv2.CAP_PROP_POS_FRAMES, 0) continue - - # Exit if ESC pressed - k = cv2.waitKey(key_wait) & 0xff - if k == 27: + else: break - if k == ord(' '): - if key_wait == -1: - key_wait = 1 - else: - key_wait = -1 - else: - print('Cannot open video file') + image_anno = image.copy() + i = 0 + cv2.rectangle(image_anno, (25, 0), (int(image_anno.shape[1]), 25*(1+len(tracker_list))), (0, 0, 0), -1) + for ct in tracker_list: + mean_distance = ct.process(image, image_anno) + if mean_distance is not None: + scale = ct_params.scale + scaled_distance = (scale*mean_distance[0], scale*mean_distance[1]) + dist_min[i] = (min(scaled_distance[0], dist_min[i][0]), min(scaled_distance[1], dist_min[i][1])) + dist_max[i] = (max(scaled_distance[0], dist_max[i][0]), max(scaled_distance[1], dist_max[i][1])) + cv2.putText(image_anno, f"Distance [{i}] : ({scaled_distance[0]:+05.2f}, " + f"{scaled_distance[1]:+05.2f}), Min: ({dist_min[i][0]:+05.2f}, {dist_min[i][1]:+05.2f})," + f" Max: ({dist_max[i][0]:+05.2f}, {dist_max[i][1]:+05.2f})", + (25, 25 * (i + 1)), cv2.FONT_HERSHEY_SIMPLEX, 0.5, ct.color, 1) + i += 1 + + # Calculate Frames per second (FPS) + fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer) + # Display FPS on frame + cv2.putText(image_anno, "FPS : " + str(int(fps)), (20, image_anno.shape[0] - 20), + cv2.FONT_HERSHEY_SIMPLEX, 0.5, (50, 170, 50), 1) + + cv2.imshow(f"Image Anno", image_anno) + + # Exit if ESC pressed + k = cv2.waitKey(key_wait) & 0xff + if k == 27: + break + if k == ord(' '): + if key_wait == -1: + key_wait = 1 + else: + key_wait = -1 +