File size: 2,650 Bytes
5f5fb95
32780dd
 
e0bb112
 
5f5fb95
610503e
 
 
 
c242c73
610503e
 
 
 
 
 
 
 
4cb6fe1
610503e
c242c73
610503e
 
c242c73
610503e
c242c73
 
 
 
 
 
 
 
610503e
 
c242c73
 
 
610503e
c242c73
 
 
5b98964
610503e
 
 
c242c73
610503e
c242c73
610503e
32780dd
610503e
 
 
32780dd
610503e
 
4cb6fe1
1c4942b
 
4cb6fe1
1c4942b
 
 
 
 
 
 
 
4cb6fe1
1c4942b
 
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
import streamlit as st
import face_recognition
import cv2
import numpy as np
import os

def load_images(directory):
    images = []
    classnames = []
    file_list = os.listdir(directory)

    st.write("Photographs found in folder : ")
    for file in file_list:
        if os.path.splitext(file)[1] in [".jpg", ".jpeg"]:
            img_path = os.path.join(directory, file)
            cur_img = cv2.imread(img_path)
            images.append(cur_img)
            st.write(os.path.splitext(file)[0])
            classnames.append(os.path.splitext(file)[0])

    return images, classnames

def recognize_faces(test_image, known_encodings, class_names):
    imgS = cv2.resize(test_image, (0, 0), None, 0.25, 0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
    facesCurFrame = face_recognition.face_locations(imgS)
    encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

    name = "Unknown"  # Default name for unknown faces
    match_found = False  # Flag to track if a match is found

    # Checking if faces are detected
    if len(encodesCurFrame) > 0:
        for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):
            matches = face_recognition.compare_faces(known_encodings, encodeFace)
            faceDis = face_recognition.face_distance(known_encodings, encodeFace)
            matchIndex = np.argmin(faceDis)

            if matches[matchIndex]:
                name = class_names[matchIndex].upper()
                match_found = True  # Set the flag to True
                
            y1, x2, y2, x1 = faceLoc
            y1, x2, y2, x1 = (y1 * 4), (x2 * 4), (y2 * 4) ,(x1 * 4)
            cv2.rectangle(test_image, (x1, y1), (x2, y2), (0, 255, 0), 2)
            cv2.rectangle(test_image, (x1, y2 - 35), (x2, y2), (0, 255, 0), cv2.FILLED)
            cv2.putText(test_image, name, (x1 + 6, y2 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            
    return test_image

st.title("AIMLJan24 - Face Recognition")

# Load images for face recognition
directory = "photos"
Images, classnames = load_images(directory)

# Load images for face recognition
encodeListknown = [face_recognition.face_encodings(img)[0] for img in Images]

# Camera input to take photo of user in question
capture = cv2.VideoCapture(0)

if capture.isOpened():
    ret, frame = capture.read()
    if ret:
        # Recognize faces in the captured frame
        image_with_recognition = recognize_faces(frame, encodeListknown, classnames)
        st.image(image_with_recognition, channels="BGR", use_column_width=True)
else:
    st.error("Failed to open camera.")

capture.release()
cv2.destroyAllWindows()