File size: 2,706 Bytes
49f1168
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import cv2 as cv
import numpy as np
import time
import pygame
import streamlit as st

classes = ['Closed', 'Open']  # Class labels for eyes only

# Load face and eye cascade classifiers
face_cascade = cv.CascadeClassifier("haarcascade files/haarcascade_frontalface_default.xml")
eye_cascade = cv.CascadeClassifier("haarcascade files/haarcascade_eye.xml")

# Initialize alarm
pygame.mixer.init()
pygame.mixer.music.load("alarm.wav")

# Track eye closure duration
closed_start_time = None
alarm_triggered = False

# Prepare the frame for eye detection
def prepare_frame(frame):
    global closed_start_time, alarm_triggered
    gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  # Convert to grayscale for better detection
    faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5)
    eye_status = 'Closed'
    
    for (x, y, w, h) in faces:
        face_roi = frame[y:y+h, x:x+w]
        roi_gray = gray_frame[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray, scaleFactor=1.1, minNeighbors=5)
        
        # If two or more eyes detected, classify as 'Open'
        if len(eyes) >= 2:
            eye_status = 'Open'
            if alarm_triggered:
                pygame.mixer.music.stop()
                alarm_triggered = False
            closed_start_time = None
        else:
            if closed_start_time is None:
                closed_start_time = time.time()
            elif time.time() - closed_start_time >= 3:
                if not alarm_triggered:
                    pygame.mixer.music.play()
                    alarm_triggered = True
        
        # Draw a rectangle around the entire face
        cv.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        break  # Stop after detecting the first face to avoid multiple rectangles

    cv.putText(frame, eye_status, (20, 50), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    return frame, eye_status

# Streamlit interface
st.title("Real-time Eye Detection and Drowsiness Alert")
st.markdown("**Close your eyes for 3 seconds to trigger the alarm.**")

FRAME_WINDOW = st.image([])
run = st.button("Start Detection")
stop = st.button("Stop Detection")

cap = cv.VideoCapture(0)

while run:
    ret, frame = cap.read()
    if not ret:
        st.warning("Failed to access webcam.")
        break

    frame = cv.flip(frame, 1)  # Flip frame horizontally
    frame, eye_status = prepare_frame(frame)
    frame = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
    FRAME_WINDOW.image(frame)

    if stop:
        cap.release()
        cv.destroyAllWindows()
        break

cap.release()
cv.destroyAllWindows()