Трекинг объектов
Всем привет, делаю трекинг для объектов
Принцип работы программы
Идёт видео поток While:
Получаю кард
Получаю 100-200 центроидов каждого объекта
Передаю массив №1 (objects_rect) в функцию euclidean_dist_tracker() где выдаю последовательно каждой координате свой id
Получаю кард
Получаю 100-200 центроидов каждого объекта
Передаю массив №2 (objects_rect) в функцию euclidean_dist_tracker() и начинаю сравнивать с массивом №1
def euclidean_dist_tracker(self, objects_rect: list) -> list:
objects_bbs_ids = [] # Сюда будем записывать новые ID, массив типа [[x, y, id], ...]
for rect in objects_rect: # Передаём координаты x, y каждого объекта
x, y = rect # Координаты x, y текущего объекта
same_object_detected = False # Смогли найти пару объекту? Нет - Продолжаем
for id, pt in self.center_points.items():
dist = math.hypot(x - pt[0], y - pt[1]) # Вычисляем евклидово расстояние
# Если центроид сдвинулся в допустимых рамках(30px) сохраняем за ним старый id
if dist < self.max_dist:
self.center_points[id] = [x, y]
objects_bbs_ids.append([x, y, id])
same_object_detected = True # Смогли найти пару объекту? Да - выходим
break
# Условие добавление нового id
if same_object_detected is False: # Смогли найти пару объекту? Нет. Добавим ему новый id
self.center_points[self.start_id_count] = [cx, cy]
objects_bbs_ids.append([x, y, self.start_id_count])
self.start_id_count += 1
non_found = [[id, x, y] for x, y, id, _ in objects_bbs_ids if [x, y] not in list(self.center_points.values())] # [id, x, y] - объектов которые не были найдены
# Перезапись старых данных новыми
new_center_points = {}
for _, _, object_id, _ in objects_bbs_ids:
new_center_points[object_id] = self.center_points[object_id]
self.center_points = new_center_points.copy()
return objects_bbs_ids # На выходе массив типа [[x, y, id], ...]
Проблема такая, сейчас я сравниваю текущий и предыдущий кадр, но бывают ситуации когда объекта нету на 10 11 12 кадре, а на 13 он появляется и на 9 он был, как мне сравнить текущий кадр с кадрами которые были 3-4 кадра назад.
Если втупую хранить у каждого id по 10 его координат, то произойдёт такое что новые id перестанут выдаваться, объект находясь в любой точке экрана свяжется с какой нибудь точкой потому что их за 10 кадров будет 1000 = 10(кадров) * 100(объектов в кадре), т.е. сохраняя историю каждого объекта за последние 10 кадров я получаю 1000 координат x y
Есть вариант сдвигать каждый кадр id которые не были найдены, сами id у меня есть в переменной non_found, на скорость кадра, например если все объекты сдвинулись на 10px по оси х сдвигаем [5, 200, 200] на [10, 205, 200] и сохраняем данный в основной словарь
Но опять так проблема что некоторые объекты двигаются вправо некоторые влево
В общем хотел узнать совет от того кто сталкивался с похожей проблемой
