Spaces:
Build error
Build error
import numpy as np | |
import colorsys | |
from .image_viewer import ImageViewer | |
def create_unique_color_float(tag, hue_step=0.41): | |
"""Create a unique RGB color code for a given track id (tag). | |
The color code is generated in HSV color space by moving along the | |
hue angle and gradually changing the saturation. | |
Parameters | |
---------- | |
tag : int | |
The unique target identifying tag. | |
hue_step : float | |
Difference between two neighboring color codes in HSV space (more | |
specifically, the distance in hue channel). | |
Returns | |
------- | |
(float, float, float) | |
RGB color code in range [0, 1] | |
""" | |
h, v = (tag * hue_step) % 1, 1. - (int(tag * hue_step) % 4) / 5. | |
r, g, b = colorsys.hsv_to_rgb(h, 1., v) | |
return r, g, b | |
def create_unique_color_uchar(tag, hue_step=0.41): | |
"""Create a unique RGB color code for a given track id (tag). | |
The color code is generated in HSV color space by moving along the | |
hue angle and gradually changing the saturation. | |
Parameters | |
---------- | |
tag : int | |
The unique target identifying tag. | |
hue_step : float | |
Difference between two neighboring color codes in HSV space (more | |
specifically, the distance in hue channel). | |
Returns | |
------- | |
(int, int, int) | |
RGB color code in range [0, 255] | |
""" | |
r, g, b = create_unique_color_float(tag, hue_step) | |
return int(255*r), int(255*g), int(255*b) | |
class NoVisualization(object): | |
""" | |
A dummy visualization object that loops through all frames in a given | |
sequence to update the tracker without performing any visualization. | |
""" | |
def __init__(self, seq_info): | |
self.frame_idx = seq_info["min_frame_idx"] | |
self.last_idx = seq_info["max_frame_idx"] | |
def set_image(self, image): | |
pass | |
def draw_groundtruth(self, track_ids, boxes): | |
pass | |
def draw_detections(self, detections): | |
pass | |
def draw_trackers(self, trackers): | |
pass | |
def run(self, frame_callback): | |
while self.frame_idx <= self.last_idx: | |
frame_callback(self, self.frame_idx) | |
self.frame_idx += 1 | |
class Visualization(object): | |
""" | |
This class shows tracking output in an OpenCV image viewer. | |
""" | |
def __init__(self, seq_info, update_ms): | |
image_shape = seq_info["image_size"][::-1] | |
aspect_ratio = float(image_shape[1]) / image_shape[0] | |
image_shape = 1024, int(aspect_ratio * 1024) | |
self.viewer = ImageViewer( | |
update_ms, image_shape, "Figure %s" % seq_info["sequence_name"]) | |
self.viewer.thickness = 2 | |
self.frame_idx = seq_info["min_frame_idx"] | |
self.last_idx = seq_info["max_frame_idx"] | |
def run(self, frame_callback): | |
self.viewer.run(lambda: self._update_fun(frame_callback)) | |
def _update_fun(self, frame_callback): | |
if self.frame_idx > self.last_idx: | |
return False # Terminate | |
frame_callback(self, self.frame_idx) | |
self.frame_idx += 1 | |
return True | |
def set_image(self, image): | |
self.viewer.image = image | |
def draw_groundtruth(self, track_ids, boxes): | |
self.viewer.thickness = 2 | |
for track_id, box in zip(track_ids, boxes): | |
self.viewer.color = create_unique_color_uchar(track_id) | |
self.viewer.rectangle(*box.astype(np.int), label=str(track_id)) | |
def draw_detections(self, detections): | |
self.viewer.thickness = 2 | |
self.viewer.color = 0, 0, 255 | |
for i, detection in enumerate(detections): | |
self.viewer.rectangle(*detection.tlwh) | |
def draw_trackers(self, tracks): | |
self.viewer.thickness = 2 | |
for track in tracks: | |
if not track.is_confirmed() or track.time_since_update > 0: | |
continue | |
self.viewer.color = create_unique_color_uchar(track.track_id) | |
self.viewer.rectangle( | |
*track.to_tlwh().astype(np.int), label=str(track.track_id)) | |
# self.viewer.gaussian(track.mean[:2], track.covariance[:2, :2], | |
# label="%d" % track.track_id) | |
# |