Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
computervisioneng committed Sep 20, 2022
0 parents commit fe36ab7
Show file tree
Hide file tree
Showing 3 changed files with 163 additions and 0 deletions.
118 changes: 118 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -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()
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
opencv-python==4.6.0.66
Pillow==9.2.0
face_recognition==1.3.0
42 changes: 42 additions & 0 deletions util.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit fe36ab7

Please sign in to comment.