-
-
Save jmcalvomartin/e94ede0b0795f2141bb31a806b2259e1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# import the necessary packages | |
from scipy.spatial import distance as dist | |
from imutils.video import FileVideoStream | |
from imutils.video import VideoStream | |
from imutils import face_utils | |
import numpy as np | |
import argparse | |
import imutils | |
import time | |
import dlib | |
import cv2 | |
import pickle | |
import os | |
def eye_aspect_ratio(eye): | |
# compute the euclidean distances between the two sets of | |
# vertical eye landmarks (x, y)-coordinates | |
A = dist.euclidean(eye[1], eye[5]) | |
B = dist.euclidean(eye[2], eye[4]) | |
# compute the euclidean distance between the horizontal | |
# eye landmark (x, y)-coordinates | |
C = dist.euclidean(eye[0], eye[3]) | |
# compute the eye aspect ratio | |
ear = (A + B) / (2.0 * C) | |
# return the eye aspect ratio | |
return ear | |
# construct the argument parse and parse the arguments | |
ap = argparse.ArgumentParser() | |
ap.add_argument("-p", "--shape-predictor", default="", | |
help="path to facial landmark predictor") | |
#ap.add_argument("-v", "--video", type=str, default="", | |
#help="path to input video file") | |
args = vars(ap.parse_args()) | |
# define two constants, one for the eye aspect ratio to indicate | |
# blink and then a second constant for the number of consecutive | |
# frames the eye must be below the threshold | |
EYE_AR_THRESH = 0.3 | |
EYE_AR_CONSEC_FRAMES = 4 | |
# initialize the frame counters and the total number of blinks | |
COUNTER = 0 | |
TOTAL = 0 | |
# initialize dlib's face detector (HOG-based) and then create | |
# the facial landmark predictor | |
print("[INFO] loading facial landmark predictor...") | |
detector = dlib.get_frontal_face_detector() | |
#predictor = dlib.shape_predictor(args["shape_predictor"]) | |
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") | |
# grab the indexes of the facial landmarks for the left and | |
# right eye, respectively | |
(lStart, lEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eye"] | |
(rStart, rEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eye"] | |
# start the video stream thread | |
print("[INFO] starting video stream thread...") | |
#vs = FileVideoStream(args["video"]).start() | |
#fileStream = True | |
vs = VideoStream(src=0).start() | |
#vs = VideoStream(usePiCamera=True).start() | |
fileStream = False | |
#writer = None | |
time.sleep(2.0) | |
#load haarcascade FaceRecognition | |
faceCascade = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml') | |
rectanglecolor=(23,6,227) | |
# loop over frames from the video stream | |
while True: | |
# if this is a file video stream, then we need to check if | |
# there any more frames left in the buffer to process | |
if fileStream and not vs.more(): | |
ak | |
# grab the frame from the threaded video file stream, resize | |
# it, and convert it to grayscale | |
# channels) | |
frame = vs.read() | |
frame = imutils.resize(frame, width=900) | |
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) | |
# detect faces in the grayscale frame | |
rects = detector(gray, 0) | |
faces = faceCascade.detectMultiScale( | |
gray, | |
scaleFactor=1.5, | |
minNeighbors=5, | |
minSize=(30, 30), | |
flags=cv2.CASCADE_SCALE_IMAGE | |
) | |
# Draw a rectangle around the faces | |
for (x, y, w, h) in faces: | |
cv2.rectangle(frame, (x, y), (x+w, y+h), rectanglecolor, 2) | |
# loop over the face detections | |
for rect in rects: | |
# determine the facial landmarks for the face region, then | |
# convert the facial landmark (x, y)-coordinates to a NumPy | |
# array | |
shape = predictor(gray, rect) | |
shape = face_utils.shape_to_np(shape) | |
# extract the left and right eye coordinates, then use the | |
# coordinates to compute the eye aspect ratio for both eyes | |
leftEye = shape[lStart:lEnd] | |
rightEye = shape[rStart:rEnd] | |
leftEAR = eye_aspect_ratio(leftEye) | |
rightEAR = eye_aspect_ratio(rightEye) | |
# average the eye aspect ratio together for both eyes | |
ear = (leftEAR + rightEAR)/2.0 | |
# compute the convex hull for the left and right eye, then | |
# visualize each of the eyes | |
leftEyeHull = cv2.convexHull(leftEye) | |
rightEyeHull = cv2.convexHull(rightEye) | |
cv2.drawContours(frame, [leftEyeHull], -1, rectanglecolor, 1) | |
cv2.drawContours(frame, [rightEyeHull], -1, rectanglecolor, 1) | |
# check to see if the eye aspect ratio is below the blink | |
# threshold, and if so, increment the blink frame counter | |
if ear < EYE_AR_THRESH: | |
COUNTER +=1 | |
# otherwise, the eye aspect ratio is not below the blink | |
# threshold | |
else: | |
# if the eyes were closed for a sufficient number of | |
# then increment the total number of blinks | |
if COUNTER >= EYE_AR_CONSEC_FRAMES: | |
TOTAL += 1 | |
# reset the eye frame counter | |
COUNTER = 0 | |
# draw the total number of blinks on the frame along with | |
# the computed eye aspect ratio for the frame | |
cv2.circle(frame,(670,75), 43, rectanglecolor, -1) | |
#cv2.putText(frame, "Cerrado", (520, 83), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (23,6,227), 2) | |
cv2.putText(frame,"Parpadea 3 veces para acceder: {}/3".format(TOTAL), (60, 83), | |
cv2.FONT_HERSHEY_SIMPLEX, 0.9, rectanglecolor, 2) | |
#cv2.putText(frame, "EAR: {:.2f}".format(ear), (300, 30), | |
# cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) | |
if TOTAL > 2: | |
rectanglecolor=(7,240,49) | |
cv2.circle(frame,(670,75), 43, rectanglecolor, -1) | |
#cv2.putText(frame, "Abierto", (520, 83), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (7,240,49), 2) | |
# show the frame | |
cv2.imshow("Face Recognition Verification", frame) | |
key = cv2.waitKey(1) & 0xFF | |
# if the `q` key was pressed, break from the loop | |
if key == ord("q"): | |
break | |
# do a bit of cleanup | |
cv2.destroyAllWindows() | |
vs.stop() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment