예제 #1
0
 def __init__(self):
     self.resolucion = (320, 240)
     self.frames = 10
     self.prob_min = 0.5  # probabilidad minima de deteccion
     self.log = self.__log_default
     self.cv = cv2
     self.vs = Webcam()  # webcam
     self.net = ''  # red neuronal
     self.frame = ''  # imagen capturada
     self.frameshow = None  # imagen a mostrar
     self.ancho = 0
     self.alto = 0
     self.th_detect = ThreadAdmin()
     self.th_show = ThreadAdmin()
     self.activo = False  # Estado de ejecucion
     #
     self.show = False  # Para visualizar o no (Tests)
     self.func_detect = ''  # llama la funcion con deteccion
     self.func_cuadro = ''  # retorna coordenadas de cuadro rostro
     self.func_vista = ''  # retorna punto de vista de rostro
     self.func_cent_vis = ''  # funcion q retorna valores para centrar la vista
     self.func_unica = ''  # funcion q retorna valor unico de angulo de centrado de vista (tomando rangos de min y max)
     #
     self.ang_x = 0  # ultimo angulo
     self.ang_y = 0  # ultimo angulo
     self.min_x = 4  # valor diferencia minimo para funcion unica
     self.min_y = 4  # valor diferencia minimo para funcion unica
     self.x = 0
     self.y = 0
     self.elementos = []
예제 #2
0
 def __init__(self):
     self.camara     = Webcam()
     self.tcp        = Comunicacion()
     self.host       = "127.0.0.1"
     self.reintentos = 10            # cantidad de reintentos de conexion de la camara
     self.th_cam     = ThreadAdmin() # Thread para la camara
     self.tiempo     = Timer()       # Control de fps
     self.log = self.__log_default   # Para configurar log
예제 #3
0
class Image_Send(object):
    def __init__(self):
        self.camara     = Webcam()
        self.tcp        = Comunicacion()
        self.host       = "127.0.0.1"
        self.reintentos = 10            # cantidad de reintentos de conexion de la camara
        self.th_cam     = ThreadAdmin() # Thread para la camara
        self.tiempo     = Timer()       # Control de fps
        self.log = self.__log_default   # Para configurar log

    def config(self, host, port):
        self.host = host
        self.camara.config(Ancho=200, Alto=150)
        self.tcp.config(host, puerto=port, cliente=False, binario=True, callback=self.__call_conexion)

    def config_log(self, Log):
        '''posibilidad de configurar clase Log(Texto, Modulo)'''
        self.log = Log.log
        self.camara.config_log(Log)          # enviamos el log configurado a la camara tambien

    def iniciar(self):
        self.camara.start()
        if self.camara.activo:  # CONEXION EXITOSA
            self.log("CAMARA CONECTADA","IMAGE-SEND")
            self.tcp.iniciar()
        else:
            self.log("CAMARA SIN CONEXION", "IMAGE-SEND")

    # Recepcion de datos de la conexion
    def __call_conexion(self, codigo, mensaje):
        if codigo == 2:    # Conexion
            self.th_cam.start(self.__th_camara, '', 'CAMARA ENVIO', callback=self.__log_th, enviar_ejecucion=True)
        elif codigo == 4:  # Recepcion de datos
            self.log("RECEPCION INCORRECTA - COD: " + str(codigo) + " Men: " + str(mensaje), "IMAGE-SEND")

        elif codigo != 3:  # 3 es envio de datos
            self.log("COD: " + str(codigo) + " Men: " + str(mensaje), "IMAGE-SEND")


    def __th_camara(self, run):
        self.tiempo.iniciar()
        while self.tcp.conexion and run.value:
            frame = self.camara.read()  # Lectura de cuadro de camara
            self.tcp.enviar(frame)      # Enviar cuadro
            # print(self.tiempo.fps())    # ver los fps que enviamos (solo envia 5 cuadros la raspberry)
            self.tiempo.delay(6)

    # Log por defecto
    def __log_default(self, Texto, Modulo):
        print(Texto)

    # Log que devuelve el thread
    def __log_th(self, Codigo, Mensaje):
        self.log(Mensaje, "IMAGE-SEND")
예제 #4
0
 def __init__(self, C_Form):
     super().__init__(C_Form)                # instanciamos la clase padre
     # superficie interna - fondo y 4 capas
     self.superficie_fondo = ''  # type: pygame.Surface
     self.superficie_capa1 = ''  # type: pygame.Surface
     self.superficie_capa2 = ''  # type: pygame.Surface
     self.superficie_capa3 = ''  # type: pygame.Surface
     self.superficie_capa4 = ''  # type: pygame.Surface
     self.superficie_capa5 = ''  # type: pygame.Surface
     self.list_puntos      = []
     self.th_punto         = ThreadAdmin()
     self.area = 0, 0, 0, 0
예제 #5
0
 def __init__(self):
     self.tcp = Comunicacion()
     self.fdetect = Face_Detect2()
     self.th_detect = ThreadAdmin()
     self.host = ''
     self.port = ''
     self.ob_imagen = ''  # type: Imagen
     self.ob_label_fps = ''  # type: Label
     self.cola_imagen = queue.LifoQueue()
     self.conexion = False  # Estado de la conexion
     self.tiempo = Timer()
     self.evento_conexion = ''  # Evento que devuelve el estado de la conexion
     self.fun_envio = ''  # Evento para movimiento de la vista
예제 #6
0
 def __init__(self):
     #inicializar y leer el primer cuadro
     self.captura     = ''       # cv2 video captura
     self.procesado   = False
     self.frame       = ''
     self.activo      = False    # Estado de la camara
     self.th_capturar = ThreadAdmin()
     self.log         = self.__log_default   # Para configurar log
     self.src         = 0 
     self.sleeptime   = 0.01
     self.modo_activo = True # Metodo activo donde la camara queda en loop constante // False solo captura en la peticion
     self.ancho       = 0    # devuelve valores por defecto
     self.alto        = 0    # devuelve valores por defecto
     self.reintento   = 10   # reintento de conexion
예제 #7
0
 def __init__(self):
     self.soc = ""
     self.conexion = False  # Estado de la conexion
     self.estado = 0  # Valor de utlimo estado
     self.cola_codigo = queue.Queue()  # Cola de devolucion de codigo
     self.cola_mensaje = queue.Queue(
     )  # Cola de devolucion de detalle del codigo
     self.mensaje_velocidad = 0.001  # delay en ms entre el loop de mensajes
     self.th_conexion = ThreadAdmin()
     self.th_mensajes = ThreadAdmin()
     # self.th_recepcion  = ''     # hilo de recepcion
     self.host = ''
     self.puerto = ''
     self.buffer = 1024
     self.callback = ''
     self.binario = False
     self.timeout = 1  # 1 segundo
예제 #8
0
    def __init__(self):
        # Variable local de conexion
        self.conexion = False  # Estado de la conexion
        self.estado = 0  # Valor de utlimo estado
        self.salir = False  # Variable de salida
        # self.cola_recepcion = queue.Queue()     # Cola de datos # no usada al momento
        self.cola_codigo = queue.Queue()  # Cola de devolucion de codigo
        self.cola_mensaje = queue.Queue()  # Cola de devolucion de detalle del codigo
        self.mensaje_velocidad = 0.001  # delay en ms entre el loop de mensajes
        self.conexiones = 1  # Cantidad de conexiones admitidas
        self.sc = ''  # Socket
        self.sock = ''  # Socket
        # variables de configuracion
        self.ip = ''
        self.puerto = ''
        self.tam_buffer = ''  # el tamano se usa para la recepcion
        self.binario = False  # utilizado para enviar imagenes // se debe cambiar el tamaño del buffer

        self.th_conexion    = ThreadAdmin()
        self.th_cola        = ThreadAdmin()
        self.reintento      = 50
        self.binario        = False  # para enviar datos binarios
예제 #9
0
class DrawBox(ObjetoGral):
    def __init__(self, C_Form):
        super().__init__(C_Form)                # instanciamos la clase padre
        # superficie interna - fondo y 4 capas
        self.superficie_fondo = ''  # type: pygame.Surface
        self.superficie_capa1 = ''  # type: pygame.Surface
        self.superficie_capa2 = ''  # type: pygame.Surface
        self.superficie_capa3 = ''  # type: pygame.Surface
        self.superficie_capa4 = ''  # type: pygame.Surface
        self.superficie_capa5 = ''  # type: pygame.Surface
        self.list_puntos      = []
        self.th_punto         = ThreadAdmin()
        self.area = 0, 0, 0, 0

    def config(self, x, y, ancho, alto):
        super().config(x, y, ancho, alto)
        # posicion sobre superficie
        self.area = 0, 0, self.ancho, self.alto
        # crear la superficie interna fondo
        self.superficie_fondo = pygame.Surface((self.ancho, self.alto))

    def dibujar(self):
        """Dibuja fisicamente el objeto en la superficie interna
            y en la sup general, posteriormente se requiere update de la sup
        """
        self.superficie_fondo.fill(self.color)
        # Dibujar la superficie interna en la general
        self.superficie.blit(self.superficie_fondo, (self.x, self.y), self.area)

        # pygame.draw.rect(self.superficie, self.color, self.rectangulo, 0)  # dibujamos

    def __obt_capa__(self, capa_num):
        if capa_num == 0:
            return self.superficie_fondo
        elif capa_num == 1:
            return self.superficie_capa1
        elif capa_num == 2:
            return self.superficie_capa2
        elif capa_num == 3:
            return self.superficie_capa3
        elif capa_num == 4:
            return self.superficie_capa4
        elif capa_num == 5:
            return self.superficie_capa5
    ###################################
    ### METODOS                     ###
    ###################################
    def nueva_capa(self, capa_num):
        # crear la superficie interna fondo
        capa = pygame.Surface((self.ancho, self.alto))
        capa.fill(self.color)
        capa.set_colorkey(self.color)    # capa con mascara oculta
        if   capa_num == 1:
            self.superficie_capa1 = capa
        elif capa_num == 2:
            self.superficie_capa2 = capa
        elif capa_num == 3:
            self.superficie_capa3 = capa
        elif capa_num == 4:
            self.superficie_capa4 = capa
        elif capa_num == 5:
            self.superficie_capa5 = capa

    def limpiar_capa(self, capa_num):
        if   capa_num == 0:
            self.superficie_fondo.fill(self.color)
        elif capa_num == 1:
            self.superficie_capa1.fill(self.color)
        elif capa_num == 2:
            self.superficie_capa2.fill(self.color)
        elif capa_num == 3:
            self.superficie_capa3.fill(self.color)
        elif capa_num == 4:
            self.superficie_capa4.fill(self.color)
        elif capa_num == 5:
            self.superficie_capa5.fill(self.color)

    def draw_punto(self, x, y, tamano, color, capa_num=0):
        capa = self.__obt_capa__(capa_num)
        pygame.draw.circle(capa, color, (int(x), int(y)), tamano)

    def draw_punto_temporal(self, x, y,  tamano, color, tiempo, capa_num=0):
        tiempo_act = 0
        color_act  = color
        parametros = int(x), int(y),  tamano, color, color_act, tiempo, tiempo_act, capa_num
        self.list_puntos.append(parametros)
        if not self.th_punto.state:
            self.th_punto.start(self.__hilo_punto__, '', "PUNTOS")


    def __hilo_punto__(self):
        indice = 0
        lista = self.list_puntos.copy()
        self.list_puntos.clear()
        lista_tmp = []
        while len(lista) > 0:
            lista_tmp.clear()
            lista.sort(reverse=True, key=self.__funcion_sort__)
            for punto in lista:
                x, y, tamano, color, color_act, tiempo, tiempo_act, capa_num = punto
                tiempo_act += 1
                color_act = color_a_color(color_act, color, self.color, tiempo * 10)
                self.draw_punto(x, y, tamano, color_act, capa_num)
                punto = x, y, tamano, color, color_act, tiempo, tiempo_act, capa_num
                if tiempo_act < tiempo * 10:
                    lista_tmp.append(punto)
                else:
                    self.draw_punto(x, y, tamano, self.color, capa_num)
            time.sleep(0.1)
            self.list_puntos.extend(lista_tmp)
            lista = self.list_puntos.copy()
            self.list_puntos.clear()


    def __funcion_sort__(self, punto):
        x, y, tamano, color, color_act, tiempo, tiempo_act, capa_num = punto
        r, g, b = color_act
        return r + g + b


    def draw_punto_distante(self, x, y, angulo, distancia, color, tamano, capa_num=0):
        x1, y1 = posLineRadio(x, y, angulo, distancia)
        capa = self.__obt_capa__(capa_num)
        pygame.draw.circle(capa, color, (int(x1), int(y1)), tamano)

    def draw_linea(self, x1, y1, ancho, alto, color, ancho_linea=1, capa_num=0):
        x2 = x1 + ancho
        y2 = y1 + alto
        capa = self.__obt_capa__(capa_num)
        pygame.draw.line(capa, color, (x1, y1), (x2, y2), ancho_linea)

    def draw_linea_angular(self, x, y, angulo, longitud, color, ancho=1, capa_num=0):
        x2, y2 = posLineRadio(x, y, angulo, longitud)
        capa = self.__obt_capa__(capa_num)
        pygame.draw.line(capa, color, (x, y), (x2, y2), ancho)

    def draw_flecha(self, x, y, angulo, longitud, color, ancho=1, capa_num=0):
        x2, y2 = posLineRadio(x, y, angulo, longitud)
        angulo_flecha1 = sumar_angulo(angulo, 200)
        angulo_flecha2 = sumar_angulo(angulo, 160)
        self.draw_linea_angular(x, y, angulo, longitud, color, ancho, capa_num)
        self.draw_linea_angular(x2, y2, angulo_flecha1, (longitud/2), color, ancho, capa_num)
        self.draw_linea_angular(x2, y2, angulo_flecha2, (longitud/2), color, ancho, capa_num)

    def arco(self, x, y, angulo, longitud, arco, color, ancho=1):
        pass
        #pygame.draw.arc(self.superficie, color, rect,  )


    def pintar(self):
        """Actualizar el dibujo, llamar luego de terminar dibujo
        """
        self.superficie.blit(self.superficie_fondo, (self.x, self.y), self.area)
        if self.superficie_capa1:
            self.superficie.blit(self.superficie_capa1, (self.x, self.y), self.area)
        if self.superficie_capa2:
            self.superficie.blit(self.superficie_capa2, (self.x, self.y), self.area)
        if self.superficie_capa3:
            self.superficie.blit(self.superficie_capa3, (self.x, self.y), self.area)
        if self.superficie_capa4:
            self.superficie.blit(self.superficie_capa4, (self.x, self.y), self.area)
        if self.superficie_capa5:
            self.superficie.blit(self.superficie_capa5, (self.x, self.y), self.area)
        self.actualizar()
예제 #10
0
class Face_Comp(object):
    def __init__(self):
        self.tcp = Comunicacion()
        self.fdetect = Face_Detect2()
        self.th_detect = ThreadAdmin()
        self.host = ''
        self.port = ''
        self.ob_imagen = ''  # type: Imagen
        self.ob_label_fps = ''  # type: Label
        self.cola_imagen = queue.LifoQueue()
        self.conexion = False  # Estado de la conexion
        self.tiempo = Timer()
        self.evento_conexion = ''  # Evento que devuelve el estado de la conexion
        self.fun_envio = ''  # Evento para movimiento de la vista

    def config(self, host, puerto, ob_imagen, ob_label_fps, fun_envio):
        # type: (str, int, Imagen, Label, object)->None
        """ Se requiere IP del Servidor y Objeto Imagen
            Devuelve la imagen y los fps en un objeto label
            fun envio = fun(modulo, comando, valor)
        """
        self.host = host
        self.port = puerto
        self.ob_imagen = ob_imagen
        self.ob_label_fps = ob_label_fps
        self.tcp.config(host,
                        puerto,
                        binario=True,
                        callback=self.__call_conexion)
        self.fdetect.config(Callback_Imagen=self.__call_imagen)
        self.fdetect.config_callback(Func_Unica=self.__call_posdetect)
        self.fun_envio = fun_envio

    def config_eventos(self, evento_conexion=''):
        """evento_conexion: Funcion que devuelve True o False cuando conecta o desconecta
           Ej: def evento(Estado)
        """
        self.evento_conexion = evento_conexion

    def iniciar(self):
        self.tiempo.iniciar()
        self.tcp.iniciar()

    def desconectar(self):
        self.tcp.desconectar()
        self.th_detect.close()

    def __call_conexion(self, codigo, mensaje):
        """ recepcion de datos binarios del servidor tcp"""
        # Conectado
        if codigo == 2:
            self.conexion = True
            self.th_detect.start(self.__th_detector,
                                 '',
                                 'DETECTOR',
                                 enviar_ejecucion=True)
            self.evento_conexion(True)  # Devolvemos conectado
        # Desconecado
        elif codigo == 0:
            self.conexion = False
            self.evento_conexion(False)  # Devolvemos desconectado
        # Recepcion de datos
        elif codigo == 4:
            self.cola_imagen.put(mensaje)  # encolamos la imgen recibida
        # Errores
        elif codigo == -1:
            self.conexion = False
            self.evento_conexion(False)  # Devolvemos desconectado
        # Otros mensajes
        else:
            if codigo != 3:  # 3 es envio de mensajes
                print("MEN: " + str(codigo) + " " + str(mensaje))

    def __call_imagen(self, cv_imagen):
        """ recepcion de imagen procesada por el detector para insertar en el objeto imagen"""
        self.ob_imagen.imagen_cv(cv_imagen)

    def __th_detector(self, run):
        """ envia a analizar las imagenes que entran en cola """
        while run.value:
            if self.cola_imagen.qsize() > 0:
                # print(tiempo.fps())
                self.ob_label_fps.set_text("FPS: " +
                                           str(round(self.tiempo.fps(), 2)))
                imag = self.cola_imagen.get()
                self.fdetect.imagen(imag)
            time.sleep(0.01)

    def __call_posdetect(self, x, y):
        modulo = "FACE"
        comando = "CENTRAR"
        valor = str(x) + "/" + str(y)  # separador de valores /
        self.fun_envio(modulo, comando, valor)
예제 #11
0
from componentes.thread_admin import ThreadAdmin
import time
from queue import Queue

from componentes.comunicacion import Comunicacion
from compuesto.image_send import Image_Send
from compuesto.robot_cara import Robot_Cara
from compuesto.robot_cuerp import Robot_Cuerpo
# Sensores
from sensores.ultrasonido import UltraSonido

from ia.tts import TTS

COLA_SONICO = Queue()
TH_SONICO = ThreadAdmin()


class Gestor(object):
    def __init__(self):
        self.tcp_gestor = Comunicacion()
        self.host = "127.0.0.1"
        self.log = self.__log_default  # Para configurar log
        # Elementos de gestion
        self.im_send = Image_Send()
        self.cara = Robot_Cara()
        self.cuerpo = Robot_Cuerpo()
        self.voz = ''  # type: TTS
        self.sonico_cent = UltraSonido()

    def config(self, host, voz):
예제 #12
0
class Cliente_TCP(object):
    def __init__(self):
        self.soc = ""
        self.conexion = False  # Estado de la conexion
        self.estado = 0  # Valor de utlimo estado
        self.cola_codigo = queue.Queue()  # Cola de devolucion de codigo
        self.cola_mensaje = queue.Queue(
        )  # Cola de devolucion de detalle del codigo
        self.mensaje_velocidad = 0.001  # delay en ms entre el loop de mensajes
        self.th_conexion = ThreadAdmin()
        self.th_mensajes = ThreadAdmin()
        # self.th_recepcion  = ''     # hilo de recepcion
        self.host = ''
        self.puerto = ''
        self.buffer = 1024
        self.callback = ''
        self.binario = False
        self.timeout = 1  # 1 segundo

    def config(self,
               Host="127.0.0.1",
               Puerto=50001,
               Callback='',
               Buffer=1024,
               Binario=False):
        ''' Funcion callback devuelve (Codigo, Mensaje)
            Codigos: -1: Error 0: Desconectado 1: Conectando 2: Conectado
            3: Envio de Datos 4: Recepcion de Datos
            Calback funcion ej: calback(codigo, mensaje): / calback(self, codigo, mensaje):
        '''
        self.host = Host
        self.puerto = int(Puerto)
        self.buffer = Buffer
        self.binario = Binario  # Solo puede recibir binario (cambia el buufer automatico), envia texto
        self.callback = Callback  # Funcion de rellamada de estados
        if Binario:
            self.buffer = 4096

    def conectar(self):
        # control de mensajes si ya se encuentra en ejecucion
        if not self.th_mensajes.state:
            self.th_mensajes.start(self.__th_mensajes, '', 'MENSAJES-TCP', 3,
                                   self.__callaback_th, True)
        if not self.conexion:
            self.th_conexion.start(self.__th_conectar, '', 'CONEXION-TCP', 3,
                                   self.__callaback_th, True)
        else:
            self.__estado(-1, "Conexion actualmente establecida")

    def __th_conectar(self, run):
        try:
            self.conexion = True
            self.__estado(1, "Estableciendo conexion")
            self.soc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.soc.settimeout(self.timeout)
            conectar = self.soc.connect(
                (self.host, self.puerto))  # si tiene que usarse
            self.__estado(2, "Conexion establecida")
            # ejecuta la recepcion segun binario o texto
            if self.binario:
                self.__recibir_bin(run)  # recepcion binaria
            else:
                self.__recibir(run)  # recepcion texto
        except Exception:
            self.conexion = False
            self.__estado(-1, "Error en conexion")

    def enviar(self, mensaje):
        if self.conexion:
            try:
                self.soc.sendall(mensaje.encode('utf-8'))
                self.__estado(3, "Enviado: " + mensaje)
            except:
                self.desconectar()
                self.__estado(-1,
                              "Problemas al enviar datos.  Conexion Cerrada")
        else:
            try:
                self.__estado(-1, "Sin Conexion: " + mensaje)
            except:
                print("Sin Conexion: " + mensaje)

    def __recibir(self, run):
        self.soc.settimeout(
            self.timeout)  # time out de escucha // posiblementa innecesario
        while self.conexion and run.value:
            try:
                recibido = self.soc.recv(
                    self.buffer
                )  # leer del puerto - posible bloqueo hasta recepcion (con timeout no hay)
                if recibido == b'':
                    self.__estado(-1, "Servidor Desconectado")
                    self.desconectar()
                else:
                    self.__estado(4, recibido.decode())  # Recepcion de datos
            except socket.timeout as err:
                pass  # time out continua con el loop
            except Exception as err:
                self.__estado(-1, "Error SOC: " + str(err))
                self.desconectar()
            # Espera antes de leer nuevamente el puerto // elimanda la espera ya que la lectura es bloqueante
            # time.sleep(0.1)

    # recepcion binaria
    def __recibir_bin(self, run):
        self.soc.settimeout(
            3)  # time out de escucha // posiblementa innecesario
        recibido = b''  # tipo de dato binario
        payload_size = struct.calcsize("Q")
        while self.conexion and run.value:
            try:
                # recibir el tama�o del mensaje
                while len(recibido) < payload_size:
                    recibido += self.soc.recv(
                        self.buffer
                    )  # leer del puerto - posible bloqueo hasta recepcion (con timeout no hay)
                # obtener el tama�o del mensaje
                packed_msg_size = recibido[:payload_size]
                recibido = recibido[payload_size:]
                msg_size = struct.unpack("Q", packed_msg_size)[0]
                # Recibir todos los datos segun el tama�o
                while len(recibido) < msg_size:
                    recibido += self.soc.recv(
                        self.buffer
                    )  # leer del puerto - posible bloqueo hasta recepcion (con timeout no hay)
                    # print("len (recibido): ", len(recibido))
                frame_data = recibido[:msg_size]
                recibido = recibido[msg_size:]
                # extrar el frame
                frame = pickle.loads(frame_data)
                # Recibido (datos binarios en frame)
                # cv2.imshow('frame',frame)
                # cv2.waitKey(1)
                self.__estado(4, frame)  # Recepcion de datos
            except socket.timeout as err:
                pass  # time out continua con el loop
            except Exception as err:
                self.__estado(-1, "Error SOC: " + str(err))
                self.desconectar()

    def desconectar(self):
        try:
            self.conexion = False
            self.th_conexion.close()
            self.soc.close()
            self.__estado(0, "Conexion Cerrada")
        except Exception:
            self.__estado(-1, "Error al cerrar conexion")

    # codificacion y envio de estados y mensaje
    def __estado(self, Estado, Mensaje):
        self.estado = Estado
        self.cola_codigo.put(Estado)
        self.cola_mensaje.put(Mensaje)

    # loop de lectura de mensajes
    def __th_mensajes(self, run):
        while run.value:
            if self.cola_mensaje.qsize() > 0:
                codigo = self.cola_codigo.get()
                mensaje = self.cola_mensaje.get()
                self.callback(codigo, mensaje)
            time.sleep(self.mensaje_velocidad)

    # Callback de TH
    def __callaback_th(self, Codigo, Mensaje):
        print(Mensaje)
예제 #13
0
class Servidor_TCP(object):
    def __init__(self):
        # Variable local de conexion
        self.conexion = False  # Estado de la conexion
        self.estado = 0  # Valor de utlimo estado
        self.salir = False  # Variable de salida
        # self.cola_recepcion = queue.Queue()     # Cola de datos # no usada al momento
        self.cola_codigo = queue.Queue()  # Cola de devolucion de codigo
        self.cola_mensaje = queue.Queue(
        )  # Cola de devolucion de detalle del codigo
        self.mensaje_velocidad = 0.001  # delay en ms entre el loop de mensajes
        self.conexiones = 1  # Cantidad de conexiones admitidas
        self.sc = ''  # Socket
        self.sock = ''  # Socket
        # variables de configuracion
        self.ip = ''
        self.puerto = ''
        self.tam_buffer = ''  # el tamano se usa para la recepcion
        self.binario = False  # utilizado para enviar imagenes // se debe cambiar el tamaño del buffer

        self.th_conexion = ThreadAdmin()
        self.th_cola = ThreadAdmin()
        self.reintento = 50
        self.binario = False  # para enviar datos binarios

    def config(self,
               Host="127.0.0.1",
               Puerto=50001,
               Buffer=1024,
               Callback='',
               Binario=False):  # Con parametros opcionales
        self.ip = Host
        self.puerto = Puerto
        self.tam_buffer = Buffer
        self.binario = Binario  # utilizado para enviar imagenes // solo envia binario - no recibe
        self.callback = Callback  # Funcion de rellamada de estados
        # Mensajes de callback: 0 Desconectado| 1 Conectando| 2 Conectado
        # 3 Envio de datos| 4 Recepcion de datos|-1 Error

    def iniciar(self):
        # control de mensajes si ya se encuentra en ejecucion
        if not self.th_cola.state:
            self.th_cola.start(self.__th_mensajes, '', 'MENSAJES-TCP', 3,
                               self.__callaback_th, True)
        # inicio de intento de escucha
        if not self.conexion:
            self.th_conexion.start(self.__th_reintento_escucha, '', 'SERV-TCP',
                                   3, self.__callaback_th, True)
        else:
            self.__estado(-1, "Conexion actualmente establecida")

    # Servidor (re-intentos de escucha de conexiones)
    def __th_reintento_escucha(self, run):
        if not self.conexion:
            intento = 0
            while (intento < self.reintento) and run.value:
                self.__intento_conexion(run)
                if self.estado == -1:
                    intento += 1  # no pudo conectarse
                if self.estado == 2:
                    self.__interno_escuchar(
                        run
                    )  # conecto pasamos a escuchar y liberamos los reintentos
                    intento = 0
                    # en cuanto se corta la conexion vuelve a este loop para los reintentos de conexion
                time.sleep(
                    5)  # espera de 5 segundos antes de reintentar conexion

    # Servidor (intento de conexion)
    def __intento_conexion(self, run):
        # INTENTO DE CONEXION
        try:
            self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.sock.settimeout(3)  # timeout de conexion
            self.sock.bind((self.ip, self.puerto))
            self.sock.listen(self.conexiones)
            self.__estado(
                1, "Esperando conexion remota en: " + str(self.ip) + " " +
                str(self.puerto))
        except:
            self.__estado(
                -1, "No es posible asignar el puerto: " + str(self.ip) + " " +
                str(self.puerto))

        # BLOQUE DE ESPERA DE CONEXION
        while self.estado == 1 and run.value:
            try:
                self.sc, addr = self.sock.accept(
                )  # Bloquea hasta que se conectan o por timeout
                self.conexion = True
                self.__estado(2, "Conexion establecida")
            except socket.timeout as err:
                pass  # time out continua con el loop
            except Exception as err:
                self.conexion = False
                self.__estado(-1, "Error SOC: " + str(err))

    # loop de escucha de mensajes una vez establecida la conexion
    def __interno_escuchar(self, run):
        # LOOP DE ESCUCHA
        recibido = ""
        self.sc.settimeout(3)  # time out de escucha
        while self.conexion and run.value:
            try:
                recibido = self.sc.recv(
                    self.tam_buffer
                )  # leer del puerto - posible bloqueo hasta recepcion
                if recibido == b'':
                    self.desconectar()
                    self.__estado(0, "Cliente Desconectado - Reception end")
                else:
                    self.__estado(
                        4, recibido.decode())  # Recepcion CORRECTA de datos
            except socket.timeout as err:
                pass  # time out continua con el loop
            except:
                self.desconectar()
                self.__estado(0, "Cliente Desconectado - Reception error")
        # antes de salir cerrar para liberar puertos

    def enviar(self, mensaje):
        if self.conexion:
            try:
                if self.binario:  # datos binarios // ej: imagenes
                    datos = pickle.dumps(
                        mensaje
                    )  # para datos binarios (serializacion de datos)
                    # Send message length first
                    message_size = struct.pack(
                        "Q", len(datos))  # tamaño "Q" 8 bytes
                    # envio
                    self.sc.sendall(message_size + datos)
                    # Envio de info local
                    self.__estado(3, "SEND: DATOS BINARIOS")
                else:
                    datos = str(mensaje)
                    self.sc.sendall(datos.encode('utf-8'))
                    # Envio de info local
                    self.__estado(3, "SEND: " + datos)
            except:
                self.desconectar()
                self.__estado(-1,
                              "Problemas al enviar datos - Conexion Cerrada")

    def desconectar(self):
        if self.conexion:
            self.conexion = False
            self.sc.close()
            self.sock.close()
            self.estado = 0
            self.__estado(0, "Conexion Cerrada")
        else:
            self.estado = 0
            self.__estado(0, "Conexion previamente Cerrada")

    # codificacion y envio de estados y mensaje
    def __estado(self, Estado, Mensaje):
        self.estado = Estado
        self.cola_codigo.put(Estado)
        self.cola_mensaje.put(Mensaje)

    # loop de lectura de mensajes
    def __th_mensajes(self, run):
        # while self.conexion:
        while run.value:
            if self.cola_mensaje.qsize() > 0:
                codigo = self.cola_codigo.get()
                mensaje = self.cola_mensaje.get()
                self.callback(codigo, mensaje)
            time.sleep(self.mensaje_velocidad)

    # Callback de TH
    def __callaback_th(self, Codigo, Mensaje):
        self.callback(Codigo, Mensaje)
예제 #14
0
class Face_Detect(object):
    def __init__(self):
        self.resolucion = (320, 240)
        self.frames = 10
        self.prob_min = 0.5  # probabilidad minima de deteccion
        self.log = self.__log_default
        self.cv = cv2
        self.vs = Webcam()  # webcam
        self.net = ''  # red neuronal
        self.frame = ''  # imagen capturada
        self.frameshow = None  # imagen a mostrar
        self.ancho = 0
        self.alto = 0
        self.th_detect = ThreadAdmin()
        self.th_show = ThreadAdmin()
        self.activo = False  # Estado de ejecucion
        #
        self.show = False  # Para visualizar o no (Tests)
        self.func_detect = ''  # llama la funcion con deteccion
        self.func_cuadro = ''  # retorna coordenadas de cuadro rostro
        self.func_vista = ''  # retorna punto de vista de rostro
        self.func_cent_vis = ''  # funcion q retorna valores para centrar la vista
        self.func_unica = ''  # funcion q retorna valor unico de angulo de centrado de vista (tomando rangos de min y max)
        #
        self.ang_x = 0  # ultimo angulo
        self.ang_y = 0  # ultimo angulo
        self.min_x = 4  # valor diferencia minimo para funcion unica
        self.min_y = 4  # valor diferencia minimo para funcion unica
        self.x = 0
        self.y = 0
        self.elementos = []

    def config(self, Resolucion=(320, 240), Frames=10, Show=False):
        self.resolucion = Resolucion
        self.frames = Frames
        self.show = Show
        #
        proto = Path_Actual(
            __file__) + '/face_detect_files/deploy.prototxt.txt'
        model = Path_Actual(
            __file__
        ) + '/face_detect_files/res10_300x300_ssd_iter_140000.caffemodel'
        self.net = self.cv.dnn.readNetFromCaffe(proto, model)
        #
        #self.vs.config()

        if self.show:
            self.log("Iniciando video show", "FACE_DETECT")
            self.th_show.start(self.__th_show,
                               '',
                               'FACE_SHOW',
                               callback=self.__callaback_th)

    def config_callback(self,
                        Func_Detect='',
                        Func_Cuadro='',
                        Func_Vista='',
                        Func_Cent_Vista='',
                        Func_Unica=''):
        # Func_Detect = Funcion()
        # Func_Cuadro = Funcion(X,Y,Ancho,Alto)
        # Func_Vista  = Funcion(X,Y)
        # Func_Cent_Vista = Funcion(X,Y)
        # Func_Unica      = Funcion(X,Y)
        self.func_detect = Func_Detect
        self.func_cuadro = Func_Cuadro
        self.func_vista = Func_Vista
        self.func_cent_vis = Func_Cent_Vista
        self.func_unica = Func_Unica

    def config_log(self, Log):
        #posibilidad de configurar clase Log(Texto, Modulo)
        self.log = Log.log
        self.vs.config_log(Log)

    def check(self, source=0):
        return self.vs.check()

    def iniciar(self):
        # inicializar video
        self.vs.start()
        self.activo = True
        self.log("Iniciando video stream", "FACE_DETECT")
        self.th_detect.start(self.__th_loop,
                             '',
                             'FACE_DETECT',
                             callback=self.__callaback_th)

    def stop(self):
        self.activo = False

    def __th_show(self):
        while True:
            if (self.frameshow is not None):
                time.sleep(0.01)
                self.cv.imshow("Frame", self.frameshow)
                ## Salir con Q
                key = self.cv.waitKey(1) & 0xFF
                if key == ord("q"):
                    break

    def __th_loop(self):
        self.log("Loop de deteccion", "FACE_DETECT")
        # Loop
        while self.activo:
            # Lectura de frame
            self.frame = self.vs.read()
            # Ajuste de tamaño
            self.frame = imutils.resize(self.frame,
                                        width=self.resolucion[0],
                                        height=self.resolucion[1])
            #h y w devuelve la resolucion real
            (self.alto, self.ancho) = self.frame.shape[:2]
            # conversion a blob en 300 x 300
            blob = self.cv.dnn.blobFromImage(
                self.cv.resize(self.frame, (300, 300)), 1.0, (300, 300),
                (104.0, 177.0, 123.0))
            # enviar el blob a la red neuronal y obtener deteccion
            self.net.setInput(blob)
            detections = self.net.forward()
            # loop sobre las detecciones encntradas
            for i in range(0, detections.shape[2]):
                confidence = detections[0, 0, i, 2]  # extraer la probabilidad
                if confidence > self.prob_min:
                    # detectado
                    self.__deteccion(detections, i)
            # revisamos si es vista unica una vez q reviso todo
            if self.func_unica != '':
                #pass
                self.__funcion_unica()

            #dibujamos
            self.frameshow = self.frame

        #fin de streaming
        self.vs.stop()

    def __funcion_unica(self):
        if self.elementos:
            maximos = max(self.elementos)
            self.elementos.clear()
            # contruir
            x = maximos[1]
            y = maximos[2]
            box = maximos[3]
            xc = maximos[4]
            yc = maximos[5]
            # determinar angulo de desplazamiento (30 es el grado focal de la camara)
            angulo_x = int((xc / (self.resolucion[0] / 2)) * 30)
            angulo_y = int((yc / (self.resolucion[1] / 2)) * 30)
            if (abs(angulo_x) > self.min_x) or (abs(angulo_y) > self.min_y):
                if (self.ang_x != angulo_x) or (self.ang_y != angulo_y):
                    self.func_unica(angulo_x, angulo_y)
                    self.ang_x = angulo_x
                    self.ang_y = angulo_y
            else:
                if (self.ang_x != 0) or (self.ang_y != 0):
                    self.func_unica(0, 0)
                    self.ang_x = 0
                    self.ang_y = 0
            # dibuja rectangulo
            if (self.show):
                (startX, startY, endX, endY) = box.astype("int")
                self.cv.rectangle(self.frame, (startX, startY), (endX, endY),
                                  (0, 0, 255), 2)
                # dibujar el centro de vista
                self.cv.circle(self.frame, (x, y), 10, (0, 0, 255), 2)

    def __deteccion(self, detections, elemento):
        # envelementoar detectado
        if self.func_detect != '':
            # llamar funcion
            self.func_detect()
        # enviar cuadro o vista
        if (self.func_cuadro != '') or (self.func_vista != '') or (
                self.func_cent_vis != '') or ((self.func_unica != '')):
            #generar coordenadas al rededor del rostro
            box = detections[0, 0, elemento, 3:7] * np.array(
                [self.ancho, self.alto, self.ancho, self.alto])
            (startX, startY, endX, endY) = box.astype("int")
            y = startY - 10 if startY - 10 > 10 else startY + 10
            # devolvemos la funcion cuadro
            if (self.func_cuadro != ''):
                self.func_cuadro(startX, startY, endX, endY)
            # calculamos la funcion vista
            if (self.func_vista != '') or ((self.func_cent_vis != '')) or (
                (self.func_unica != '')):
                x = int(startX + ((endX - startX) / 2))
                y = int(startY + ((endY - startY) / 3))
                # devolvemos la funcion vista
                if (self.func_vista != ''):
                    self.func_vista(x, y)
                if (self.func_cent_vis != '') or (self.func_unica != ''):
                    xc = x - (self.ancho / 2)
                    yc = y - (self.alto / 2)
                    # devolvemos la funcion centrado
                    if (self.func_cent_vis != ''):
                        self.func_cent_vis(xc, yc)
                # identificar un unico rostro
                if (self.func_unica != ''):
                    taman = (box[2] - box[0]) * (box[3] - box[1])
                    #self.elementos[elemento] = taman
                    resul = [taman, x, y, box, xc, yc]
                    self.elementos.append(resul)
            # solo si no esta la funcion unica
            if (self.show) and (self.func_unica == ''):
                # dibuja rectangulo
                if self.func_cuadro != '':
                    self.cv.rectangle(self.frame, (startX, startY),
                                      (endX, endY), (0, 0, 255), 2)
                # dibujar el centro de vista
                if self.func_vista != '':
                    self.cv.circle(self.frame, (x, y), 10, (0, 0, 255), 2)

    # Log por defecto
    def __log_default(self, Texto, Modulo):
        print(Texto)

    def __callaback_th(self, Codigo, Mensaje):
        self.log(Mensaje, "FACE_DETECT")
예제 #15
0
""" Prueba de uso de binarios """
import time
# Esto es para poder hacer el from desde un nivel atras y funciona con launch.json
import os, sys
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_PATH)

from componentes.comunic.servidor_tcp import Servidor_TCP
from componentes.webcam import Webcam
from componentes.thread_admin import ThreadAdmin

th_cam = ThreadAdmin()
tcp = Servidor_TCP()
cam = Webcam()
cam.config(0, ModoActivo=True)
cam.start()

time.sleep(1)


def fun_calback(Codigo, Mensaje):
    if Codigo != 3:
        print("COD: ", Codigo, "Men: ", Mensaje)
    if Codigo == 2:
        th_cam.start(th_camara, '', 'CAMARA ENVIO')


def th_camara():
    time.sleep(2)
    while True:
        frame = cam.read()
예제 #16
0
""" Prueba de uso de binarios """
import time
# Esto es para poder hacer el from desde un nivel atras y funciona con launch.json
import os, sys
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_PATH)

from componentes.comunic.servidor_tcp import Servidor_TCP
from componentes.webcam import Webcam
from componentes.thread_admin import ThreadAdmin
from componentes.timer import Timer

th_cam  = ThreadAdmin()
tcp     = Servidor_TCP()
cam     = Webcam()
tiempo = Timer()

cam.config(0,ModoActivo=True)
cam.start()

time.sleep(1)

def fun_callback(Codigo, Mensaje):
    if Codigo != 3:
        print("COD: ", Codigo, "Men: ", Mensaje)
    if Codigo == 2:
        pass
        th_cam.start(th_camara,'','CAMARA ENVIO',enviar_ejecucion=True)
            

def th_camara(run):
예제 #17
0
class Webcam(object):
    def __init__(self):
        #inicializar y leer el primer cuadro
        self.captura     = ''       # cv2 video captura
        self.procesado   = False
        self.frame       = ''
        self.activo      = False    # Estado de la camara
        self.th_capturar = ThreadAdmin()
        self.log         = self.__log_default   # Para configurar log
        self.src         = 0 
        self.sleeptime   = 0.01
        self.modo_activo = True # Metodo activo donde la camara queda en loop constante // False solo captura en la peticion
        self.ancho       = 0    # devuelve valores por defecto
        self.alto        = 0    # devuelve valores por defecto
        self.reintento   = 10   # reintento de conexion

    def config(self, src=0, ModoActivo=True, Ancho=0, Alto=0, reint_conex=10):
        ''' reint_conex: Reintentos de conexion con la camara
            ModoActivo: Camara capturando en segundo plano (mas rapido en raspberry)
        '''
        self.src         = src
        self.modo_activo = ModoActivo
        self.ancho       = Ancho
        self.alto        = Alto
        self.reintento   = reint_conex

    def config_log(self, Log):
        '''posibilidad de configurar clase Log(Texto, Modulo)'''
        self.log = Log.log

    def start(self):
        # reintento de conexion a la camara
        for intento in range(0, self.reintento):
            self.log("Inicializando Webcam", "WEBCAM")
            if Windows():
                self.captura = cv2.VideoCapture(self.src, cv2.CAP_DSHOW)
            else:
                self.captura = cv2.VideoCapture(self.src)
            # Revisar si conecto la camara
            if self.captura.isOpened():
                self.log("Webcam Inicializada", "WEBCAM")
                (self.procesado, self.frame) = self.captura.read()
                self.activo = True
                if self.modo_activo:
                    self.th_capturar.start(self.__th_loop,'','WEBCAM', callback=self.__callaback_th, enviar_ejecucion=True)
                # Salimos del reintento
                break
            else:
                self.log("Webcam (Falla en conexion)", "WEBCAM")
            time.sleep(2)  # pausa de 2 segundos para reintentar conexion

    def stop(self):
        if not self.modo_activo:
            self.captura.release()
        self.activo = False
        if self.modo_activo:
            self.th_capturar.close()
        self.log("Webcam Stop", "WEBCAM")
   
    def read(self):
        if self.modo_activo:
            return self.frame # devuelve imagen previamente capturada en el loop
        else:
            self.__captura()
            return self.frame # devuelve imagen capturada
    
    def check(self):
        ''' Controla si la webcam esta disponible
        '''
        if Windows():
            self.captura = cv2.VideoCapture(self.src, cv2.CAP_DSHOW)
        else:
            self.captura = cv2.VideoCapture(self.src)
        if self.captura.isOpened():
            self.captura.release()
            self.log("Webcam disponible", "WEBCAM")
            return True
        else:
            self.captura.release()
            self.log("Webcam no disponible", "WEBCAM")
            return False

    def __th_loop(self, run):
        while self.activo and run.value:
            self.__captura()
            time.sleep(self.sleeptime)  # descansar
        # cierre
        self.captura.release()
        self.log("Webcam Stoped", "WEBCAM")
    
    def __captura(self):
        if self.captura.isOpened():
            # leer cuadro
            (self.procesado, tmp_frame) = self.captura.read()
            if self.procesado:
                if self.ancho == 0:
                    self.frame = tmp_frame  # tamaño original
                else:
                    # tamaño ajustado
                    # print("ajustar tam")
                    self.frame = imutils.resize(tmp_frame, width=self.ancho, height=self.alto)
                    # print("ajustar tam ok")
            else:
                self.log("Frame Error", "WEBCAM")
                self.log("Posible camara desconectada", "WEBCAM")
                self.stop() # Frenar la camara para que no entre en loop
        else:
            self.log("Camara desconectada", "WEBCAM")
            self.activo = False # desactivamos la camara.

    # Log por defecto
    def __log_default(self, Texto, Modulo):
        print(Texto)
    
    # Callback de TH
    def __callaback_th(self, Codigo, Mensaje):
        self.log(Mensaje, "WEBCAM")