2017-10-09 13 views
0

我正在使用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 

回答

0

Im相當肯定,你需要創建一個named window,那麼你可以明確關閉該窗口本身。

然後,您可以摧毀窗口時,你不需要他們了:

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

我只是一個初學者在這裏先生。你能指定我應該把這些代碼究竟放在哪裏嗎? – Jaypee

+0

在進行任何處理之前,您需要使用namedWindow創建窗口,直到您檢測到某個表面,然後在檢測到某個表面時destroyAllWindows。 – GPPK

+0

當我使用namedWindow時,凸輪開始運行一點點laggy。而且我還得到了循環下一個窗口的錯誤。 – Jaypee

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