--- a +++ b/Code/blink_detection.py @@ -0,0 +1,81 @@ +from scipy.spatial import distance as dist +from imutils.video import VideoStream +from imutils import face_utils +import numpy as np +import imutils +import time +import dlib +import cv2 + +#get the location of the eyes +def eye_aspect_ratio(eye): + # compute the euclidean distances between the vertical landamrks + A = dist.euclidean(eye[1], eye[5]) + B = dist.euclidean(eye[2], eye[4]) + + # compute the euclidean distance between the horizontal + C = dist.euclidean(eye[0], eye[3]) + + # compute the eye aspect ratio + eye_opening_ratio = (A + B) / (2.0 * C) + + # return the eye aspect ratio + return eye_opening_ratio + + +# the consecuting frame factor tells us to consider this amount of farme. +ar_thresh = 0.3 +eye_ar_consec_frame = 5 +counter = 0 +total = 0 + +# get the frontal face detector and shape predictor +detector = dlib.get_frontal_face_detector() +predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") +cap = cv2.VideoCapture(0) +while(True): + _,frame = cap.read() + frame = cv2.flip(frame,1) + frame = imutils.resize(frame, width=500,height=500) + + (lBegin, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] + (rBegin, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"] + #preprocessing the image + gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) + clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) + clahe_image = clahe.apply(gray) + detections = detector(clahe_image,0) + for detection in detections: + shape = predictor(gray,detection) + shape = face_utils.shape_to_np(shape) + left_eye = shape[lBegin:lEnd] + right_eye = shape[rBegin:rEnd] + + leftEyeHull = cv2.convexHull(left_eye) + rightEyeHull= cv2.convexHull(right_eye) + cv2.drawContours(clahe_image, [leftEyeHull], -1, (0, 255, 0), 1) + cv2.drawContours(clahe_image, [rightEyeHull], -1, (0, 255, 0), 1) + #calculating the EAR + left_eye_Ear = eye_aspect_ratio(left_eye) + right_eye_Ear = eye_aspect_ratio(right_eye) + + avg_Ear = (left_eye_Ear + right_eye_Ear)/2.0 + + if avg_Ear<ar_thresh: + counter+=1 + else: + if counter>eye_ar_consec_frame: + total+= 1 + counter = 0 + cv2.putText(clahe_image, "Blinks: {}".format(total), (10, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) + cv2.putText(clahe_image, "EAR: {:.2f}".format(avg_Ear), (300, 30),cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) + cv2.imshow("Frame", clahe_image) + + key = cv2.waitKey(1) & 0xFF + if key == ord('q'): + break +cv2.destroyAllWindows() +cap.release() + + +