import face_recognition
import cv2

# This is a super simple (but slow) example of running face recognition on live video from your webcam.
# There's a second example that's a little more complicated but runs faster.

# PLEASE NOTE: This example requires OpenCV (the `cv2` library) to be installed only to read from your webcam.
# OpenCV is *not* required to use the face_recognition library. It's only required if you want to run this
# specific demo. If you have trouble installing it, try any of the other demos that don't require it instead.
face_list = ['shuhao.jpg',
             'cancheng.jpg',
             'yanbin.jpg',
             'xiaoqing.jpg',
             'sunzhuo.jpg',
             'cunguang.jpg',
             'fangjun.jpg',
             'gaoxiang.jpg',
             'hainan.jpg',
             'haiying.jpg',
             'hongwei.jpg',
             'jianbai.jpg',
             'jifan.jpg',
             'lichao',
             'linsong.jpg',
             'ruixue.jpg',
             'wanglang.jpg',
             'xugang.jpg',
             'xuwei.jpg',
             'yangzhe.jpg',
             'yanjie.jpg',
             'zhongxiao.jpg',
             ]
employee_name = ['Eric Wang',
                 'Charles Liu',
                 'Jackie Liu',
                 'Sherwin Zhang',
                 'Zhuo Sun',
                 'Cunguang Wang',
                 'Thomas Ding',
                 'Xiang Gao',
                 'Hainan Lu',
                 'Helen Xu',
                 'Hongwei Pang',
                 'Calvin Ku',
                 'Jifan Li',
                 'Lichao Pan',
                 'Linsong Chen',
                 'Ruixue Jiang',
                 'Lang Wang',
                 'Gang Xu',
                 'Wei Xu',
                 'Zhe Yang',
                 'Yanjie Tian',
                 'Zhongxiao Wang']

# Get a reference to webcam #0 (the default one)
video_capture = cv2.VideoCapture(0)

# Create arrays of known face encodings and their names
known_face_encodings = [
    face_recognition.face_encodings(face_recognition.load_image_file(ele))[0] for ele in face_list
]

known_face_names = employee_name

while True:
    # Grab a single frame of video
    ret, frame = video_capture.read()

    # Convert the image from BGR color (which OpenCV uses) to RGB color (which face_recognition uses)
    rgb_frame = frame[:, :, ::-1]

    # Find all the faces and face enqcodings in the frame of video
    face_locations = face_recognition.face_locations(rgb_frame)
    face_encodings = face_recognition.face_encodings(rgb_frame, face_locations)

    # Loop through each face in this frame of video
    for (top, right, bottom, left), face_encoding in zip(face_locations, face_encodings):
        # See if the face is a match for the known face(s)
        matches = face_recognition.compare_faces(known_face_encodings, face_encoding)

        name = "Unknown"

        # If a match was found in known_face_encodings, just use the first one.
        if True in matches:
            first_match_index = matches.index(True)
            name = known_face_names[first_match_index]

        # Draw a box around the face
        cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)

        # Draw a label with a name below the face
        cv2.rectangle(frame, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6), font, 1.0, (255, 255, 255), 1)

    # Display the resulting image
    cv2.imshow('Video', frame)

    # Hit 'q' on the keyboard to quit!
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# Release handle to the webcam
video_capture.release()
cv2.destroyAllWindows()
