Spaces:
Sleeping
Sleeping
import streamlit as st | |
import sqlite3 | |
import cv2 | |
import datetime | |
import pandas as pd | |
from PIL import Image | |
import os | |
# Create a directory for storing photos | |
os.makedirs("photos", exist_ok=True) | |
def create_database(): | |
"""Creates the attendance database.""" | |
conn = sqlite3.connect('attendance.db') | |
c = conn.cursor() | |
c.execute('''CREATE TABLE IF NOT EXISTS attendance ( | |
id INTEGER PRIMARY KEY AUTOINCREMENT, | |
rollno TEXT, | |
name TEXT, | |
photo_path TEXT, | |
emotion TEXT, | |
timestamp TEXT | |
)''') | |
conn.commit() | |
conn.close() | |
def detect_emotion(frame): | |
"""Dummy emotion detection function.""" | |
# Placeholder for actual emotion detection logic | |
return "Happy" | |
def mark_attendance(rollno, name, frame): | |
"""Marks attendance for the user.""" | |
conn = sqlite3.connect('attendance.db') | |
c = conn.cursor() | |
timestamp = datetime.datetime.now() | |
date_str = timestamp.strftime("%Y-%m-%d") | |
time_str = timestamp.strftime("%H:%M:%S") | |
# Save the captured photo | |
photo_path = f"photos/{rollno}_{name.replace(' ', '_')}.jpg" | |
photo = Image.fromarray(frame) | |
photo.save(photo_path) | |
# Detect emotion (dummy function) | |
emotion = detect_emotion(frame) | |
# Insert record into the database | |
c.execute("INSERT INTO attendance (rollno, name, photo_path, emotion, timestamp) VALUES (?, ?, ?, ?, ?)", | |
(rollno, name, photo_path, emotion, timestamp)) | |
conn.commit() | |
conn.close() | |
def get_attendance_records(): | |
"""Fetches all attendance records.""" | |
conn = sqlite3.connect('attendance.db') | |
c = conn.cursor() | |
c.execute("SELECT rollno, name, photo_path, emotion, timestamp FROM attendance") | |
records = c.fetchall() | |
conn.close() | |
return records | |
def capture_photo(): | |
"""Captures a photo using the webcam.""" | |
cap = cv2.VideoCapture(0) | |
st.info("Click 'Capture' to take a photo.") | |
while cap.isOpened(): | |
ret, frame = cap.read() | |
if not ret: | |
st.error("Failed to capture image.") | |
break | |
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) | |
st.image(frame, channels="RGB") | |
if st.button("Capture"): | |
cap.release() | |
cv2.destroyAllWindows() | |
return frame | |
if st.button("Cancel"): | |
cap.release() | |
cv2.destroyAllWindows() | |
return None | |
# Initialize the database | |
create_database() | |
st.title("Attendance System") | |
menu = st.sidebar.selectbox("Menu", ["Click Photo", "Database"]) | |
if menu == "Click Photo": | |
st.header("Mark Attendance by Clicking Photo") | |
rollno = st.text_input("Enter your Roll Number:") | |
name = st.text_input("Enter your Name:") | |
if rollno and name: | |
frame = capture_photo() | |
if frame is not None: | |
mark_attendance(rollno, name, frame) | |
st.success(f"Attendance marked for {name} (Roll No: {rollno})") | |
st.image(frame, caption="Captured Image", channels="RGB") | |
elif menu == "Database": | |
st.header("Attendance Records") | |
records = get_attendance_records() | |
data = [] | |
for rollno, name, photo_path, emotion, timestamp in records: | |
photo = Image.open(photo_path) if os.path.exists(photo_path) else None | |
date, time = timestamp.split(" ") | |
data.append((rollno, photo, name, emotion, date, time)) | |
df = pd.DataFrame(data, columns=["Roll No", "Photo", "Name", "Emotion", "Date", "Time"]) | |
st.write("### Attendance Records") | |
for idx, row in df.iterrows(): | |
st.image(row["Photo"], caption=f"Roll No: {row['Roll No']} - Name: {row['Name']} - Emotion: {row['Emotion']}") | |
st.table(df.drop(columns=["Photo"])) # Exclude photo for table display | |