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' }))
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()