CODINGAN ABSENSI FACE ID
import cv2, os, numpy as np
import tkinter as tk
from PIL import ImageTk, Image
from datetime import datetime
def selesai1():
intructions.config(text="Rekam Data Telah Selesai!")
def selesai2():
intructions.config(text="Training Wajah Telah Selesai!")
def selesai3():
intructions.config(text="Absensi Telah Dilakukan")
def rekamDataWajah():
wajahDir = 'datawajah'
cam = cv2.VideoCapture(0)
cam.set(3, 640)
cam.set(4, 480)
faceDetector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eyeDetector = cv2.CascadeClassifier('haarcascade_eye.xml')
faceID = entry2.get()
nama = entry1.get()
nim = entry2.get()
kelas = entry3.get()
ambilData = 1
while True:
retV, frame = cam.read()
abuabu = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceDetector.detectMultiScale(abuabu, 1.3, 5)
for (x, y, w, h) in faces:
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 255), 2)
namaFile = str(nim) +'_'+str(nama) + '_' + str(kelas) +'_'+ str(ambilData) +'.jpg'
cv2.imwrite(wajahDir + '/' + namaFile, frame)
ambilData += 1
roiabuabu = abuabu[y:y + h, x:x + w]
roiwarna = frame[y:y + h, x:x + w]
eyes = eyeDetector.detectMultiScale(roiabuabu)
for (xe, ye, we, he) in eyes:
cv2.rectangle(roiwarna, (xe, ye), (xe + we, ye + he), (0, 255, 255), 1)
cv2.imshow('webcamku', frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # jika menekan tombol q akan berhenti
break
elif ambilData > 30:
break
selesai1()
cam.release()
cv2.destroyAllWindows() # untuk menghapus data yang sudah dibaca
def trainingWajah():
wajahDir = 'datawajah'
latihDir = 'latihwajah'
def getImageLabel(path):
imagePaths = [os.path.join(path, f) for f in os.listdir(path)]
faceSamples = []
faceIDs = []
for imagePath in imagePaths:
PILimg = Image.open(imagePath).convert('L')
imgNum = np.array(PILimg, 'uint8')
faceID = int(os.path.split(imagePath)[-1].split('_')[0])
faces = faceDetector.detectMultiScale(imgNum)
for (x, y, w, h) in faces:
faceSamples.append(imgNum[y:y + h, x:x + w])
faceIDs.append(faceID)
return faceSamples, faceIDs
faceRecognizer = cv2.face.LBPHFaceRecognizer_create()
faceDetector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces, IDs = getImageLabel(wajahDir)
faceRecognizer.train(faces, np.array(IDs))
# simpan
faceRecognizer.write(latihDir + '/training.xml')
selesai2()
def markAttendance(name):
with open("Attendance.csv",'r+') as f:
namesDatalist = f.readlines()
namelist = []
yournim = entry2.get()
yourclass = entry3.get()
for line in namesDatalist:
entry = line.split(',')
namelist.append(entry[0])
if name not in namelist:
now = datetime.now()
dtString = now.strftime('%H:%M:%S')
f.writelines(f'\n{name},{yourclass},{yournim},{dtString}')
def absensiWajah():
wajahDir = 'datawajah'
latihDir = 'latihwajah'
cam = cv2.VideoCapture(0)
cam.set(3, 640)
cam.set(4, 480)
faceDetector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faceRecognizer = cv2.face.LBPHFaceRecognizer_create()
faceRecognizer.read(latihDir + '/training.xml')
font = cv2.FONT_HERSHEY_SIMPLEX
#id = 0
yourname = entry1.get()
names = []
names.append(yourname)
minWidth = 0.1 * cam.get(3)
minHeight = 0.1 * cam.get(4)
while True:
retV, frame = cam.read()
frame = cv2.flip(frame, 1)
abuabu = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = faceDetector.detectMultiScale(abuabu, 1.2, 5, minSize=(round(minWidth), round(minHeight)), )
for (x, y, w, h) in faces:
frame = cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0),2)
id, confidence = faceRecognizer.predict(abuabu[y:y+h,x:x+w])
if (confidence < 100):
id = names[0]
confidence = " {0}%".format(round(150 - confidence))
elif confidence < 50:
id = names[0]
confidence = " {0}%".format(round(170 - confidence))
elif confidence > 70:
id = "Tidak Diketahui"
confidence = " {0}%".format(round(150 - confidence))
cv2.putText(frame, str(id), (x + 5, y - 5), font, 1, (255, 255, 255), 2)
cv2.putText(frame, str(confidence), (x + 5, y + h + 25), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)
cv2.imshow('ABSENSI WAJAH', frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # jika menekan tombol q akan berhenti
break
markAttendance(id)
selesai3()
cam.release()
cv2.destroyAllWindows()
# GUI
root = tk.Tk()
# mengatur canvas (window tkinter)
canvas = tk.Canvas(root, width=700, height=400)
canvas.grid(columnspan=3, rowspan=8)
canvas.configure(bg="Black")
# judul
judul = tk.Label(root, text="Absensi Face ID", font=("Roboto",34),bg="Black", fg="white")
canvas.create_window(350, 80, window=judul)
#credit
made = tk.Label(root, text="M Irza Alfarizi", font=("Times New Roman",13), bg="black",fg="white")
canvas.create_window(360, 20, window=made)
# for entry data nama
entry1 = tk.Entry (root, font="Roboto")
canvas.create_window(457, 170, height=25, width=411, window=entry1)
label1 = tk.Label(root, text="Nama Siswa", font="Roboto", fg="white", bg="black")
canvas.create_window(90,170, window=label1)
# for entry data nim
entry2 = tk.Entry (root, font="Roboto")
canvas.create_window(457, 210, height=25, width=411, window=entry2)
label2 = tk.Label(root, text="NPM", font="Roboto", fg="white", bg="black")
canvas.create_window(60, 210, window=label2)
# for entry data kelas
entry3 = tk.Entry (root, font="Roboto")
canvas.create_window(457, 250, height=25, width=411, window=entry3)
label3 = tk.Label(root, text="Kelas", font="Roboto", fg="white", bg="black")
canvas.create_window(65, 250, window=label3)
global intructions
# tombol untuk rekam data wajah
intructions = tk.Label(root, text="Hello !!!", font=("Roboto",15),fg="white",bg="black")
canvas.create_window(370, 300, window=intructions)
Rekam_text = tk.StringVar()
Rekam_btn = tk.Button(root, textvariable=Rekam_text, font="Roboto", bg="#20bebe", fg="white", height=1, width=15,command=rekamDataWajah)
Rekam_text.set("Rekam Gambar")
Rekam_btn.grid(column=0, row=7)
# tombol untuk training wajah
Rekam_text1 = tk.StringVar()
Rekam_btn1 = tk.Button(root, textvariable=Rekam_text1, font="Roboto", bg="#20bebe", fg="white", height=1, width=15,command=trainingWajah)
Rekam_text1.set("Training")
Rekam_btn1.grid(column=1, row=7)
# tombol absensi dengan wajah
Rekam_text2 = tk.StringVar()
Rekam_btn2 = tk.Button(root, textvariable=Rekam_text2, font="Roboto", bg="#20bebe", fg="white", height=1, width=20, command=absensiWajah)
Rekam_text2.set("Absensi Otomatis")
Rekam_btn2.grid(column=2, row=7)
root.mainloop()
Komentar
Posting Komentar