Я использую следующий код для подсчета количества людей в веб-камере в реальном времени с утра до ночи
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 увеличивается для каждого кадра, а не для каждого нового лица. Как я могу быть в состоянии разобраться с этим?
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)
, так как это намного лучше:)
По сути, вы делаете 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
в шестой индекс, что похоже на добавление.
Работать над изменением количества лиц для решения проблемы - отличный способ, который может сработать. но-
Рассмотрим этот случай: человек входит в кадр именно тогда, когда другой человек выходит из кадра. Теперь, посмотрев на счетчик списка, вы никак не можете это сказать.
Кроме того, если каскад лиц не может обнаружить лицо в одном кадре, то у вас будет ошибочный счет.
Так как вопрос помечен opencv, я предлагаю
- Ищите лицо на изображении.
- Как только лицо найдено, перестаньте считать его снова, пока оно не потеряно. Как вы узнаете, что лицо потеряно, если вы не нашли его? Отследите лицо после нахождения и добавления маски по нему. Есть много способов для отслеживания. Оптический поток, смещение может работать. Также посмотрите на трекеры KCF, MIL, Boosting, доступные в opencv 3.
Затем продолжайте обновлять количество лиц, как вы делаете сейчас. Это дает вам лучший счет для людей, входящих и выходящих. Но не отдельные люди учитываются, поскольку вы не храните лица.
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.