def add_faces():
    if not os.path.exists(DATABASE_DIR):
        os.mkdir(DATABASE_DIR)
    # face_id = input('Name: ')
    face_id = sys.argv[1]
    face_dir = DATABASE_DIR + face_id
    if not os.path.exists(face_dir):
        os.mkdir(face_dir)
        camera = Camera()
        face_detector = FaceDetector(FACE_CASCADES)
        counter = 1
        timer = 0
        cv2.namedWindow('Video Feed', cv2.WINDOW_AUTOSIZE)
        cv2.namedWindow('Saved Face', cv2.WINDOW_NORMAL)
        while counter < 26:
            frame = camera.get_frame()
            # frame = camera.ip_camera(True)
            face_coordinate = face_detector.detect(frame)
            if len(face_coordinate):
                shape = 'rectangle'
                frame, face_image = get_images(frame, face_coordinate, shape)
                if timer % 100 == 20:
                    cv2.imwrite(face_dir + '/' + str(counter) + '.jpg', face_image[0])
                    print(json.dumps({
                        'imageCounter': str(counter)
                    }))
                    counter += 1
                    cv2.imshow('Saved Face', face_image[0])

            cv2.imshow('Video Feed', frame)
            cv2.waitKeyEx(50)
            timer += 20
            if cv2.waitKey(100) & 0xFF == 27:
                sys.exit()
    else:
        print(json.dumps({
            'message': 'Face ID already exist',
            'status': 'false'
        }))
Esempio n. 2
0
class Main:
    def __init__(self):
        self.tasks = []

        self.camera = Camera()
        self.window = Window('Camera')

        self.should_detect = True
        self.trackers = []

        self.color_filter = ColorFilter()

    def add_target(self, filename):
        self.trackers.append(Tracker(filename))

    def clear(self):
        for tracker in self.trackers:
            tracker.clear()

    def loop(self):
        runner = CmdRunner(self)
        runner.start()
        
        while runner.isAlive():
            while len(self.tasks) > 0:
                task = self.tasks.pop(0)
                task.execute()

            try:
                img = self.camera.get_frame()

                if img is None:
                    self.window.clear()
                    continue

                img = cv2.resize(img, (640, 480))

                # TODO: show color mask
                color_mask = self.color_filter.filter(img)

                next_should_detect = self.should_detect
                for tracker in self.trackers:
                    if self.should_detect:
                        rect = tracker.detect(img)

                        if rect is not None:
                            ret = tracker.update_window(img, rect)
                            self.window.draw_rectangle(rect, (255, 0, 255))
                        next_should_detect = False

                    rect = tracker.track(img)

                    if rect is None:
                        next_should_detect = True
                        continue

                    self.window.draw_rectangle(rect, (255, 0, 0))

                self.should_detect = next_should_detect
            except Exception as e:
                print >> sys.stderr, e
            finally:
                self.window.update()
                runner.join(0)

    def _add_task(self, task):
        self.should_detect = True
        self.tasks.append(task)

    def do_add_target(self, filename):
        self._add_task(Task(self.add_target, (filename, )))

    def do_clear(self):
        self._add_task(Task(self.clear))

    def do_snapshot(self, filename):
        self._add_task(Task(self.window.snapshot, (filename, )))

    def do_switch_camera(self, cid):
        self._add_task(Task(self.camera.switch, (cid, )))
def start_recognize():
    shape = 'rectangle'
    try:
        faces = [employee for employee in os.listdir(DATABASE_DIR)]
    except Exception as ex:
        print(
            json.dumps({
                "message":
                "Have you added at least one person to the system?" + str(ex),
                "status":
                "isEmpty"
            }))
        sys.exit()
    print(
        json.dumps(
            {"message": "This are the people in the Recognition System:"}))
    for employee in faces:
        print(json.dumps({"-": employee}))

    choice = 3

    detector = FaceDetector(FACE_CASCADES)
    if choice == 1:
        recognizer = cv2.face.EigenFaceRecognizer_create()
        threshold = 4000
    elif choice == 2:
        recognizer = cv2.face.FisherFaceRecognizer_create()
        threshold = 300
    elif choice == 3:
        recognizer = cv2.face.LBPHFaceRecognizer_create()
        # threshold = 105
        threshold = 80
    images = []
    labels = []
    state = []
    state.append(0)  # default
    labels_faces = {}
    for i, image_person in enumerate(faces):
        labels_faces[i] = image_person
        for image in os.listdir(DATABASE_DIR + image_person):
            images.append(
                cv2.imread(DATABASE_DIR + image_person + '/' + image, 0))
            labels.append(i)
    try:
        recognizer.train(images, np.array(labels))
    except:
        print(
            json.dumps({
                "message": "Do you have at least two people in the database",
                "status": "isEmpty"
            }))
        sys.exit()
    video = Camera()
    while True:
        stroke = 1
        color = (136, 150, 0)
        cv2.namedWindow('Frame', cv2.WND_PROP_FULLSCREEN)
        cv2.setWindowProperty('Frame', cv2.WND_PROP_FULLSCREEN,
                              cv2.WINDOW_FULLSCREEN)
        frame = video.get_frame()
        # frame = video.ip_camera(True)
        faces_coord = detector.detect(frame, False)
        if len(faces_coord):
            frame, faces_img = get_images(frame, faces_coord, shape)
            for i, face_img in enumerate(faces_img):
                pred, conf = recognizer.predict(face_img)
                print(
                    json.dumps({
                        'prediction': pred,
                        'Confidence': conf,
                        'Threshold': threshold,
                    }))
                if conf < threshold:
                    # Fetch data from face_entity the data from database
                    # to filter the first_name using uid
                    data = face_entity.get_face_profile(
                        labels_faces[pred].capitalize())
                    print(json.dumps({'code': str(data)}))

                    cv2.putText(frame,
                                data['firstname'] + ' | ' + str(round(conf)),
                                (faces_coord[i][0], faces_coord[i][1] - 2),
                                cv2.FONT_HERSHEY_PLAIN, 1.7, color, stroke,
                                cv2.LINE_AA)
                    # Push Available state
                    if state[0] == 0:
                        state.append(labels_faces[pred].capitalize())
                    if state[0] != str(labels_faces[pred].capitalize()):
                        if sys.argv[1] == "1":
                            face_post_module.login_employee_by_id(
                                data['employee_id'])
                            print(
                                json.dumps({
                                    'status': 'IN',
                                    'id': str(data['employee_id'])
                                }))
                        elif sys.argv[1] == "0":
                            face_post_module.logout_employee_by_id(
                                data['employee_id'])
                            print(
                                json.dumps({
                                    'status': 'OUT',
                                    'id': str(data['employee_id'])
                                }))

                        # Pop available state if they are not the same
                        state.pop(0)

                else:
                    cv2.putText(frame, "Unknown",
                                (faces_coord[i][0], faces_coord[i][1]),
                                cv2.FONT_HERSHEY_PLAIN, 1.7, color, stroke,
                                cv2.LINE_AA)

        print(json.dumps({"test": sys.argv[1]}))

        if sys.argv[1] == "1":
            if state[0] != 0:
                data = face_entity.get_face_profile(12345678)
                cv2.putText(
                    frame,
                    str(data['firstname'] + ' ' + data['lastname']).upper(),
                    (110, frame.shape[0] - 10), cv2.FONT_HERSHEY_PLAIN, 3,
                    color, 3, cv2.LINE_AA)
        else:
            if state[0] != 0:
                data = face_entity.get_face_profile(12345678)
                cv2.putText(
                    frame,
                    str(data['firstname'] + ' ' + data['lastname']).upper(),
                    (110, frame.shape[0] - 10), cv2.FONT_HERSHEY_PLAIN, 3,
                    color, 3, cv2.LINE_AA)
        cv2.imshow('Frame', frame)

        if cv2.waitKey(100) & 0xFF == 27:
            sys.exit()
Esempio n. 4
0
class Main:
    def __init__(self):
        self.tasks = []

        self.camera = Camera()
        self.window = Window('Camera')

        self.should_detect = True
        self.trackers = []

        self.color_filter = ColorFilter()

    def add_target(self, filename):
        self.trackers.append(Tracker(filename))

    def clear(self):
        for tracker in self.trackers:
            tracker.clear()

    def loop(self):
        runner = CmdRunner(self)
        runner.start()

        while runner.isAlive():
            while len(self.tasks) > 0:
                task = self.tasks.pop(0)
                task.execute()

            try:
                img = self.camera.get_frame()

                if img is None:
                    self.window.clear()
                    continue

                img = cv2.resize(img, (640, 480))

                # TODO: show color mask
                color_mask = self.color_filter.filter(img)

                next_should_detect = self.should_detect
                for tracker in self.trackers:
                    if self.should_detect:
                        rect = tracker.detect(img)

                        if rect is not None:
                            ret = tracker.update_window(img, rect)
                            self.window.draw_rectangle(rect, (255, 0, 255))
                        next_should_detect = False

                    rect = tracker.track(img)

                    if rect is None:
                        next_should_detect = True
                        continue

                    self.window.draw_rectangle(rect, (255, 0, 0))

                self.should_detect = next_should_detect
            except Exception as e:
                print >> sys.stderr, e
            finally:
                self.window.update()
                runner.join(0)

    def _add_task(self, task):
        self.should_detect = True
        self.tasks.append(task)

    def do_add_target(self, filename):
        self._add_task(Task(self.add_target, (filename, )))

    def do_clear(self):
        self._add_task(Task(self.clear))

    def do_snapshot(self, filename):
        self._add_task(Task(self.window.snapshot, (filename, )))

    def do_switch_camera(self, cid):
        self._add_task(Task(self.camera.switch, (cid, )))