From fe36ab748e87a87efeccc83fb9c6b90a4cc78484 Mon Sep 17 00:00:00 2001 From: computervisiondeveloper Date: Tue, 20 Sep 2022 09:04:32 -0300 Subject: [PATCH] initial commit --- main.py | 118 +++++++++++++++++++++++++++++++++++++++++++++++ requirements.txt | 3 ++ util.py | 42 +++++++++++++++++ 3 files changed, 163 insertions(+) create mode 100755 main.py create mode 100644 requirements.txt create mode 100755 util.py diff --git a/main.py b/main.py new file mode 100755 index 0000000..5f41fa2 --- /dev/null +++ b/main.py @@ -0,0 +1,118 @@ +import os.path +import datetime +import subprocess + +import tkinter as tk +import cv2 +from PIL import Image, ImageTk + +import util + + +class App: + def __init__(self): + self.main_window = tk.Tk() + self.main_window.geometry("1200x520+350+100") + + self.login_button_main_window = util.get_button(self.main_window, 'login', 'green', self.login) + self.login_button_main_window.place(x=750, y=300) + + self.register_new_user_button_main_window = util.get_button(self.main_window, 'register new user', 'gray', + self.register_new_user, fg='black') + self.register_new_user_button_main_window.place(x=750, y=400) + + self.webcam_label = util.get_img_label(self.main_window) + self.webcam_label.place(x=10, y=0, width=700, height=500) + + self.add_webcam(self.webcam_label) + + self.db_dir = './db' + if not os.path.exists(self.db_dir): + os.mkdir(self.db_dir) + + self.log_path = './log.txt' + + def add_webcam(self, label): + if 'cap' not in self.__dict__: + self.cap = cv2.VideoCapture(2) + + self._label = label + self.process_webcam() + + def process_webcam(self): + ret, frame = self.cap.read() + + self.most_recent_capture_arr = frame + img_ = cv2.cvtColor(self.most_recent_capture_arr, cv2.COLOR_BGR2RGB) + self.most_recent_capture_pil = Image.fromarray(img_) + imgtk = ImageTk.PhotoImage(image=self.most_recent_capture_pil) + self._label.imgtk = imgtk + self._label.configure(image=imgtk) + + self._label.after(20, self.process_webcam) + + def login(self): + unknown_img_path = './.tmp.jpg' + + cv2.imwrite(unknown_img_path, self.most_recent_capture_arr) + + output = str(subprocess.check_output(['face_recognition', self.db_dir, unknown_img_path])) + name = output.split(',')[1][:-3] + + if name in ['unknown_person', 'no_persons_found']: + util.msg_box('Ups...', 'Unknown user. Please register new user or try again.') + else: + util.msg_box('Welcome back !', 'Welcome, {}.'.format(name)) + with open(self.log_path, 'a') as f: + f.write('{},{}\n'.format(name, datetime.datetime.now())) + f.close() + + os.remove(unknown_img_path) + + def register_new_user(self): + self.register_new_user_window = tk.Toplevel(self.main_window) + self.register_new_user_window.geometry("1200x520+370+120") + + self.accept_button_register_new_user_window = util.get_button(self.register_new_user_window, 'Accept', 'green', self.accept_register_new_user) + self.accept_button_register_new_user_window.place(x=750, y=300) + + self.try_again_button_register_new_user_window = util.get_button(self.register_new_user_window, 'Try again', 'red', self.try_again_register_new_user) + self.try_again_button_register_new_user_window.place(x=750, y=400) + + self.capture_label = util.get_img_label(self.register_new_user_window) + self.capture_label.place(x=10, y=0, width=700, height=500) + + self.add_img_to_label(self.capture_label) + + self.entry_text_register_new_user = util.get_entry_text(self.register_new_user_window) + self.entry_text_register_new_user.place(x=750, y=150) + + self.text_label_register_new_user = util.get_text_label(self.register_new_user_window, 'Please, \ninput username:') + self.text_label_register_new_user.place(x=750, y=70) + + def try_again_register_new_user(self): + self.register_new_user_window.destroy() + + def add_img_to_label(self, label): + imgtk = ImageTk.PhotoImage(image=self.most_recent_capture_pil) + label.imgtk = imgtk + label.configure(image=imgtk) + + self.register_new_user_capture = self.most_recent_capture_arr.copy() + + def start(self): + self.main_window.mainloop() + + def accept_register_new_user(self): + name = self.entry_text_register_new_user.get(1.0, "end-1c") + + cv2.imwrite(os.path.join(self.db_dir, '{}.jpg'.format(name)), self.register_new_user_capture) + + util.msg_box('Success!', 'User was registered successfully !') + + self.register_new_user_window.destroy() + + +if __name__ == "__main__": + app = App() + app.start() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..637245a --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +opencv-python==4.6.0.66 +Pillow==9.2.0 +face_recognition==1.3.0 diff --git a/util.py b/util.py new file mode 100755 index 0000000..d7086d1 --- /dev/null +++ b/util.py @@ -0,0 +1,42 @@ +import tkinter as tk +from tkinter import messagebox + + +def get_button(window, text, color, command, fg='white'): + button = tk.Button( + window, + text=text, + activebackground="black", + activeforeground="white", + fg=fg, + bg=color, + command=command, + height=2, + width=20, + font=('Helvetica bold', 20) + ) + + return button + + +def get_img_label(window): + label = tk.Label(window) + label.grid(row=0, column=0) + return label + + +def get_text_label(window, text): + label = tk.Label(window, text=text) + label.config(font=("sans-serif", 21), justify="left") + return label + + +def get_entry_text(window): + inputtxt = tk.Text(window, + height=2, + width=15, font=("Arial", 32)) + return inputtxt + + +def msg_box(title, description): + messagebox.showinfo(title, description)