-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMain1.py
103 lines (89 loc) · 4.02 KB
/
Main1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import cv2
import dlib
from scipy.spatial import distance
import pygame
import subprocess
cap = cv2.VideoCapture(0)
ret, frame = cap.read()
height,width = frame.shape[:2]
font = cv2.FONT_HERSHEY_COMPLEX_SMALL
Score = 0
cv2.rectangle(frame, (0,height-50) ,(200,height) , (0,0,0) , thickness=cv2.FILLED )
# INITIALIZING THE MIXER SO THAT ALERT AUDIO MESSAGE CAN BE DELIVERED
pygame.mixer.init()
pygame.mixer.music.load("alarm.wav")
# GET THE EYES DETECTED
face_detector = dlib.get_frontal_face_detector()
# PUT THE LOCATION OF .DAT FILE (FILE FOR PREDECTING THE LANDMARKS ON FACE )
dlib_facelandmark = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
# FUNCTION CALCULATING THE ASPECT RATIO FOR THE Eye BY USING EUCLIDEAN DISTANCE FUNCTION
def Detect_Eye(eye):
poi_A = distance.euclidean(eye[1], eye[5])
poi_B = distance.euclidean(eye[2], eye[4])
poi_C = distance.euclidean(eye[0], eye[3])
aspect_ratio_Eye = (poi_A+poi_B)/(2*poi_C)
return aspect_ratio_Eye
# MAIN LOOP IT WILL RUN ALL THE UNLESS AND UNTIL THE PROGRAM IS BEING KILLED BY THE USER
while True:
null, frame = cap.read()
gray_scale = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_detector(gray_scale)
for face in faces:
face_landmarks = dlib_facelandmark(gray_scale, face)
leftEye = []
rightEye = []
# THESE ARE THE POINTS ALLOCATION FOR THE LEFT EYES IN .DAT FILE THAT ARE FROM 42 TO 47
for n in range(42, 48):
x = face_landmarks.part(n).x
y = face_landmarks.part(n).y
rightEye.append((x, y))
next_point = n+1
if n == 47:
next_point = 42
x2 = face_landmarks.part(next_point).x
y2 = face_landmarks.part(next_point).y
cv2.line(frame, (x, y), (x2, y2), (0, 255, 0), 1)
# THESE ARE THE POINTS ALLOCATION FOR THE RIGHT EYES IN .DAT FILE THAT ARE FROM 36 TO 41
for n in range(36, 42):
x = face_landmarks.part(n).x
y = face_landmarks.part(n).y
leftEye.append((x, y))
next_point = n+1
if n == 41:
next_point = 36
x2 = face_landmarks.part(next_point).x
y2 = face_landmarks.part(next_point).y
cv2.line(frame, (x, y), (x2, y2), (255, 255, 0), 1)
# CALCULATING THE ASPECT RATIO FOR LEFT AND RIGHT EYE
right_Eye = Detect_Eye(rightEye) ;
left_Eye = Detect_Eye(leftEye)
Eye_Rat = (left_Eye+right_Eye)/2
# NOW ROUND OF THE VALUE OF AVERAGE MEAN OF RIGHT AND LEFT EYES
Eye_Rat2 = round(Eye_Rat,2)
# THIS VALUE OF 0.25 (YOU CAN EVEN CHANGE IT) WILL DECIDE WHETHER THE PERSONS'S EYES ARE CLOSE OR NOT
if Eye_Rat2 < 0.25:
Score+=1
else :
Score=0
# CALLING THE AUDIO FUNCTION FOR ALERTING THE PERSON
if Score > 15:
if(Score % 100 == 0) & (Score > 50):
subprocess.call(['python','Main.py'], bufsize=0)
cv2.rectangle(frame, (0,0), (450, 60), (21, 56, 210), -1)
cv2.putText(frame, "DROWSINESS DETECTED | ALERT! WAKE UP", (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
cv2.putText(frame,'Score:'+str(Score),(10,height-40), cv2.FONT_HERSHEY_COMPLEX, 1.5,(21, 56, 212),1,cv2.LINE_AA)
cv2.putText(frame,'Press X to stop', (500,height-450), cv2.FONT_HERSHEY_COMPLEX, 0.5,(255,0,0),1,cv2.LINE_AA)
if pygame.mixer.music.get_busy() == False:
pygame.mixer.music.play()
else:
True
else:
score=0
cv2.putText(frame,'Score:'+str(Score),(10,height-40), cv2.FONT_HERSHEY_COMPLEX, 1.5,(255,255,255),1,cv2.LINE_AA)
cv2.putText(frame,'Press X to stop', (500,height-450), cv2.FONT_HERSHEY_COMPLEX, 0.5,(255,0,0),1,cv2.LINE_AA)
pygame.mixer.music.stop()
cv2.imshow("Drowsiness DETECTOR IN OPENCV2", frame)
if cv2.waitKey(9) & 0xFF == ord('x'):
break
cap.release()
cv2.destroyAllWindows()