Python"对于不在列表中的项目"工作不正常

时间:2017-11-24 12:59:39

标签: python numpy opencv

我正在进行一项面部识别项目,我和我的队友从昨天起就陷入了一个荒谬简单的问题。在用完可能的解决方案后,我来找你帮忙。

基本代码如下:

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)

请注意,这不是最终代码,我们仍在调试和添加其他功能。非常感谢任何帮助。

以下是代码无效的附加照片:

enter image description here

第一次插入正常,列表指示已插入id,但在下一次迭代中,即使预测的id已经在列表中,插入仍然开始。由于数据库中的错误插入而发生错误,但这超出了这一点。它甚至不应该开始插入。

1 个答案:

答案 0 :(得分:0)

正如我想的那样,问题非常简单。我们(以及我们的意思是我的配偶),将列表声明为while循环而不是外部循环。导致它在每次迭代时创建一个新列表。