0% found this document useful (0 votes)
57 views12 pages

Hackathon Days - 5 Days - Work Report

This document provides a work report from March 6-7 and March 14, 16-17. It lists the project leaders and other team members working on the project. It also includes code for an attendance tracking system using facial recognition. The code contains functions for capturing images, training the recognizer, tracking faces, and maintaining student details and attendance records in CSV files.

Uploaded by

Charmi Gangani
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views12 pages

Hackathon Days - 5 Days - Work Report

This document provides a work report from March 6-7 and March 14, 16-17. It lists the project leaders and other team members working on the project. It also includes code for an attendance tracking system using facial recognition. The code contains functions for capturing images, training the recognizer, tracking faces, and maintaining student details and attendance records in CSV files.

Uploaded by

Charmi Gangani
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 12

Hackathon days -5 days- work report

Leader : Yash Kothari


Leader : Pushti Depani

Other : Aniket Patel


Binti Bhatt
Dhruvi Dobariya
Harshil Thummar
Shruti Nathvani
Mann Desai

Date : (6th - 7th March)


(14th March)
(16th - 17th March)

Code :
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox as mess
import tkinter.simpledialog as tsd
import cv2,os
import csv
import numpy as np
from PIL import Image
import pandas as pd
import datetime
import time
from PIL import Image

def assure_path_exists(path):
dir = os.path.dirname(path)
if not os.path.exists(dir):
os.makedirs(dir)

def tick():
time_string = time.strftime('%H:%M:%S')
clock.config(text=time_string)
clock.after(200,tick)

def contact():
mess._show(title='Contact us', message="Please contact us on :
'[email protected]' ")
def check_haarcascadefile():
exists = os.path.isfile("haarcascade_frontalface_default.xml")
if exists:
pass
else:
mess._show(title='Some file missing', message='Please contact us
for help')
window.destroy()

def save_pass():
assure_path_exists("TrainingImageLabel/")
exists1 = os.path.isfile("TrainingImageLabel\psd.txt")
if exists1:
tf = open("TrainingImageLabel\psd.txt", "r")
key = tf.read()
else:
master.destroy()
new_pas = tsd.askstring('Old Password not found', 'Please enter a
new password below', show='*')
if new_pas == None:
mess._show(title='No Password Entered', message='Password not
set!! Please try again')
else:
tf = open("TrainingImageLabel\psd.txt", "w")
tf.write(new_pas)
mess._show(title='Password Registered', message='New password
was registered successfully!!')
return
op = (old.get())
newp= (new.get())
nnewp = (nnew.get())
if (op == key):
if(newp == nnewp):
txf = open("TrainingImageLabel\psd.txt", "w")
txf.write(newp)
else:
mess._show(title='Error', message='Confirm new password
again!!!')
return
else:
mess._show(title='Wrong Password', message='Please enter correct
old password.')
return
mess._show(title='Password Changed', message='Password changed
successfully!!')
master.destroy()

def change_pass():
global master
master = tk.Tk()
master.geometry("400x160")
master.resizable(False,False)
master.title("Change Password")
master.configure(background="white")
lbl4 = tk.Label(master,text=' Enter Old
Password',bg='white',font=('times', 12, ' bold '))
lbl4.place(x=10,y=10)
global old
old=tk.Entry(master,width=25
,fg="black",relief='solid',font=('times', 12, ' bold '),show='*')
old.place(x=180,y=10)
lbl5 = tk.Label(master, text=' Enter New Password', bg='white',
font=('times', 12, ' bold '))
lbl5.place(x=10, y=45)
global new
new = tk.Entry(master, width=25, fg="black",relief='solid',
font=('times', 12, ' bold '),show='*')
new.place(x=180, y=45)
lbl6 = tk.Label(master, text='Confirm New Password', bg='white',
font=('times', 12, ' bold '))
lbl6.place(x=10, y=80)
global nnew
nnew = tk.Entry(master, width=25, fg="black",
relief='solid',font=('times', 12, ' bold '),show='*')
nnew.place(x=180, y=80)
cancel=tk.Button(master,text="Cancel", command=master.destroy
,fg="black" ,bg="red" ,height=1,width=25 , activebackground = "white"
,font=('times', 10, ' bold '))
cancel.place(x=200, y=120)
save1 = tk.Button(master, text="Save", command=save_pass, fg="black",
bg="#3ece48", height = 1,width=25, activebackground="white",
font=('times', 10, ' bold '))
save1.place(x=10, y=120)
master.mainloop()

def psw():
assure_path_exists("TrainingImageLabel/")
exists1 = os.path.isfile("TrainingImageLabel\psd.txt")
if exists1:
tf = open("TrainingImageLabel\psd.txt", "r")
key = tf.read()
else:
new_pas = tsd.askstring('Old Password not found', 'Please enter a
new password below', show='*')
if new_pas == None:
mess._show(title='No Password Entered', message='Password not
set!! Please try again')
else:
tf = open("TrainingImageLabel\psd.txt", "w")
tf.write(new_pas)
mess._show(title='Password Registered', message='New password
was registered successfully!!')
return
password = tsd.askstring('Password', 'Enter Password', show='*')
if (password == key):
TrainImages()
elif (password == None):
pass
else:
mess._show(title='Wrong Password', message='You have entered
wrong password')

def clear():
txt.delete(0, 'end')
res = "First Click on Take Images then Save Profile"
message1.configure(text=res)

def clear2():
txt2.delete(0, 'end')
res = "First Click on Take Images then Save Profile"
message1.configure(text=res)

def TakeImages():
check_haarcascadefile()
columns = ['SERIAL NO.', '', 'ID', '', 'NAME']
assure_path_exists("StudentDetails/")
assure_path_exists("TrainingImage/")
serial = 0
exists = os.path.isfile("StudentDetails\StudentDetails.csv")
if exists:
with open("StudentDetails\StudentDetails.csv", 'r') as csvFile1:
reader1 = csv.reader(csvFile1)
for l in reader1:
serial = serial + 1
serial = (serial // 2)
csvFile1.close()
else:
with open("StudentDetails\StudentDetails.csv", 'a+') as csvFile1:
writer = csv.writer(csvFile1)
writer.writerow(columns)
serial = 1
csvFile1.close()
Id = (txt.get())
name = (txt2.get())
if ((name.isalpha()) or (' ' in name)):
cam = cv2.VideoCapture(0)
harcascadePath = "haarcascade_frontalface_default.xml"
detector = cv2.CascadeClassifier(harcascadePath)
sampleNum = 0
while (True):
ret, img = cam.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = detector.detectMultiScale(gray, 1.3, 5)
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0),
2)

sampleNum = sampleNum + 1

cv2.imwrite("TrainingImage\ " + name + "." + str(serial)


+ "." + Id + '.' + str(sampleNum) + ".jpg",
gray[y:y + h, x:x + w])

cv2.imshow('Taking Images', img)

if cv2.waitKey(100) & 0xFF == ord('q'):


break

elif sampleNum > 100:


break
cam.release()
cv2.destroyAllWindows()
res = "Images Taken for ID : " + Id
row = [serial, '', Id, '', name]
with open('StudentDetails\StudentDetails.csv', 'a+') as csvFile:
writer = csv.writer(csvFile)
writer.writerow(row)
csvFile.close()
message1.configure(text=res)
else:
if (name.isalpha() == False):
res = "Enter Correct name"
message.configure(text=res)

def TrainImages():
check_haarcascadefile()
assure_path_exists("TrainingImageLabel/")
recognizer = cv2.face_LBPHFaceRecognizer.create()
harcascadePath = "haarcascade_frontalface_default.xml"
detector = cv2.CascadeClassifier(harcascadePath)
faces, ID = getImagesAndLabels("TrainingImage")
try:
recognizer.train(faces, np.array(ID))
except:
mess._show(title='No Registrations', message='Please Register
someone first!!!')
return
recognizer.save("TrainingImageLabel\Trainner.yml")
res = "Profile Saved Successfully"
message1.configure(text=res)
message.configure(text='Total Registrations till now : ' +
str(ID[0]))
def getImagesAndLabels(path):

imagePaths = [os.path.join(path, f) for f in os.listdir(path)]

faces = []

Ids = []

for imagePath in imagePaths:

pilImage = Image.open(imagePath).convert('L')

imageNp = np.array(pilImage, 'uint8')

ID = int(os.path.split(imagePath)[-1].split(".")[1])

faces.append(imageNp)
Ids.append(ID)
return faces, Ids

def TrackImages():
check_haarcascadefile()
assure_path_exists("Attendance/")
assure_path_exists("StudentDetails/")
for k in tv.get_children():
tv.delete(k)
msg = ''
i = 0
j = 0
recognizer = cv2.face.LBPHFaceRecognizer_create()
exists3 = os.path.isfile("TrainingImageLabel\Trainner.yml")
if exists3:
recognizer.read("TrainingImageLabel\Trainner.yml")
else:
mess._show(title='Data Missing', message='Please click on Save
Profile to reset data!!')
return
harcascadePath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(harcascadePath);

cam = cv2.VideoCapture(0)
font = cv2.FONT_HERSHEY_SIMPLEX
# Set the font, text size, and color for the countdown text
font = cv2.FONT_HERSHEY_SIMPLEX
text_size = 1
text_color = (0, 0, 255)

# Set the start time and the countdown duration


start_time = time.time()
countdown_duration = 3
col_names = ['Id', '', 'Name', '', 'Date', '', 'Time']
exists1 = os.path.isfile("StudentDetails\StudentDetails.csv")
if exists1:
df = pd.read_csv("StudentDetails\StudentDetails.csv")
else:
mess._show(title='Details Missing', message='Students details are
missing, please check!')
cam.release()
cv2.destroyAllWindows()
window.destroy()
while True:
ret, im = cam.read()
gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
current_time = time.time()
time_remaining = countdown_duration - int(current_time -
start_time)
if time_remaining > 0:
text = "Starting in " + str(time_remaining) + " seconds..."
cv2.putText(im, text, (25, 25), font, text_size, text_color,
2)
cv2.imshow('Taking Attendance', im)
if cv2.waitKey(1) & 0xFF == ord('q'):
break

faces = faceCascade.detectMultiScale(gray, 1.2, 5)


if current_time - start_time > countdown_duration:
for (x, y, w, h) in faces:
cv2.rectangle(im, (x, y), (x + w, y + h), (225, 0, 0), 2)
serial, conf = recognizer.predict(gray[y:y + h, x:x + w])
if (conf < 100):
ts = time.time()
date =
datetime.datetime.fromtimestamp(ts).strftime('%d-%m-%Y')
timeStamp =
datetime.datetime.fromtimestamp(ts).strftime('%H:%M:%S')
aa = df.loc[df['SERIAL NO.'] ==
serial]['NAME'].values
ID = df.loc[df['SERIAL NO.'] == serial]['ID'].values
ID = str(ID)
ID = ID[1:-1]
bb = str(aa)
bb = bb[2:-2]
attendance = [str(ID), '', bb, '', str(date), '',
str(timeStamp)]

else:
Id = 'Unknown'
bb = str(Id)
cv2.putText(im, str(bb), (x, y + h), font, 1, (255, 255,
255), 2)
cv2.imshow('Taking Attendance', im)
if (cv2.waitKey(1)):
break

ts = time.time()
date = datetime.datetime.fromtimestamp(ts).strftime('%d-%m-%Y')
exists = os.path.isfile("Attendance\Attendance_" + date + ".csv")
if exists:
with open("Attendance\Attendance_" + date + ".csv", 'a+') as
csvFile1:
writer = csv.writer(csvFile1)
writer.writerow(attendance)
csvFile1.close()
else:
with open("Attendance\Attendance_" + date + ".csv", 'a+') as
csvFile1:
writer = csv.writer(csvFile1)
writer.writerow(col_names)
writer.writerow(attendance)
csvFile1.close()
with open("Attendance\Attendance_" + date + ".csv", 'r') as csvFile1:
reader1 = csv.reader(csvFile1)
for lines in reader1:
i = i + 1
if (i > 1):
if (i % 2 != 0):
if len(lines) > 0:
iidd = str(lines[0]) + ' '
tv.insert('', 0, text=iidd,
values=(str(lines[2]), str(lines[4]), str(lines[6])))
csvFile1.close()
cam.release()
cv2.destroyAllWindows()

global key
key = ''

ts = time.time()
date = datetime.datetime.fromtimestamp(ts).strftime('%d-%m-%Y')
day,month,year=date.split("-")

mont={'01':'January',
'02':'February',
'03':'March',
'04':'April',
'05':'May',
'06':'June',
'07':'July',
'08':'August',
'09':'September',
'10':'October',
'11':'November',
'12':'December'
}

window = tk.Tk()
window.geometry("1280x720")
window.resizable(True,False)
window.title("Attendance System")
window.configure(background='#EAEAEA')

frame1 = tk.Frame(window, bg="#C1CDCD")


frame1.place(relx=0.11, rely=0.17, relwidth=0.39, relheight=0.80)

frame2 = tk.Frame(window, bg="#C1CDCD")


frame2.place(relx=0.51, rely=0.17, relwidth=0.38, relheight=0.80)

message3 = tk.Label(window, text="Smart Attendance System"


,fg="white",bg="#262523" ,width=55 ,height=1,font=('times', 29, ' bold ')
)
message3.place(x=10, y=10)

frame3 = tk.Frame(window, bg="#c4c6ce")


frame3.place(relx=0.52, rely=0.09, relwidth=0.09, relheight=0.07)

frame4 = tk.Frame(window, bg="#c4c6ce")


frame4.place(relx=0.36, rely=0.09, relwidth=0.16, relheight=0.07)

datef = tk.Label(frame4, text = day+"-"+mont[month]+"-"+year+" | ",


fg="orange",bg="#262523" ,width=55 ,height=1,font=('times', 22, ' bold
'))
datef.pack(fill='both',expand=1)

clock = tk.Label(frame3,fg="orange",bg="#262523" ,width=95


,height=1,font=('times', 22, ' bold '))
clock.pack(fill='both',expand=1)
tick()

head2 = tk.Label(frame2, text=" For New


Registrations ", fg="black",bg="#EEE5DE"
,font=('times', 17, ' bold ') )
head2.grid(row=0,column=0)

head1 = tk.Label(frame1, text=" For Already


Registered ", fg="black",bg="#EEE5DE"
,font=('times', 17, ' bold ') )
head1.place(x=0,y=0)

lbl = tk.Label(frame2, text="Enter ID",width=20 ,height=1 ,fg="black"


,bg="#CD7054" ,font=('times', 17, ' bold ') )
lbl.place(x=80, y=55)

txt = tk.Entry(frame2,width=32 ,fg="black",font=('times', 15, ' bold '))


txt.place(x=30, y=88)

lbl2 = tk.Label(frame2, text="Enter Name",width=20 ,fg="black"


,bg="#CD7054" ,font=('times', 17, ' bold '))
lbl2.place(x=80, y=140)
txt2 = tk.Entry(frame2,width=32 ,fg="black",font=('times', 15, ' bold ')
)
txt2.place(x=30, y=173)

message1 = tk.Label(frame2, text="First Click on Take Images then Save


Profile" ,fg="black" ,width=39 ,height=1, activebackground = "yellow"
,font=('times', 15, ' bold '))
message1.place(x=7, y=230)

message = tk.Label(frame2, text="" ,bg="#CD7054" ,fg="black"


,width=39,height=1, activebackground = "yellow" ,font=('times', 16, '
bold '))
message.place(x=7, y=450)

lbl3 = tk.Label(frame1, text="Attendance",width=20 ,fg="black"


,bg="#CD7054" ,height=1 ,font=('times', 17, ' bold '))
lbl3.place(x=100, y=115)

res=0
exists = os.path.isfile("StudentDetails\StudentDetails.csv")
if exists:
with open("StudentDetails\StudentDetails.csv", 'r') as csvFile1:
reader1 = csv.reader(csvFile1)
for l in reader1:
res = res + 1
res = (res // 2) - 1
csvFile1.close()
else:
res = 0
message.configure(text='Total Registrations till now : '+str(res+1))

menubar = tk.Menu(window,relief='ridge')
filemenu = tk.Menu(menubar,tearoff=0)
filemenu.add_command(label='Change Password', command = change_pass)
filemenu.add_command(label='Contact Us', command = contact)
filemenu.add_command(label='Exit',command = window.destroy)
menubar.add_cascade(label='Help',font=('times', 29, ' bold
'),menu=filemenu)

tv= ttk.Treeview(frame1,height =13,columns = ('name','date','time'))


tv.column('#0',width=82)
tv.column('name',width=130)
tv.column('date',width=133)
tv.column('time',width=133)
tv.grid(row=2,column=0,padx=(0,0),pady=(150,0),columnspan=4)
tv.heading('#0',text ='ID')
tv.heading('name',text ='NAME')
tv.heading('date',text ='DATE')
tv.heading('time',text ='TIME')
scroll=ttk.Scrollbar(frame1,orient='vertical',command=tv.yview)
scroll.grid(row=2,column=4,padx=(0,100),pady=(150,0),sticky='ns')
tv.configure(yscrollcommand=scroll.set)

clearButton = tk.Button(frame2, text="Clear", command=clear ,fg="black"


,bg="grey" ,width=11 ,activebackground = "white" ,font=('times', 11, '
bold '))
clearButton.place(x=335, y=86)
clearButton2 = tk.Button(frame2, text="Clear", command=clear2
,fg="black" ,bg="grey" ,width=11 , activebackground = "white"
,font=('times', 11, ' bold '))
clearButton2.place(x=335, y=172)
takeImg = tk.Button(frame2, text="Take Images", command=TakeImages
,fg="black" ,bg="grey" ,width=14 ,height=1, activebackground = "white"
,font=('times', 15, ' bold '))
takeImg.place(x=150, y=300)
trainImg = tk.Button(frame2, text="Save Profile", command=psw ,fg="black"
,bg="grey" ,width=14 ,height=1, activebackground = "white"
,font=('times', 15, ' bold '))
trainImg.place(x=150, y=380)
trackImg = tk.Button(frame1, text="Take Attendance", command=TrackImages
,fg="black" ,bg="#a8ad8b" ,width=14 ,height=1, activebackground =
"white" ,font=('times', 15, ' bold '))
trackImg.place(x=150,y=50)
quitWindow = tk.Button(frame1, text="Quit", command=window.destroy
,fg="black" ,bg="#e05561" ,width=14 ,height=1, activebackground =
"white" ,font=('times', 15, ' bold '))
quitWindow.place(x=150, y=450)

window.configure(menu=menubar)
window.mainloop()
Database :

Database of final day of hackathon and the working condition of the product.

Proof :

You might also like