跟踪图像时迭代陷入循环(无限循环)
iteration getting stuck in loop(infinite loop) while tracking image
实际上,我正在尝试使用机器学习构建人脸识别考勤系统,因为当我单击调用 TrackImages() 函数的 TrackImages 按钮时,人脸被正确跟踪和识别,但问题是当程序进入循环时,循环执行到attendence.loc[len(attendence)] = [Id,aa,date,timeStamp]这一行,然后再次开始从 While 循环的开始对其进行迭代,而不是如代码中所述在新创建的 csv 文件中标记出勤率。该程序继续跟踪面部,而不是完成识别和标记出勤。
请帮忙.....
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)
我认为问题出在您的缩进上。目前它是这样写的:
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
实际上,我正在尝试使用机器学习构建人脸识别考勤系统,因为当我单击调用 TrackImages() 函数的 TrackImages 按钮时,人脸被正确跟踪和识别,但问题是当程序进入循环时,循环执行到attendence.loc[len(attendence)] = [Id,aa,date,timeStamp]这一行,然后再次开始从 While 循环的开始对其进行迭代,而不是如代码中所述在新创建的 csv 文件中标记出勤率。该程序继续跟踪面部,而不是完成识别和标记出勤。 请帮忙.....
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)
我认为问题出在您的缩进上。目前它是这样写的:
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