我正在进行一项面部识别项目,我和我的队友从昨天起就陷入了一个荒谬简单的问题。在用完可能的解决方案后,我来找你帮忙。
基本代码如下:
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)
这里nbr_predicted
是一个整数,它对应于预测人的id,而conf是预测的置信度。
让我们假设我们使用单张图片进行多次预测。应该在第一次迭代时插入代码,然后跳过进一步的插入。但是,即使在进一步的迭代中,代码也只是尝试再次插入相同的id。我有预感,因为函数recognizer.predict()
的返回值,但我无法确定它。
我遗漏了一些我认为与手头问题无关的细节。
以防万一,我将在下面留下完整的代码。
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)
请注意,这不是最终代码,我们仍在调试和添加其他功能。非常感谢任何帮助。
以下是代码无效的附加照片:
第一次插入正常,列表指示已插入id,但在下一次迭代中,即使预测的id已经在列表中,插入仍然开始。由于数据库中的错误插入而发生错误,但这超出了这一点。它甚至不应该开始插入。
答案 0 :(得分:0)
正如我想的那样,问题非常简单。我们(以及我们的意思是我的配偶),将列表声明为while循环而不是外部循环。导致它在每次迭代时创建一个新列表。