识别到脸部时关闭窗口

时间:2017-10-09 14:42:45

标签: python opencv

我正在使用Python中的OpenCV进行人脸识别。我想关闭此窗口,然后在凸轮识别用户时打开另一个窗口。 (没关系窗户的开口,我已经这样做了)如果我只是打开另一个窗口,它会循环并显示大量的窗户。我确实在网上搜索但没有运气。有人能帮我吗?这是我的代码:

import cv2, sys, numpy, os

size = 1
fn_haar = 'data/haarcascade_frontalface_alt.xml'
fn_dir = 'userface'

print('Loading..')

(images, lables, names, img_id) = ([], [], {}, 0)

for (subdirs, dirs, files) in os.walk(fn_dir):
 for subdir in dirs:
  names[img_id] = subdir
  subjectpath = os.path.join(fn_dir, subdir)

 for filename in os.listdir(subjectpath):
  f_name, f_extension = os.path.splitext(filename)
  if (f_extension.lower() not in ['.png','.jpg','.jpeg','.gif','.pgm']):
    print("Skipping "+filename+", wrong file type")
    continue
  path = subjectpath + "/" + filename
  lable = img_id
  images.append(cv2.imread(path, 0))
  lables.append(int(lable))
 img_id += 1
(im_width, im_height) = (112, 92)
(images, lables) = [numpy.array(lis) for lis in [images, lables]]
model = cv2.face.FisherFaceRecognizer_create()
model.train(images, lables)
webcam = cv2.VideoCapture(0)
classifier = cv2.CascadeClassifier(fn_haar)

while(True):
 rval = False
 while(not rval):
  (rval, frame) = webcam.read()
  if (not rval):
   print("Failed to open webcam, Trying again...")
 frame = cv2.flip(frame, 1, 0)
 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
 mini = cv2.resize(frame, (int(frame.shape[1] / size), int(frame.shape[0] / 
 size)))
 faces = classifier.detectMultiScale(mini)

 for i in range(len(faces)):
  face_i = faces[i]
  (x, y, w, h) = [v * size for v in face_i]
  face = gray[y:y + h, x:x + w]
  face_resize = cv2.resize(face, (im_width, im_height))
  prediction = model.predict(face_resize)
  cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 3)

 if prediction[1]<2300:
  cv2.putText(frame, '%s - %.0f' % (names[prediction[0]], prediction[1]), 
  (x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 255, 0))
 else:
  cv2.putText(frame, 'Unknown', (x-10, y-10), cv2.FONT_HERSHEY_PLAIN,1,(0, 
  255, 0))

cv2.imshow("Login using Face Recognition", frame)
key = cv2.waitKey(10)
if (key == 27):
 break

2 个答案:

答案 0 :(得分:0)

我很确定你需要创建一个named window,这样你就可以专门关闭那个窗口了。

然后,当您不再需要时,可以销毁窗户:

 cv2.namedWindow('image', cv2.WINDOW_NORMAL)
 cv2.imshow('image',img)
 cv2.waitKey(0)
 cv2.destroyAllWindows()

答案 1 :(得分:0)

取决于您使用cv2.namedWindowcv2.imshow的方式。 如果您每次使用不同的winname,那么它可能会降低您的应用程序速度,因为您将创建新窗口。

我建议只使用cv.imshow并修改代码,以获得一个为当前窗口创建唯一标题的变量。

win_name = 'Login using Face Recognition: '
success_count = 0

while(True):
    # ... your recognition logic that would set `recognized`
    recognized = True 

    if recognized:
        cv2.destroyWindow(win_name + str(success_count))
        success_count += 1        

    cv2.imshow(win_name + str(success_count), frame)
    key = cv2.waitKey(10)
    if (key == 27):
        break