Трекинг объектов

Всем привет, делаю трекинг для объектов

Принцип работы программы

Идёт видео поток While:

  1. Получаю кард

  2. Получаю 100-200 центроидов каждого объекта

  3. Передаю массив №1 (objects_rect) в функцию euclidean_dist_tracker() где выдаю последовательно каждой координате свой id

  4. Получаю кард

  5. Получаю 100-200 центроидов каждого объекта

  6. Передаю массив №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] и сохраняем данный в основной словарь

Но опять так проблема что некоторые объекты двигаются вправо некоторые влево

В общем хотел узнать совет от того кто сталкивался с похожей проблемой

Картинка для наглядности введите сюда описание изображения


Ответы (0 шт):