跟踪imag时迭代陷入循环(无限循环)

2024-06-02 07:47:34 发布

您现在位置:Python中文网/ 问答频道 /正文

实际上,我在尝试用机器学习构建一个人脸识别考勤系统,因为我做了所有的事情,当我点击TrackImages按钮调用TrackImages()函数时,人脸被正确地跟踪和识别,但问题是当程序进入循环时,循环执行到attendance.loc[len(attendance)]=[Id,aa,date,timeStamp]这一行,然后它从While循环的开始再次开始迭代,而不是在新创建的csv文件中标记考勤,如代码中所述。程序将继续跟踪人脸,而不是完成识别和标记出勤情况。 Plzzz帮助

def TrackImages():
    recognizer = cv2.face.LBPHFaceRecognizer_create()
    recognizer.read(r"TrainingImageLabel\Trainner.yml")
    harcascadePath = "I:\\opencv\\build\\etc\\haarcascades\\haarcascade_frontalface_default.xml"
    faceCascade = cv2.CascadeClassifier(harcascadePath);
    df = pd.read_csv(r"StudentDetails\studentDetails.csv")
    cam = cv2.VideoCapture(0)
    font = cv2.FONT_HERSHEY_SIMPLEX
    col_names = ['Id','Name','Date','Time']
    attendence = pd.DataFrame(columns = col_names)
    while True:
        ret, im = cam.read()
        gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
        faces = faceCascade.detectMultiScale(gray, 1.2, 5)
        for (x,y,w,h) in faces:
            cv2.rectangle(im, (x,y), (x+w,y+h), (255,0,0),2)
            Id, conf = recognizer.predict(gray[y:y+h,x:x+w])
            if (conf <60):
                ts = time.time()
                date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
                timeStamp = datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
                aa = df.loc[df['Id'] == Id]['Name'].values
                tt = str(Id)+"-"+aa
                attendence.loc[len(attendence)] = [Id,aa,date,timeStamp]       
            else:
                Id = 'Unknown'
                tt = str(Id)
            if(conf>75):
                noOfFile = len(os.listdir("ImagesUnknown"))+1
                cv2.imwrite("ImagesUnknown\Image"+str(noOfFile)+".jpg", im[y:y+h,x:x+w])
            cv2.putText(im,str(tt), (x,y+h), font, 1,(255,255,255),2)
        attendence= attendence.drop_duplicates(subset = ['Id'], keep='first')
        cv2.imshow('im',im)
        if (cv2.waitKey(1) == ord('q')):
            break
    ts = time.time()
    date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
    timeStamp = datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
    Hour,Minute,Second = timeStamp.split(":")
    fileName = "Attendence\Attendence_" +date+"_"+ Hour+"-"+Minute+"-"+Second+".csv"
    attendence.to_csv(fileName,index=False)
    cam.release()
    cv2.destroyAllWindows()
    res = attendence
    message1.configure(text = res)

Tags: csviddatetimedatetimecv2timestampaa
1条回答
网友
1楼 · 发布于 2024-06-02 07:47:34

我相信问题出在你的压痕上。目前它的内容如下:

While True:
    for some_stuff in stuff:
        if (conf < 60):
            add a timestamp record to attendence.loc
        else:
            set some Id

        if (conf > 75):
            write an image file

    # This runs on every while loop
    cv2.imshow('im',im)
        if (cv2.waitKey(1) == ord('q')):
            break

# This runs once while is no longer True (after pressing `q`)
ts = time.time()
date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
timeStamp = datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
Hour,Minute,Second = timeStamp.split(":")
fileName = "Attendence\Attendence_" +date+"_"+ Hour+"-"+Minute+"-"+Second+".csv"
attendence.to_csv(fileName,index=False)

因此,如果希望每次都运行这些最终行,则需要将它们缩进一步,以便位于while循环中。但是,这不会对写入文件设置条件,而且无论发生什么情况都会这样做。您可以创建一个函数来添加时间戳并写入文件:

def write_file(attendance):
    ts = time.time()
    date = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d')
    timeStamp = datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
    Hour,Minute,Second = timeStamp.split(":")
    fileName = "Attendence\Attendence_" +date+"_"+ Hour+"-"+Minute+"-"+Second+".csv"
    attendence.to_csv(fileName,index=False)

While True:
    for some_stuff in stuff:
        if (conf < 60):
            add a timestamp record to attendence.loc
            write_file(attendence)
        else:
            set some Id

        if (conf > 75):
            write an image file

    # This runs on every while loop
    cv2.imshow('im',im)
        if (cv2.waitKey(1) == ord('q')):
            break

相关问题 更多 >