Завершение Asyn c Ошибка обратного вызова в opencv в tkinter gui - PullRequest
0 голосов
/ 31 марта 2020

Я создал главное окно в tkinter .... затем, когда я нажимаю кнопку в главном окне, оно открывает другое окно верхнего уровня, в котором я создал холст и кнопку .... Холст для: чтение камеры кадр за кадром и показывать ее в окне tkinter кнопка для: захват текущего кадра ... но в кнопке я использовал функцию обнаружения лица, чтобы определить лицо, когда он обнаруживает лицо, которое я хочу закрыть сверху. окно уровня и go заднее главное окно

В главном окне у меня есть еще одна кнопка для выхода из gui (означает master.destroy, когда я нажимаю выход) .... но здесь, когда я нажимаю выход, компьютер зависание и прошу насильно закрыть .... Я выкладываю свой код ниже '' '

 import tkinter
 from tkinter import *
 import cv2
 import PIL.Image, PIL.ImageTk
 import time
 import os
 import numpy as np

 class App(object):
    def __init__(self,master3):
        self.window=Toplevel(master3)
        self.window.title("capturing image")
        self.window.geometry("{}x{}".format(self.window.winfo_screenwidth(),self.window.winfo_screenheight()))
        self.vid = cv2.VideoCapture(0)
        #self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
        #self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
        self.canvas = Canvas(self.window, width = 1000, height = 700)
        self.path = os.path.dirname(os.path.abspath(__file__))
        self.detector=cv2.CascadeClassifier(self.path+r'\HarrCascade\haarcascade_frontalface.xml')
        #self.recognizer = cv2.face.LBPHFaceRecognizer_create()
        #self.recognizer.read(self.path+r'\trained_data\trained_file.xml')
        self.canvas.pack()
        self.canvas.pack()
        self.btn_snapshot=Button(self.window, text="Snapshot", width=50,command=self.snap)
        self.btn_snapshot.pack(anchor=CENTER, expand=True)
        if not self.vid.isOpened():
            raise IOError("Unable to open video source")
        else:
            self.count=0
            self.delay=15
            self.update()
    def g(self):
        if self.vid.isOpened():
            _,frame = self.vid.read()
            self.frame2 = frame
            self.count=1
            self.vid.release()
            cv2.waitKey(1)
            cv2.destroyAllWindows()
            for i in range(1,5):
                cv2.waitKey(1)
            master.deiconify()
    def snap(self):
        self.gray=cv2.cvtColor(self.frame2,cv2.COLOR_BGR2GRAY)
        self.faces= self.detector.detectMultiScale(self.gray, scaleFactor=1.2, minNeighbors=5, minSize=(100, 100), flags=cv2.CASCADE_SCALE_IMAGE)
        self.no_faces=self.faces.shape[0]
        if self.no_faces >= 1:
            for(x,y,w,h) in self.faces:  
                self.g()
                cv2.imwrite("face-0.jpg",self.gray) 


    def update(self):
        if self.vid.isOpened():
            ret, frame = self.vid.read()
            frame1=cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                if ret:
                     self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame1))
                     self.canvas.create_image(0, 0, image = self.photo, anchor = NW)
                else:
                     pass
                if self.count==0:
                     self.window.after(self.delay, self.update)
                else:
                     pass
        else:
            pass
 def fun():
    App(master)
    master.withdraw()
 def fun1():
    master.quit()

 master=Tk(screenName=None,baseName=None,className='Tk',useTk=1)
 master.title('face recognition system')
 master.geometry("{}x{}".format(master.winfo_screenwidth(),master.winfo_screenheight()))
 button2 = Button(master,text = 'Test Image',bg = 'black',fg = 'white',font = ('algerian',10),height = 3,width = 20,command=fun)
 button3 = Button(master,text = 'exit',bg = 'black',fg = 'white',font = ('algerian',10),height = 3,width = 20,command=fun1)
 button2.pack()
 button3.pack()
 master.mainloop()

' ''

заранее благодарю за вашу любезную помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...