forked from ageitgey/face_recognition
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
ee6c7eb
commit 267571c
Showing
1 changed file
with
103 additions
and
0 deletions.
There are no files selected for viewing
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
#!/usr/bin/env python3 | ||
|
||
|
||
# This is a demo of detecting eye status from the users camera. If the users eyes are closed for EYES_CLOSED seconds, the system will start printing out "EYES CLOSED" | ||
# to the terminal until the user presses and holds the spacebar to acknowledge | ||
|
||
# this demo must be run with sudo privileges for the keyboard module to work | ||
|
||
# PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam. | ||
# OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this | ||
# specific demo. If you have trouble installing it, try any of the other demos that don't require it instead. | ||
|
||
# imports | ||
import face_recognition | ||
import cv2 | ||
import time | ||
from scipy.spatial import distance as dist | ||
import keyboard as kb | ||
|
||
EYES_CLOSED_SECONDS = 5 | ||
|
||
def main(): | ||
closed_count = 0 | ||
video_capture = cv2.VideoCapture(0) | ||
|
||
ret, frame = video_capture.read(0) | ||
# cv2.VideoCapture.release() | ||
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) | ||
rgb_small_frame = small_frame[:, :, ::-1] | ||
|
||
face_landmarks_list = face_recognition.face_landmarks(rgb_small_frame) | ||
process = True | ||
|
||
while True: | ||
ret, frame = video_capture.read(0) | ||
|
||
# get it into the correct format | ||
small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25) | ||
rgb_small_frame = small_frame[:, :, ::-1] | ||
|
||
|
||
|
||
# get the correct face landmarks | ||
|
||
if process: | ||
face_landmarks_list = face_recognition.face_landmarks(rgb_small_frame) | ||
|
||
# get eyes | ||
for face_landmark in face_landmarks_list: | ||
left_eye = face_landmark['left_eye'] | ||
right_eye = face_landmark['right_eye'] | ||
|
||
|
||
color = (255,0,0) | ||
thickness = 2 | ||
|
||
cv2.rectangle(small_frame, left_eye[0], right_eye[-1], color, thickness) | ||
|
||
cv2.imshow('Video', small_frame) | ||
cv2.waitKey(1) | ||
|
||
ear_left = get_ear(left_eye) | ||
ear_right = get_ear(right_eye) | ||
|
||
closed = ear_left < 0.2 and ear_right < 0.2 | ||
|
||
if (closed): | ||
closed_count += 1 | ||
|
||
else: | ||
closed_count = 0 | ||
|
||
if (closed_count >= EYES_CLOSED_SECONDS): | ||
asleep = True | ||
while (asleep): #continue this loop until they wake up and acknowledge music | ||
print("EYES CLOSED") | ||
|
||
if (kb.is_pressed('space')): | ||
asleep = False | ||
closed_count = 0 | ||
|
||
process = not process | ||
|
||
def get_ear(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 | ||
|
||
if __name__ == "__main__": | ||
main() | ||
|