- fixed accessing variable outside function
- refactored
This commit is contained in:
+68
-63
@@ -1,6 +1,7 @@
|
|||||||
import cv2
|
import cv2
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import argparse
|
import argparse
|
||||||
|
import sys
|
||||||
|
|
||||||
from util import image_crop, to_rect, bbox_add_position, bbox_center, bbox_round
|
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):
|
def init_reference_frame(self, _image: np.array):
|
||||||
# Draw mask
|
# Draw mask
|
||||||
_mask = CornerTracker.mask_init(image)
|
_mask = CornerTracker.mask_init(_image)
|
||||||
CornerTracker.mask_draw(image, _mask)
|
CornerTracker.mask_draw(_image, _mask)
|
||||||
|
|
||||||
# Select search area
|
# Select search area
|
||||||
print(f"Select tracking object")
|
print(f"Select tracking object")
|
||||||
@@ -299,6 +300,7 @@ if __name__ == '__main__':
|
|||||||
parser.add_argument("--scale", default=1.0)
|
parser.add_argument("--scale", default=1.0)
|
||||||
parser.add_argument("--track", action="store_true")
|
parser.add_argument("--track", action="store_true")
|
||||||
parser.add_argument("--path", action="store_true")
|
parser.add_argument("--path", action="store_true")
|
||||||
|
parser.add_argument("--loop", action="store_true")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
video = cv2.VideoCapture(args.filename)
|
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)]
|
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 0, 255), (0, 255, 255), (255, 255, 255)]
|
||||||
tracker_count = 0
|
tracker_count = 0
|
||||||
tracker_list = []
|
tracker_list = []
|
||||||
if video.isOpened():
|
if not video.isOpened():
|
||||||
# Read first frame.
|
print('Cannot open video file')
|
||||||
ok, image = video.read()
|
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:
|
if ok:
|
||||||
for tracker_count in range(0, 6):
|
tracker_list.append(ct)
|
||||||
select_window = image.copy()
|
print(f"Number of active tracker: {len(tracker_list)}")
|
||||||
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
|
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print('Cannot read video file')
|
break
|
||||||
|
|
||||||
# rewind to frame 0
|
# rewind to frame 0
|
||||||
video.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
video.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
||||||
|
|
||||||
key_wait = -1
|
key_wait = -1
|
||||||
dist_min = [(0, 0)]*len(tracker_list)
|
dist_min = [(0, 0)]*len(tracker_list)
|
||||||
dist_max = [(0, 0)]*len(tracker_list)
|
dist_max = [(0, 0)]*len(tracker_list)
|
||||||
while True:
|
while True:
|
||||||
# Start timer
|
# Start timer
|
||||||
timer = cv2.getTickCount()
|
timer = cv2.getTickCount()
|
||||||
# Read a new frame
|
# Read a new frame
|
||||||
ok, image = video.read()
|
ok, image = video.read()
|
||||||
if ok:
|
if not ok:
|
||||||
image_anno = image.copy()
|
if args.loop:
|
||||||
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:
|
|
||||||
video.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
video.set(cv2.CAP_PROP_POS_FRAMES, 0)
|
||||||
continue
|
continue
|
||||||
|
else:
|
||||||
# Exit if ESC pressed
|
|
||||||
k = cv2.waitKey(key_wait) & 0xff
|
|
||||||
if k == 27:
|
|
||||||
break
|
break
|
||||||
if k == ord(' '):
|
|
||||||
if key_wait == -1:
|
|
||||||
key_wait = 1
|
|
||||||
else:
|
|
||||||
key_wait = -1
|
|
||||||
|
|
||||||
else:
|
image_anno = image.copy()
|
||||||
print('Cannot open video file')
|
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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user