예제 #1
0
 def __init__(self):
     # Using OpenCV to capture from device 0. If you have trouble capturing
     # from a webcam, comment the line below out and use a video file
     # instead.
     self.video = cv2.VideoCapture(0)
     # If you decide to use video.mp4, you must have this file in the folder
     # as the main.py.
     # self.video = cv2.VideoCapture('video.mp4')
     self.userManager = UserManager()
     self.last_frame = None
     self._classificador = cv2.CascadeClassifier('frontalface.xml')
     self._altura = 220
     self._largura = 220
     self._font = cv2.FONT_HERSHEY_COMPLEX_SMALL
     self._lbphClassifier = cv2.face.LBPHFaceRecognizer_create()
     self._lbphClassifier.read(
         '../FaceRecognizer/Dependencies/classifierLbph.yml')
예제 #2
0
    def __init__(self):
        """Instanciar o objeto do tipo CameraRecognizer.

        Ao fazer isso, preenchem-se os seguintes campos:
        self._userManager = Controle do usuário – FaceRecognizer.Services.UserManager;
        self._height = Altura – valor numérico;
        self._width = Largura – valor numérico;
        self._font = tipo de fonte usado no preenchimento do nome e do identificador do usuário reconhecido;
        self._lbphClassifier = classificador de face que utiliza o algoritmo de reconhecimento facial LBPH. Só será preenchido se o arquivo .yml existir.
        """

        self.userManager=UserManager()
        self._classifier= cv2.CascadeClassifier('FaceRecognizer/Dependencies/frontalface.xml')
        self._height = 220
        self._width = 220
        self._font = cv2.FONT_HERSHEY_COMPLEX_SMALL
        self._lbphClassifier = cv2.face.LBPHFaceRecognizer_create()
        try:
            self._lbphClassifier.read('FaceRecognizer/Dependencies/classifierLbph.yml')
        except:
            print('No YML')
            self._lbphClassifier=None
예제 #3
0
from flask import jsonify, request, json
from app.user import app_user
from app.recognition.resource import Recognition_Resource
from app.user.resource import User_Resource
from FaceRecognizer.Services.UserManager import UserManager
from FaceRecognizer.Services.FileManager import FileManager
import cv2
import base64

userManager = UserManager()
fileManager = FileManager()
image_faces = []
userResource = User_Resource()


@app_user.route('/add_image', methods=['POST'])
def add_image():
    image_faces.append(Recognition_Resource.last_frame)
    ret, jsonImage = cv2.imencode('.jpg', Recognition_Resource.last_frame)
    jpg_as_text = base64.b64encode(jsonImage.tobytes())
    jpg_as_text = jpg_as_text.decode('ascii')
    return jsonify({
        'message': 'Success',
        'image_face': json.dumps(jpg_as_text)
    })


@app_user.route('/clear_image_faces')
def clear_image_faces():
    image_faces.clear()
    return jsonify({'message': 'Success'})
예제 #4
0
class VideoCamera(object):
    def __init__(self):
        # Using OpenCV to capture from device 0. If you have trouble capturing
        # from a webcam, comment the line below out and use a video file
        # instead.
        self.video = cv2.VideoCapture(0)
        # If you decide to use video.mp4, you must have this file in the folder
        # as the main.py.
        # self.video = cv2.VideoCapture('video.mp4')
        self.userManager = UserManager()
        self.last_frame = None
        self._classificador = cv2.CascadeClassifier('frontalface.xml')
        self._altura = 220
        self._largura = 220
        self._font = cv2.FONT_HERSHEY_COMPLEX_SMALL
        self._lbphClassifier = cv2.face.LBPHFaceRecognizer_create()
        self._lbphClassifier.read(
            '../FaceRecognizer/Dependencies/classifierLbph.yml')

    def __del__(self):
        self.video.release()

    # def get_frame(self):
    #
    #     imagem, frame = self.video.read()
    #
    #     imagem_cinza = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    #
    #     faces_classificadas = self._classificador.detectMultiScale(imagem_cinza)
    #
    #     for x, y, l, a in faces_classificadas:
    #         cv2.rectangle(frame, (x, y), (x + l, y + a), (0, 0, 255), 2)
    #         self.last_frame = imagem_cinza[y:(y + a), x:(x + l)]
    #     ret, jpeg = cv2.imencode('.jpg', frame)
    #
    #     return jpeg.tobytes()

    def recognition(self):

        imagem, frame = self.video.read()

        imagem_cinza = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        faces_classificadas = self._classificador.detectMultiScale(
            imagem_cinza)

        for x, y, l, a in faces_classificadas:
            imagem_face = cv2.resize(imagem_cinza[y:(y + a), x:(x + l)],
                                     (self._largura, self._altura))

            cv2.rectangle(frame, (x, y), (x + l, y + a), (0, 0, 255), 2)

            id, confianca = self._lbphClassifier.predict(imagem_face)

            if (id > 0):
                user = self.userManager.get_user_by_id(id)
                cv2.rectangle(frame, (x, y), (x + l, y + a), (0, 255, 0), 2)
                cv2.putText(frame, str(id), (x, y + (a + 30)), self._font, 2,
                            (0, 255, 0))
                cv2.putText(frame, user.get_name(), (x, y + (a + 50)),
                            self._font, 2, (0, 255, 0))

        ret, jpeg = cv2.imencode('.jpg', frame)

        return jpeg.tobytes()
예제 #5
0
class CameraRecognizer(object):
    def __init__(self):
        """Instanciar o objeto do tipo CameraRecognizer.

        Ao fazer isso, preenchem-se os seguintes campos:
        self._userManager = Controle do usuário – FaceRecognizer.Services.UserManager;
        self._height = Altura – valor numérico;
        self._width = Largura – valor numérico;
        self._font = tipo de fonte usado no preenchimento do nome e do identificador do usuário reconhecido;
        self._lbphClassifier = classificador de face que utiliza o algoritmo de reconhecimento facial LBPH. Só será preenchido se o arquivo .yml existir.
        """

        self.userManager=UserManager()
        self._classifier= cv2.CascadeClassifier('FaceRecognizer/Dependencies/frontalface.xml')
        self._height = 220
        self._width = 220
        self._font = cv2.FONT_HERSHEY_COMPLEX_SMALL
        self._lbphClassifier = cv2.face.LBPHFaceRecognizer_create()
        try:
            self._lbphClassifier.read('FaceRecognizer/Dependencies/classifierLbph.yml')
        except:
            print('No YML')
            self._lbphClassifier=None

    def recognition(self, cameraService, scaleFactor=1.1, minNeighbors=9, minSize=(140, 140)):

        """Identificar os usuários através de sua face.

        Parâmetros = cameraService: instância responsável por configurar a câmera empregada – FaceRecognizer.Services.CameraService;
                     scaleFactor: valor equivalente ao raio ao redor do pixel central – Float – Default: 1.1;
                     minNeighbors: quantidade mínima de vizinhos a serem verificados – Inteiro – Default: 9;
                     minSize: valores referentes aos números de célucas na horizontal e vertical, respectivamente – Default: (140, 140).

        Retorno = imagem reconhecida pelo OpenCv convertida em bytes, caso haja sucesso na excução do método. Se houver erro, nada será retornado."""

        try:

            cameraService.read()

            faces_classificadas = self._classifier.detectMultiScale(cameraService.gray_image, scaleFactor=scaleFactor, minNeighbors=minNeighbors, minSize=minSize)

            for x, y, l, a in faces_classificadas:
                imagem_face = cv2.resize(cameraService.gray_image[y:(y + a), x:(x + l)], (self._width, self._height))

                cv2.rectangle(cameraService.frame, (x, y), (x + l, y + a), (0, 0, 255), 2)

                id, confianca = self._lbphClassifier.predict(imagem_face)

                if (id > 0):
                    user = self.userManager.get_user_by_id(id)
                    cv2.rectangle(cameraService.frame, (x, y), (x + l, y + a), (0, 255, 0), 2)
                    cv2.putText(cameraService.frame, str(id), (x, y + (a + 30)), self._font, 2, (0, 255, 0))
                    cv2.putText(cameraService.frame, user.get_name(), (x, y + (a + 50)), self._font, 2, (0, 255, 0))

            ret, jpeg = cv2.imencode('.jpg', cameraService.frame)

            return jpeg.tobytes()
        except:
            cameraService.stop_cam()
            print('Erro ao carregar o reconhecimento facial')
            return


    def get_lbph_classifier(self):

        """retorna o classificador lbph"""

        return self._lbphClassifier
예제 #6
0
class VideoRecognizer(object):
    """Variáveis=
    _lbphClassifier: classificador do algoritmo LBPH responsável por reconhecer faces atravésdo arquivo YML salvo como: Depencencies/classifierLbph.yml – Default: None;
    _ids: lista com os identificadores dos usuários reconhecidos – Inteiro;
    _threshold_limit: Valor que garante a credibilidade do reconhecimento facial. Se a face for superior ao número dessa variável, o reconhecimento não será validado – Inteiro – Default: 110;
    _id_final: Identificador mais confiável ao término do processo de reconhecimento facial – Inteiro – Default: 0;
    _userManager: Controle do usuário – FaceRecognizer.Services.UserManager."""

    _lbphClassifier = None
    _ids = None
    _threshold_limit = 110
    _id_final = 0
    _userManager = UserManager()

    def __init__(self, threshold=110):
        """Instancia o objeto do tipo VideoRecognizer.

        Parâmetro= threshold: valor passado para ser comparado com o _threshold_limit – Inteiro – Default: 110.

        Ao fazer isso, preenchem-se os campos:

        _lbphClassifier: configura a variável para trabalhar com o algoritmo de reconhecimento facial LPBH;
        _set_threshold_limit: configura o valor do _threshold_limit;
        """

        try:
            self._lbphClassifier = cv2.face.LBPHFaceRecognizer_create()
            self._set_threshold_limit(threshold)
        except:
            print('error value')

    def recognizer(self, video, max_faces=50, min_faces=5, duration=None):
        """Método empregado para reconhecer as faces detectadas no vídeo.

        Parâmetros= video: endereço do arquivo de vídeo;
                    max_faces: quantidade máxima de faces reconhecidas – Inteiro – Default: 50;
                    min_faces: quantidade mínima de faces reconhecidas – Inteiro – Default: 5;
                    duration: duração do vídeo – Float – Default: None.


        Retorno= Caso haja algum erro no processo de reconhecimento facial ou no de detecção de faces, o método apenas terá a sua execução interrompida;
                 Caso o reconhecimento facial seja executado com sucesso, o método look_for_user será acionado."""

        try:
            self._faceDetection = FaceDetector(max_faces, min_faces, duration)
            image_faces = self._faceDetection.detect_video(video)
            if (image_faces == False):
                return
            return self.look_for_user(image_faces)
        except:
            print('Error to recognize user')
            return

    def look_for_user(self, image_faces):
        """Método responsável por identificar o usuário presente nas faces – image_faces.

        Parâmetro= image_faces: lista com as faces detectadas.

        Retorno= Em caso de existência do arquivo classifierLbpt.yml e do consequente reconhecimento do usuário, o retorno será o identificador da pessoa classificada;
                Caso não haja o arquivo classifierLbpt.yml, será exibia a mensagem 'Yml not found' e a execução do método será interrompida;
                Se houver o arquivo classifierLbpt.yml, mas o usuário não for reconhecido, o retorno será None."""
        try:
            self._lbphClassifier.read(
                'FaceRecognizer/Dependencies/classifierLbph.yml')
            self._identify_user(image_faces)
            return self._id_final
        except:
            print('Yml not found')
            return

    def _identify_user(self, image_faces):
        """Realiza a identificação do usuário.

        Parâmetro= image_faces: lista com as faces detectadas."""

        self._process_face(image_faces)
        self._get_id_final()

    def _get_id_final(self):
        """Retorna o identificador pertencente ao usuário identificado com maior credibilidade.

        Retorno= Em caso de não identificação do usuário, o retorno será None.
                 Caso haja o usuário seja reconhecido, será retornado o valor do identificador."""

        if (self._id_final > 0):
            print(self._id_final)
            return self._id_final
        print('user not found')
        self._id_final = None

    def _process_face(self, image_faces):
        """Verifica se as faces passadas por parâmetro estão registradas no sistema.

        Parâmetro= image_faces: lista com as faces detectadas."""

        for face in image_faces:
            id, confianca = self._lbphClassifier.predict(face)
            print(confianca)
            self._validate_min_confianca_and_id_final(id, confianca)

    def _validate_min_confianca_and_id_final(self, id, confidence):
        """Verifica se o usuário foi identificado e preenche os valores de _threshold_limit e _id_final.

        Parâmetros= id: identificador do usuário reconhecido – Inteiro;
                    confidence: valor que garante a credibilidade do reconhecimento."""

        if (id > 0):
            if (self._threshold_limit > confidence):
                self._set_threshold_limit(confidence)
                self._set_id_final(id)
                print(id)

    def _set_id_final(self, id):
        """Preenche o valor de _id_final.

        Parâmetro= id: identificador do usuário reconhecido – Inteiro."""

        if id and isinstance(id, int):
            self._id_final = id

    def _set_threshold_limit(self, threshold):
        """Preenche o valor de _threshold_limit.

        Parâmetro= threshold: valor que garante a credibilidade do reconhecimento."""

        if id and isinstance(id, float):
            self._threshold_limit = threshold