2017-08-30 9 views
6

Im en utilisant le code suivant pour compter le nombre de personnes en webcam en temps réel du matin au soirCOUNT en vidéo en temps réel

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) 

chaque fois que lorsqu'un nouveau visage est détecté, les augmentations de comptage de PEOPLE_LIST. Cependant, le compte people_list est augmenté pour chaque image au lieu de chaque nouvelle. Comment puis-je être en mesure de régler cela?

+1

Les utilisateurs contiennent-ils des identifiants uniques? Si c'est le cas, créez un ensemble d'identifiants uniques au lieu d'une liste. Edit: Il peut également être utile de vérifier si l'identifiant est déjà dans l'ensemble et l'ignorer, sinon votre logiciel insérera constamment des données dans l'ensemble pour chaque itération – AK47

+0

non ... ils n'en ont pas ... je dois assigner il est basé sur le nombre de personnes visitées à partir du matin –

+2

Eh bien, il semble que vous avez besoin de réévaluer votre façon de stocker les utilisateurs. Comment saurez-vous si un utilisateur spécifique quitte? – AK47

Répondre

0

Pas besoin d'une liste ...

tout d'abord, comme vous n'avez pas IDs pour le peuple, le stockage des personnes accueillies dans une liste est inutile si vous devez simplement utiliser une variable stockant un int:

people_count = 0 

puis au lieu de ceci:

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

vous devez vérifier si le nombre de personnes dans le cadre actuel est supérieur à t le nombre de personnes dans la dernière trame et si c'est alors incrémenter le people_count par the number of people in the current frame - the number of people in the last frame. Donc, s'il y avait 4 personnes dernière image et il y a 6 cette image puis incrémenter de 2.

Ainsi, au lieu de la ligne ci-dessus, faire quelque chose comme:

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

last_count = len(detection) 

Cela devrait travailler pour vous en supposant que vous déclarer comme last_count0 au début de votre code ...

Cependant disant cela, comme mentionné dans les commentaires, si vous ne pouvez pas identifier les visages de façon unique, alors il y aura un plancher important dans votre programme.

Le sol est que si person A entre dans la pièce, people_count incrémente et si person B pénètre aussi bien, people_count va maintenant être 2. Si person A part maintenant il reste à 2 (comme il y a eu 2 personnes). Mais maintenant, si person A retourne, il va augmenter le nombre à 3 ce qui est faux que vous avez vu seulement 2 personnes. En outre, si vous ratez un visage pour une seule image, le nombre augmentera au fur et à mesure que cette personne disparaîtra et qu'une nouvelle personne entrera dans la pièce.

ps comme sidenote, lors de l'ajout à la fin de la liste, vous ne devriez pas utiliser .insert(len(lst), val), au contraire, vous devez utiliser .append(val) car cela est beaucoup plus propre :)

0

Fondamentalement, ce que vous faites est people_list.insert(len(people_list)+1,i).

Ce que la commande insert fait essentiellement est: Le premier argument est l'index de l'élément avant lequel insérer. Et people_list.insert(0, x) insère au début de la liste, et people_list.insert(len(people_list), x) est équivalent à a.append(x). Cependant, vous faites (len() + 1 , i).

Voici comment les valeurs d'une liste ressemblent à: 0 1 2 3 4 5.Ici len(arr_list)=6. Donc ici, arr_list.insert(len(arr_list), x) insérerait i au 6ème index, qui est comme append.

0

Travailler sur le changement de compte-face pour résoudre le problème est un grand bidouillage qui pourrait fonctionner. mais-

Considérez ce cas-Une personne entre dans le cadre exactement lorsqu'une autre personne quitte le cadre. Maintenant, en regardant le nombre de listes, vous ne pouvez pas le dire.

De plus, si la cascade de face ne parvient pas à détecter le visage dans une image, vous obtiendrez un nombre erroné.

Puisque la question a OpenCV marqué, je suggest-

  • Rechercher un visage dans l'image.
  • Une fois qu'un visage est trouvé, arrêtez de considérer ce visage jusqu'à ce qu'il soit perdu. Comment vous saurez que le visage est perdu quand vous ne trouvez pas le visage? Suivre le visage après avoir trouvé et ajouté un masque dessus. Il y a plusieurs façons de suivre. Flux optique, camshift pourrait fonctionner. Regardez également sur les trackers KCF, MIL, Boosting disponibles à partir de opencv 3.

Ensuite, continuez à mettre à jour le nombre de faces comme vous le faites actuellement. Il vous donne un meilleur compte pour les personnes entrant et sortant. Mais pas les personnes distinctes comptent comme vous ne stockez pas les visages.