Я работаю над проектом 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
не смешаны. Я не могу найти подходящее решение для этого. Может кто-нибудь, пожалуйста, помогите мне здесь. Спасибо
РЕДАКТИРОВАТЬ
Я делаю вывод о тестовом видеофайле. Вот несколько изображений, чтобы лучше понять сценарий
На изображении выше мы видим, откуда входит женщина и куда она вышла рамы. Я также отметил начальную и конечную точку на изображении. Теперь посмотрите на изображение ниже, где входит вторая леди:
На изображении выше вы можете видеть, что вторая леди только что вошла, но все еще для нее отправная точка - то, где первая леди ввела ранее и все координаты, и линия проведена от координат первой леди. Это произошло потому, что в нашем коде centroid_list
все еще содержит координаты первой леди, поэтому она фактически начинает рисовать линию, откуда входит первая леди, и, следовательно, не имеет смысла. Надеюсь, что этот сценарий теперь очень понятен.