Как создать тему, чтобы сделать снимок через 3 секунды? - PullRequest
0 голосов
/ 19 апреля 2019

Я создал класс для отображения видео с веб-камеры на экране Tkinter, и я хотел бы сделать 3 снимка (через 3 секунды после каждого снятого снимка) после нажатия кнопки Tkinter.

Здесьмой код (уменьшен), и моя логика для съемки сделана.Должен ли я использовать темы, чтобы решить эту проблему?Я новичок в Python.

import tkinter, cv2, time, dlib, numpy as np, time, threading
from PIL import Image, ImageTk

class Tela:
def __init__(self, janela):
    self.janela = janela
    self.janela.title("Reconhecimento Facial")
    self.janela.config(background="#FFFFFF")
    self.image = None

    self.cam = cv2.VideoCapture(0)
    self.detector = dlib.get_frontal_face_detector()

    self.delay = 15
    self.update()
    self.janela.mainloop()

def update(self): # display image on gui
    ret, frame = self.cam.read()
    if ret:
        faces, confianca, idx = self.detector.run(frame)
        for i, face in enumerate(faces):
            e, t, d, b = (int(face.left()), int(face.top()), int(face.right()), int(face.bottom()))
            cv2.rectangle(frame, (e, t), (d, b), (0, 255, 255), 2)
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        self.image = Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=self.image)
        self.painel.imgtk = imgtk
        self.painel.config(image=imgtk)
        self.janela.after(self.delay, self.update)

def take_picture(self):
    cou = 1  # counter of pictures
    start = time.clock()  # starts the time
    ret, frame = self.cam.read()
    if ret:
        faces, confianca, idx = self.detector.run(frame)
        secs = (time.clock() - start)  # count seconds
        for i, face in enumerate(faces):
            e, t, d, b = (int(face.left()), int(face.top()), int(face.right()), int(face.bottom()))
            cv2.rectangle(frame, (e, t), (d, b), (0, 255, 255), 2)
            if secs > 3:
                imgfinal = cv2.resize(frame, (750, 600))
                cv2.imwrite("fotos/pessoa." + str(id[0][0]) + "." + str(cou) + ".jpg", imgfinal)
                print("Foto " + str(cou) + " tirada")
                cou += 1
                start = time.clock()  # reset the counter of seconds
        if cou > 3:
            # here is where the thread should stop


     # Creates the window
     Tela(tkinter.Tk())

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

при использовании time.sleep() будет заморозить ваш графический интерфейс, с помощью tkinter вы можете использовать after(), который будет вызывать ваш метод через x секунд. Ниже приведен пример вызова функции 4 раза каждые 2 секунды. и вы можете использовать эту идею в своем приложении

import tkinter as tk

class App():
    def __init__(self):
        self.root = tk.Tk()
        self.label = tk.Label(text="Anything")
        self.label.pack()

        self.counter = 0
        self.take_picture(repeates=4, seconds=2)  # our desired function

        self.root.mainloop()


    def take_picture(self, repeates=0, seconds=1):
        if repeates:
            self.counter = repeates

        if self.counter == 0:
            print('no more execution')
            self.label.configure(text='Done, no more execution')
            return

        # doing stuff    
        text = f'function counting down # {self.counter}'
        self.label.configure(text=text)

        # schedule another call to this func using after()
        self.root.after(seconds * 1000, self.take_picture, 0, seconds)
        self.counter -= 1  # our tracker

app=App()

кредитов этот ответ

0 голосов
/ 19 апреля 2019

Вы должны использовать time.sleep(). Он принимает целое число в качестве параметра и ждет столько секунд, а затем код возобновляет работу.

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