Как создать список python при каждом обнаружении нового объекта - PullRequest
2 голосов
/ 13 апреля 2020

Я работаю над проектом python opencv, в котором я detecting и tracking перемещаю человека в кадре. Я рисую line с того места, где человек входит в кадр, и продолжает рисовать там, где человек движется в кадре, а затем, наконец, останавливается, когда человек выходит из рамки. Ниже приведен код:

centroid_dict = dict()
centroid_list = []
object_id_list = []

"""
SOME CODE
"""

objects = tracker.update(rects)
    for (objectID, bbox) in objects.items():
        x1, y1, x2, y2 = bbox
        x1 = int(x1)
        y1 = int(y1)
        x2 = int(x2)
        y2 = int(y2)
        cX = int((x1 + x2) / 2.0)
        cY = int((y1 + y2) / 2.0)
        cv2.circle(frame, (cX, cY), 4, (0, 255, 0), -1)

        centroid_list.append((cX, cY))
        centroid_dict[objectID] = centroid_list
        if objectID not in object_id_list:
            # This will run only once for the first time for every objectID
            start_pt = (cX, cY)
            end_pt = (cX, cY)
            cv2.line(frame, start_pt, end_pt, (0, 255, 0), 2)
            object_id_list.append(objectID)
            first_time = False
        else:
            l = len(centroid_list)
            for pt in range(len(centroid_dict[objectID])):
                if not pt + 1 == l:
                    start_pt = (centroid_dict[objectID][pt][0], centroid_dict[objectID][pt][1])
                    end_pt = (centroid_dict[objectID][pt+1][0], centroid_dict[objectID][pt+1][1])
                    cv2.line(frame, start_pt, end_pt, (0, 255, 0), 2)

В приведенном выше коде я получаю objectID и bounding box coordinates человека от tracker.update(rects). Используя координаты, я вычисляю cX и cY, которые я использую позже, чтобы нарисовать линию. Я добавляю все cX, cY в centroid_list, которые позже добавляю в centroid_dict[objectID]. Это работает нормально, когда человек отслеживается. После первого лица, когда приходит второй человек, это строка aws, откуда первый человек вышел из кадра, и основная причина в том, что в коде я нигде не очищаю centroid_list, из-за чего он продолжает удерживать первого человека cX и cY и 2-го лица cX и cY также из-за неправильной линии.

Единственное решение - мне нужно создать отдельный список для каждого objectID. Так что cX и cY не смешаны. Я не могу найти подходящее решение для этого. Может кто-нибудь, пожалуйста, помогите мне здесь. Спасибо

РЕДАКТИРОВАТЬ

Я делаю вывод о тестовом видеофайле. Вот несколько изображений, чтобы лучше понять сценарий

enter image description here

На изображении выше мы видим, откуда входит женщина и куда она вышла рамы. Я также отметил начальную и конечную точку на изображении. Теперь посмотрите на изображение ниже, где входит вторая леди:

enter image description here

На изображении выше вы можете видеть, что вторая леди только что вошла, но все еще для нее отправная точка - то, где первая леди ввела ранее и все координаты, и линия проведена от координат первой леди. Это произошло потому, что в нашем коде centroid_list все еще содержит координаты первой леди, поэтому она фактически начинает рисовать линию, откуда входит первая леди, и, следовательно, не имеет смысла. Надеюсь, что этот сценарий теперь очень понятен.

1 Ответ

1 голос
/ 13 апреля 2020

вам не нужно centroid_list вы можете просто использовать centroid_dict

вы должны определить centroid_dict как collection.defaultdict перед вашим for l oop:

from collections import defaultdict
centroid_dict = defaultdict(list)

в вашем for l oop:

centroid_dict[objectID].append((cX, cY))

, чтобы нарисовать все точки, просто итерируйте на вашем centroid_dict.values()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...