Я использую следующий код для подсчета количества людей в веб-камере в реальном времени с утра до ночи

people_list = []

while True:
    _, frame = video_capture.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    faces = faceCascade.detectMultiScale(gray, 1.3, 5)

    detections = faceCascade.detectMultiScale(gray, 1.15, 5)

    for i in range(len(detections)):
        face_i = detections[i]
        x, y, w, h = face_i

        cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 222, 0), 1)
        font = cv2.FONT_HERSHEY_SIMPLEX
        people_list.insert(len(people_list)+1,i)

        cv2.putText(frame, "id: "+str ( people_list[i]), (x, y), font, 2, (255, 255, 255), 2, cv2.LINE_AA)

    # Display the resulting frame
    cv2.imshow('Video', frame)

Каждый раз, когда обнаруживается новое лицо, число people_list увеличивается. Однако число people_list увеличивается для каждого кадра, а не для каждого нового лица. Как я могу быть в состоянии разобраться с этим?

5
user3600801 30 Авг 2017 в 12:23

3 ответа

Лучший ответ

Нет необходимости в списке ...

Прежде всего, поскольку у вас нет IDs для людей, хранить людей, которых вы видите в списке, бессмысленно, поэтому вы должны просто использовать переменную, хранящую int:

people_count = 0

И тогда вместо этого:

people_list.insert(len(people_list)+1,i)

Вам нужно проверить, больше ли количество людей в текущем кадре, чем количество людей в последнем кадре, и увеличьте ли оно people_count на the number of people in the current frame - the number of people in the last frame. Таким образом, если в последнем кадре было 4 человек, а в этом кадре 6, то значение увеличивается на 2.

Поэтому вместо строки выше сделайте что-то вроде:

if len(detections) > last_count:
   people_count += len(detections - last_count)

last_count = len(detection)

Это должно работать для вас, если вы объявите last_count как 0 в начале вашего кода ...

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

Слово заключается в том, что если person A входит в комнату, people_count будет увеличиваться, а затем, если person B также входит, people_count теперь будет 2. Если person A уходит сейчас, он остается в 2 (как было 2 человек). Но теперь, если person A вернется, счет увеличится до 3, что неправильно, поскольку вы видели только 2 людей.

Кроме того, если вы пропустите лицо только на один кадр, то счетчик будет увеличиваться, поскольку он будет принимать это, когда этот человек ушел и в комнату вошел новый человек.

p.sid в качестве идентификатора, при добавлении в конец списка вы не должны использовать .insert(len(lst), val), вместо этого вы должны использовать .append(val), так как это намного лучше:)

1
Joe Iddon 8 Сен 2017 в 18:12

По сути, вы делаете people_list.insert(len(people_list)+1,i).

По сути, команда вставки: Первый аргумент - это индекс элемента, перед которым нужно вставить. И people_list.insert(0, x) вставляет в начало списка, а people_list.insert(len(people_list), x) эквивалентно a.append(x). Однако вы делаете (len() + 1 , i).

Вот как выглядят значения списка индекса : 0 1 2 3 4 5. Здесь len(arr_list)=6. Поэтому здесь arr_list.insert(len(arr_list), x) вставит i в шестой индекс, что похоже на добавление.

0
Shivansh Jagga 8 Сен 2017 в 19:43

Работать над изменением количества лиц для решения проблемы - отличный способ, который может сработать. но-

Рассмотрим этот случай: человек входит в кадр именно тогда, когда другой человек выходит из кадра. Теперь, посмотрев на счетчик списка, вы никак не можете это сказать.

Кроме того, если каскад лиц не может обнаружить лицо в одном кадре, то у вас будет ошибочный счет.

Так как вопрос помечен opencv, я предлагаю

  • Ищите лицо на изображении.
  • Как только лицо найдено, перестаньте считать его снова, пока оно не потеряно. Как вы узнаете, что лицо потеряно, если вы не нашли его? Отследите лицо после нахождения и добавления маски по нему. Есть много способов для отслеживания. Оптический поток, смещение может работать. Также посмотрите на трекеры KCF, MIL, Boosting, доступные в opencv 3.

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

1
I.Newton 10 Сен 2017 в 14:55
45956632