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:
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.
'Liste' ist ein Typname in Python, schlechte Idee, es mit Ihren eigenen Daten zu überschreiben. –
* Das ist jedoch nicht der Fall, wenn ich es ausführe *. ** Nun ** was passiert stattdessen? – Adelin
Was meinst du mit "nicht richtig funktioniert"? –