added multi tracking

This commit is contained in:
2024-07-04 15:59:54 +02:00
parent cb5b36398a
commit 8c499903df
+30 -17
View File
@@ -91,7 +91,8 @@ class Corner:
class CornerTracker:
def __init__(self, name: str = 'CornerTracker'):
def __init__(self, color=(0, 255, 0), name: str = 'CornerTracker'):
self.color = color
self.name = name
self.tracking_ref_bb = None
self.tracking_ref_img = None
@@ -121,7 +122,7 @@ class CornerTracker:
cv2.rectangle(image_anno, matcher_rect[0], matcher_rect[1], COLOR_MATCHER, 1)
tracker_rect = to_rect(self.tracking_bb)
cv2.rectangle(image_anno, tracker_rect[0], tracker_rect[1], COLOR_TRACKER, 1)
cv2.rectangle(image_anno, tracker_rect[0], tracker_rect[1], self.color, 1)
def init_reference_frame(self, image: np.array):
print(f"Select tracking object")
@@ -155,9 +156,9 @@ class CornerTracker:
# Refine initial corners and store them as reference
self.corner_ref = self._corner_refine(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), corners=corner_list)
cv2.destroyWindow("Select")
#cv2.destroyWindow("Select")
def process(self, image: np.array):
def process(self, image: np.array, image_anno: np.array):
if self.tracker is None:
raise Exception(f"{self.name}: Call init_reference_frame() first")
@@ -171,10 +172,9 @@ class CornerTracker:
self.tracking_img = cv2.GaussianBlur(tracking_img, (9, 9), 0)
self.tracking_bb = tracking_bb
return self._match(image)
return self._match(image, image_anno)
def _match(self, image: np.array):
image_anno = image.copy()
def _match(self, image: np.array, image_anno: np.array):
tracking_anno = self.tracking_img.copy()
corners_raw = []
for ct in self.corner_matcher_list:
@@ -209,11 +209,12 @@ class CornerTracker:
self._print(f" -- Corner fine [{i}] {corners_refined[i]}")
self._print(f" -- Corner distance [{i}] {corners_refined[i] - self.corner_ref[i]}")
cv2.circle(image_anno, (int(corners_refined[i, 0]), int(corners_refined[i, 1])), 4, (0, 255, 0))
cv2.putText(image_anno, f"Distance [{i}] : {corners_refined[i] - self.corner_ref[i]}", (50, 20 + 20*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, self.color, 1)
cv2.imshow(f"{self.name}: Tracker: ", self.tracking_img)
cv2.imshow(f"{self.name}: Image Anno", image_anno)
def _corner_refine(self, src_gray, corners: np.array):
@staticmethod
def _corner_refine(src_gray, corners: np.array):
# convert from (n, 2) to (n, 1, 2)
corners_original = []
for corner in corners:
@@ -242,22 +243,34 @@ if __name__ == '__main__':
float_formatter = "{:.3f}".format
np.set_printoptions(formatter={'float_kind': float_formatter})
colors = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 0, 255), (0, 255, 255), (255, 255, 255)]
video = cv2.VideoCapture('./data/spindle_multi_black/%04d.png')
tracker_count = 0
tracker_list = []
if video.isOpened():
ct = CornerTracker()
# Read first frame.
ok, image = video.read()
if ok:
ct.init_reference_frame(image)
else:
print('Cannot read video file')
for tracker_count in range(0, 6):
ct = CornerTracker(colors[tracker_count], name=f"Tracker-{tracker_count}")
# Read first frame.
ok, image = video.read()
if ok:
ct.init_reference_frame(image)
else:
print('Cannot read video file')
tracker_list.append(ct)
k = cv2.waitKey(-1) & 0xff
if k == 27:
break
key_wait = -1
while True:
# Read a new frame
ok, image = video.read()
if ok:
ct.process(image)
image_anno = image.copy()
for ct in tracker_list:
ct.process(image, image_anno)
cv2.imshow(f"Image Anno", image_anno)
else:
video.set(cv2.CAP_PROP_POS_FRAMES, 0)
continue