File size: 3,436 Bytes
36103fb
 
 
010ee15
36103fb
 
010ee15
36103fb
 
 
010ee15
36103fb
 
 
 
 
 
 
 
010ee15
 
 
 
 
 
 
 
 
 
36103fb
010ee15
36103fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
010ee15
 
36103fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
010ee15
36103fb
 
 
 
010ee15
 
 
36103fb
010ee15
 
 
 
36103fb
010ee15
36103fb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
104
105
106
107
108
109
110
111
112
import streamlit as st
import numpy as np
import cv2 as cv
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.image import img_to_array
import pygame
import os 
import time

# Load the pre-trained CNN model for drowsiness detection
#model = load_model('drowsiness.h5')

# Define labels
labels = ['Closed', 'Open']

# Load face and eye cascade classifiers
face_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_frontalface_default.xml")
eye_cascade = cv.CascadeClassifier(cv.data.haarcascades + "haarcascade_eye.xml")

# Function to initialize audio

def initialize_audio():
    try:
        if not os.environ.get("DISPLAY"):
            raise RuntimeError("No display found. Skipping audio initialization.")
        pygame.mixer.init()
        pygame.mixer.music.load("alarm.wav")
    except Exception as e:
        print(f"Audio initialization failed: {e}")

initialize_audio()

# Initialize webcam
cam = cv.VideoCapture(0)
FRAME_WINDOW = st.image([])
run = st.button("Start")
stop = st.button("Stop")

# Function to preprocess the frame for model input
def preprocess_frame(frame):
    frame = cv.resize(frame, (24, 24))  # Resize to match model input shape
    frame = frame.astype("float") / 255.0  # Normalize
    frame = img_to_array(frame)
    frame = np.expand_dims(frame, axis=0)
    return frame

running = False
closed_start_time = None
alarm_triggered = False

if run:
    running = True

while running:
    ret, frame = cam.read()
    if not ret:
        st.warning("Failed to access webcam.")
        break
    
    frame = cv.flip(frame, 1)
    gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)  # Convert to grayscale
    
    # Detect faces
    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)
        
        # Draw rectangle around face
        cv.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        
        # Draw ellipses around detected eyes
        if len(eyes) > 0:
            eye_status = 'Open'
            for (ex, ey, ew, eh) in eyes:
                center = (x + ex + ew // 2, y + ey + eh // 2)
                axes = (ew // 2, eh // 2)
                cv.ellipse(frame, center, axes, 0, 0, 360, (0, 255, 0), 2)
            closed_start_time = None
            if alarm_triggered:
                pygame.mixer.music.stop()
                alarm_triggered = False
        else:
            if closed_start_time is None:
                closed_start_time = time.time()
            elif time.time() - closed_start_time >= 3:
                if not alarm_triggered:
                    try:
                        pygame.mixer.music.play()
                    except Exception as e:
                        print("Alarm triggered, but no audio device found.")
                    alarm_triggered = True

    # Display eye status text
    cv.putText(frame, f'Eyes: {eye_status}', (30, 30), cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
    
    frame = cv.cvtColor(frame, cv.COLOR_BGR2RGB)
    FRAME_WINDOW.image(frame)

    # Stop condition
    if stop:
        running = False
        cam.release()
        cv.destroyAllWindows()
        break

cam.release()
cv.destroyAllWindows()