import math
class EuclideanDistTracker:
def __init__(self):
# Store the center positions of the objects
self.center_points = {}
# Keep the count of the IDs
# each time a new object id detected, the count will increase by one
self.id_count = 0
def update(self, objects_rect):
# Objects boxes and ids
objects_bbs_ids = []
# Get center point of new object
for rect in objects_rect:
x, y, w, h = rect
cx = (x + x + w) // 2
cy = (y + y + h) // 2
# Find out if that object was detected already
same_object_detected = False
for id, pt in self.center_points.items():
dist = math.hypot(cx - pt[0], cy - pt[1])
if dist < 20: # Threshold
self.center_points[id] = (cx, cy)
print(self.center_points)
objects_bbs_ids.append([x, y, w, h, id])
same_object_detected = True
break
# New object is detected we assign the ID to that object
if same_object_detected is False:
self.center_points[self.id_count] = (cx, cy)
objects_bbs_ids.append([x, y, w, h, self.id_count])
self.id_count += 1
# Clean the dictionary by center points to remove IDS not used anymore
new_center_points = {}
for obj_bb_id in objects_bbs_ids:
_, _, _, _, object_id = obj_bb_id
center = self.center_points[object_id]
new_center_points[object_id] = center
# Update dictionary with IDs not used removed
self.center_points = new_center_points.copy()
return objects_bbs_ids
aW1wb3J0IG1hdGgKCmNsYXNzIEV1Y2xpZGVhbkRpc3RUcmFja2VyOgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgICMgU3RvcmUgdGhlIGNlbnRlciBwb3NpdGlvbnMgb2YgdGhlIG9iamVjdHMKICAgICAgICBzZWxmLmNlbnRlcl9wb2ludHMgPSB7fQogICAgICAgICMgS2VlcCB0aGUgY291bnQgb2YgdGhlIElEcwogICAgICAgICMgZWFjaCB0aW1lIGEgbmV3IG9iamVjdCBpZCBkZXRlY3RlZCwgdGhlIGNvdW50IHdpbGwgaW5jcmVhc2UgYnkgb25lCiAgICAgICAgc2VsZi5pZF9jb3VudCA9IDAKCgogICAgZGVmIHVwZGF0ZShzZWxmLCBvYmplY3RzX3JlY3QpOgogICAgICAgICMgT2JqZWN0cyBib3hlcyBhbmQgaWRzCiAgICAgICAgb2JqZWN0c19iYnNfaWRzID0gW10KCiAgICAgICAgIyBHZXQgY2VudGVyIHBvaW50IG9mIG5ldyBvYmplY3QKICAgICAgICBmb3IgcmVjdCBpbiBvYmplY3RzX3JlY3Q6CiAgICAgICAgICAgIHgsIHksIHcsIGggPSByZWN0CiAgICAgICAgICAgIGN4ID0gKHggKyB4ICsgdykgLy8gMgogICAgICAgICAgICBjeSA9ICh5ICsgeSArIGgpIC8vIDIKCiAgICAgICAgICAgICMgRmluZCBvdXQgaWYgdGhhdCBvYmplY3Qgd2FzIGRldGVjdGVkIGFscmVhZHkKICAgICAgICAgICAgc2FtZV9vYmplY3RfZGV0ZWN0ZWQgPSBGYWxzZQogICAgICAgICAgICBmb3IgaWQsIHB0IGluIHNlbGYuY2VudGVyX3BvaW50cy5pdGVtcygpOgogICAgICAgICAgICAgICAgZGlzdCA9IG1hdGguaHlwb3QoY3ggLSBwdFswXSwgY3kgLSBwdFsxXSkKCiAgICAgICAgICAgICAgICBpZiBkaXN0IDwgMjA6ICMgVGhyZXNob2xkCiAgICAgICAgICAgICAgICAgICAgc2VsZi5jZW50ZXJfcG9pbnRzW2lkXSA9IChjeCwgY3kpCiAgICAgICAgICAgICAgICAgICAgcHJpbnQoc2VsZi5jZW50ZXJfcG9pbnRzKQogICAgICAgICAgICAgICAgICAgIG9iamVjdHNfYmJzX2lkcy5hcHBlbmQoW3gsIHksIHcsIGgsIGlkXSkKICAgICAgICAgICAgICAgICAgICBzYW1lX29iamVjdF9kZXRlY3RlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICBicmVhawoKICAgICAgICAgICAgIyBOZXcgb2JqZWN0IGlzIGRldGVjdGVkIHdlIGFzc2lnbiB0aGUgSUQgdG8gdGhhdCBvYmplY3QKICAgICAgICAgICAgaWYgc2FtZV9vYmplY3RfZGV0ZWN0ZWQgaXMgRmFsc2U6CiAgICAgICAgICAgICAgICBzZWxmLmNlbnRlcl9wb2ludHNbc2VsZi5pZF9jb3VudF0gPSAoY3gsIGN5KQogICAgICAgICAgICAgICAgb2JqZWN0c19iYnNfaWRzLmFwcGVuZChbeCwgeSwgdywgaCwgc2VsZi5pZF9jb3VudF0pCiAgICAgICAgICAgICAgICBzZWxmLmlkX2NvdW50ICs9IDEKCiAgICAgICAgIyBDbGVhbiB0aGUgZGljdGlvbmFyeSBieSBjZW50ZXIgcG9pbnRzIHRvIHJlbW92ZSBJRFMgbm90IHVzZWQgYW55bW9yZQogICAgICAgIG5ld19jZW50ZXJfcG9pbnRzID0ge30KICAgICAgICBmb3Igb2JqX2JiX2lkIGluIG9iamVjdHNfYmJzX2lkczoKICAgICAgICAgICAgXywgXywgXywgXywgb2JqZWN0X2lkID0gb2JqX2JiX2lkCiAgICAgICAgICAgIGNlbnRlciA9IHNlbGYuY2VudGVyX3BvaW50c1tvYmplY3RfaWRdCiAgICAgICAgICAgIG5ld19jZW50ZXJfcG9pbnRzW29iamVjdF9pZF0gPSBjZW50ZXIKCiAgICAgICAgIyBVcGRhdGUgZGljdGlvbmFyeSB3aXRoIElEcyBub3QgdXNlZCByZW1vdmVkCiAgICAgICAgc2VsZi5jZW50ZXJfcG9pbnRzID0gbmV3X2NlbnRlcl9wb2ludHMuY29weSgpCiAgICAgICAgcmV0dXJuIG9iamVjdHNfYmJzX2lkcw==