2017-11-24 1 views
-5

Ich arbeite an einem Gesichtserkennungsprojekt und ich und meine Kumpels stecken seit gestern an einem absurd einfachen Problem fest. Da mir die möglichen Lösungen ausgegangen sind, bin ich zu dir gekommen, um dir zu helfen.Python "für Artikel nicht in der Liste" funktioniert nicht richtig

Der Grundcode ist wie folgt:

list=[] 
while true: 
    nbr_predicted, conf = recognizer.predict(gray[y:y+h,x:x+w]) 
    if nbr_predicted not in list: 
     list.append(nbr_predicted) 

Hier nbr_predicted eine ganze Zahl ist, die auf die ID der vorhergesagten Person und conf entspricht, ist das Vertrauen der Vorhersage. Nehmen wir an, dass wir ein einzelnes Bild für mehrere Vorhersagen verwenden. Der Code sollte angeblich in die erste Iteration eingefügt werden und dann weitere Einfügungen überspringen. Der Code versucht jedoch einfach, dieselbe ID auch bei weiteren Iterationen erneut einzufügen. Ich habe eine Ahnung, es ist wegen des Rückgabewerts der Funktion recognizer.predict(), aber ich bin nicht in der Lage, es zu lokalisieren. Ich habe einige der feineren Details weggelassen, von denen ich glaube, dass sie nicht mit dem vorliegenden Problem zusammenhängen.

Nur für den Fall, ich werde den vollen Code unten lassen.

import cv2,os 
import numpy as np 
from PIL import Image 
import pickle 
import MySQLdb 
import datetime 
from random import randint 
db = MySQLdb.connect(host="localhost",  
        user="######", 
        passwd="######", 
        db="######") 

recognizer = cv2.face.LBPHFaceRecognizer_create() 
recognizer.read('trainer/trainer.yml') 
cascadePath = "Classifiers/face.xml" 
faceCascade = cv2.CascadeClassifier(cascadePath); 
path = 'dataSet' 

cam = cv2.VideoCapture(0) 
font = cv2.FONT_HERSHEY_SIMPLEX 
while True: 
    inp = cv2.waitKey(1) 
    if inp == ord('q'):   
     #cam.release() 
     cv2.destroyAllWindows() 
     break 
    #ret, im =cam.read() 
    im = cv2.imread('D:\Images\pic.jpg') 
    gray=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
    faces=faceCascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5, minSize=(100, 100), flags=cv2.CASCADE_SCALE_IMAGE) 
    list=[] 
    for(x,y,w,h) in faces: 
     nbr_predicted, conf = recognizer.predict(gray[y:y+h,x:x+w]) 
     cv2.rectangle(im,(x-50,y-50),(x+w+50,y+h+50),(225,0,0),2) 
     print(nbr_predicted) 
     print(conf) 
     if(conf>45): 
      nbr_predicted_person='UNKNOWN' 
     cursor = db.cursor() 
     if not nbr_predicted in list:   
      print("Insertion started") 
      cursor.execute("INSERT INTO attendence VALUES (%s, %s, %s,%s,%s)", 
          (randint(0, 90),152134,None,datetime.datetime.now(),5)) 
      print("Insertion finished") 
      list.append(nbr_predicted) 
      db.commit() 
      db.close() 
      print(list) 
     cv2.putText(im,str(nbr_predicted),(x,y+h),font,2,(255,0,0),2,cv2.LINE_AA)#Draw the text 
     cv2.imshow('im',im) 
     cv2.waitKey(10) 

Bitte beachten Sie, dass dies nicht der endgültige Code ist und wir sind immer noch dabei, weitere Funktionen zu debuggen und hinzuzufügen. Jede Hilfe wird sehr geschätzt. Hier

ist ein weiteres Bild des Codes nicht funktioniert:

enter image description here

Die erste Einfügung geht in Ordnung, die Liste zeigt an, dass die ID eingefügt wurde, aber bei der nächsten Iteration, auch wenn die vorhergesagten ID ist bereits in der Liste, die Einfügung beginnt noch. Der Fehler tritt aufgrund falscher Einfügung in der Datenbank auf, aber das ist über den Punkt hinaus. Es sollte nicht einmal das Einfügen beginnen.

+0

'Liste' ist ein Typname in Python, schlechte Idee, es mit Ihren eigenen Daten zu überschreiben. –

+0

* Das ist jedoch nicht der Fall, wenn ich es ausführe *. ** Nun ** was passiert stattdessen? – Adelin

+0

Was meinst du mit "nicht richtig funktioniert"? –

Antwort

0

Das Problem war, wie ich dachte, absurd einfach. Wir (und mit "wir" meine ich einen Kumpel von mir), erklärten die Liste INNERHALB der while-Schleife statt außerhalb. Dadurch wird bei jeder Iteration eine neue Liste erstellt.

+0

Es war beschämend, dass es so lange dauerte, bis es behoben wurde. Alle Debugging-Tipps sind willkommen. – SkyFire

Verwandte Themen