Beispiel #1
0
def __main_function__():
	# Import some global varialbes
	global archivoDeVideo
	global acaboDeIniciarNuevoCiclo
	acaboDeIniciarNuevoCiclo = False
	global tuveInfracciones
	tuveInfracciones = False

	# Creamos el reporte inicial
	miReporte = MiReporte(levelLogging=logging.INFO,nombre=__name__)			# Se crea por defecto con nombre de la fecha y hora actual
	miReporte.info('Programa iniciado exitosamente con ingreso de senal video '+archivoDeVideo+entradaReal+' con semaforo '+semaforoSimuladoTexto+str(periodoDeSemaforo) +', corriendo a '+str(mifps)+' Frames por Segundo')
	# Si no existe el directorio de reporte lo creo
	if not os.path.exists(directorioDeReporte):
		os.makedirs(directorioDeReporte)
	# Vector de inicio:
	# vector de inicio = [tiempo, periodo semaforo, cruce, giro, infraccion, otros]
	vectorDeInicio = [[datetime.datetime.now(),0,0,0,0,0]]
	if os.path.isfile(reporteDiario):
		miReporte.info('Continuando reporte')
		np.save(reporteDiario,np.append(np.load(reporteDiario),vectorDeInicio,0))
	else:
		miReporte.info('Creando reporte desde cero')
		np.save(reporteDiario,vectorDeInicio)
	
	# Is statements
	if generarArchivosDebug:
		miReporte.info('Generando Archivos de Debug')
	else:
		miReporte.info('Generando infracciones unicamente (No debug video)')
	
	# If mostrar Imagenes
	if mostrarImagen:
		miReporte.info('Pantalla de muestra de funcionamiento en tiempo real encendida')
	else:
		miReporte.info('Pantalla de muestra de funcionamiento en tiempo real apagada')

	# El directorio de reporte debe crearse al inicio del programa
	# Variables de control:
	
	numeroDeFrame = 0
	maximoInfraccionesPorFrame = 20
	#colores = np.random.randint(0,100,(maximoInfraccionesPorFrame,3))

	# Cargando los parametros de instalacion:
	# El archivo de video debe tener como minimo 5 caracteres para estar trnajando en modo simulado, de lo contrario estamos trabajando en modo real
	if len(archivoDeVideo) > 4:
		archivoParametrosACargar = archivoDeVideo[:-4]+'.npy'
	else:
		archivoParametrosACargar = 'datos.npy'
	
	parametrosInstalacion = np.load(folderDeInstalacion+'/'+archivoParametrosACargar)
	miReporte.info('Datos de Instalacion de: '+folderDeInstalacion+'/'+archivoParametrosACargar)
	poligonoSemaforo = parametrosInstalacion[0]
	verticesPartida = parametrosInstalacion[1]
	verticesLlegada = parametrosInstalacion[2]
	indicesSemaforo = obtenerIndicesSemaforo(np.array(poligonoSemaforo))
	angulo = parametrosInstalacion[3]
	poligonoEnAlta = parametrosInstalacion[4]

	miReporte.info('Cargado exitosamente parametros de instalacion ')#+str(parametrosInstalacion))

	# Arrancando camara
	if len(archivoDeVideo) == 0:
		conVideoGrabado = False												# modo real
		miCamara = cv2.VideoCapture(0)
		miCamara.set(3,640)
		miCamara.set(4,480)
		time.sleep(1)
		miReporte.info('Activada Exitosamente cámara en tiempo real')
	else:
		conVideoGrabado = True
		try:
			miCamara = cv2.VideoCapture(directorioDeVideos+'/'+archivoDeVideo)
			time.sleep(1)
			miReporte.info('Archivo de video cargado exitosamente: '+directorioDeVideos+'/'+archivoDeVideo)
		except Exception as currentException:
			miReporte.error('No se pudo cargar el video por '+str(currentException))

	# Se captura la imagen de flujo inicial y se trabaja con la misma
	ret, frameVideo = miCamara.read()
	frameFlujo = cv2.resize(frameVideo,(320,240))

	# Creación de objetos:
	if os.uname()[1] == 'raspberrypi':
		trabajoConPiCamara = True
	else:
		trabajoConPiCamara = False
	miPoliciaReportando = PoliciaInfractor(frameFlujo,verticesPartida,verticesLlegada)
	miGrabadora = GeneradorEvidencia(directorioDeReporte,mifps,False)
	miFiltro = IRSwitch()
	miAcetatoInformativo = Acetato()
	miSemaforo = CreateSemaforo(periodoDeSemaforo)
	miAcetatoInformativo.colocarPoligono(np.array(poligonoSemaforo)//2)
	miAcetatoInformativo.colocarPoligono(np.array(verticesPartida))
	miAcetatoInformativo.colocarPoligono(np.array(verticesLlegada))
	miAcetatoInformativo.colocarPoligono(miPoliciaReportando.carrilValido)

	# El historial sera una lista de la siguiente forma:
	# {numeroFrame: {'frame':np.array((320,240)),'data':{"info"}}}
	historial = {}
	frame_number  = 0
	tiempoAuxiliar = time.time()
	periodoDeMuestreo = 1.0/mifps
	grupo = [0]

	try: 
		while True:
			# LEEMOS LA CAMARA DE FLUJO
			if conVideoGrabado:
				for i in range(videofps//mifps):
					ret, frameVideo = miCamara.read()
			else:
				ret, frameVideo = miCamara.read()
			
			pixeles = np.array([frameVideo[indicesSemaforo[0][1],indicesSemaforo[0][0]]])
			
			#print('IndicesPixel: ',indicesSemaforo[0][0],indicesSemaforo[0][1])
			#print('La longitud semaforo: ',len(indicesSemaforo),' inicial ',pixeles.shape)
			#print('La longitud interna: ',len(indicesSemaforo[0]),' inicial ',pixeles.shape)
			for indiceSemaforo in indicesSemaforo[1:]:
				pixeles = np.append(pixeles,[frameVideo[indiceSemaforo[1],indiceSemaforo[0]]], axis=0)
				
				#cv2.circle(frameVideo, (indiceSemaforo[0],indiceSemaforo[1]), 1, (100,100,100), -1)
			#print('Pixeles: ',pixeles)
			wtf = pixeles.reshape((24,8,3))
			#cv2.imshow('Semaforo', cv2.resize(wtf, (240,320)))
			#print('La longitud pixels: ',pixeles.shape)
			senalSemaforo, semaforoLiteral, flanco, periodo = miSemaforo.obtenerColorEnSemaforo(pixeles)
			frameFlujo = cv2.resize(frameVideo,(320,240))
			

			if periodo != 0:
				miReporte.info('SEMAFORO EN VERDE, EL PERIODO ES '+str(periodo))
				miReporte.info('DateTime '+datetime.datetime.now().strftime('%Y%m%d_%H%M'))
				cruce = miPoliciaReportando.estadoActual['cruzo']
				giro = miPoliciaReportando.estadoActual['giro']
				infraccion = miPoliciaReportando.estadoActual['infraccion']
				otro = miPoliciaReportando.estadoActual['ruido']
				vectorDeInicio = [[datetime.datetime.now(),periodo,cruce,giro,infraccion,otro]]
				np.save(reporteDiario,np.append(np.load(reporteDiario),vectorDeInicio,0))
			else:
				pass
			# Si tengo infracciones pendientes las evoluciono
			
			velocidadEnBruto, velocidadFiltrada, pulsoVehiculos, momentumAEmplear = miPoliciaReportando.seguirImagen(frame_number,frameFlujo,colorSemaforo = senalSemaforo)
			
			if senalSemaforo >= 1 :							# Si estamos en rojo, realizamos una accion
				if flanco == 1:							# esto se inicia al principio de este estado
					miReporte.info('SEMAFORO EN ROJO')
	
			if senalSemaforo == 0:							# Si estamos en verde realizamos otra accion
				if flanco == -1:					# Si estamos en verde y en flanco, primer verde, realizamos algo
					miReporte.info('INICIANDO REPORTE DE: '+str(miPoliciaReportando.numeroInfraccionesConfirmadas())+' INFRACCIONES')
					acaboDeIniciarNuevoCiclo = True
					ultimoNumeroInfraccion = miPoliciaReportando.numeroInfraccionesConfirmadas()
				
				if acaboDeIniciarNuevoCiclo:	
					if miPoliciaReportando.numeroInfraccionesConfirmadas() > 0:
						tuveInfracciones = True
						infraccionEnRevision = miPoliciaReportando.popInfraccion()
						miGrabadora.generarReporteInfraccion(historial, infraccionEnRevision)
						
					else:
						if (tuveInfracciones):
							if generarArchivosDebug:
								miGrabadora.generarReporteInfraccion(historial, False,ultimoNumeroInfraccion)
							tuveInfracciones = False
						miPoliciaReportando.purgarInfraccionesRemanentes()
						
						del historial
						historial = {}
						frame_number = 0	
						acaboDeIniciarNuevoCiclo = False
				else:
					#Si no hay infracciones a reportar me fijo el estado del filtro:
					tiempoAhora = datetime.datetime.now().hour*60 + datetime.datetime.now().minute
					if (tiempoAhora > amaneciendo) & (miFiltro.ultimoEstado != 'Filtro Activado'):
						miFiltro.colocarFiltroIR()
					if (tiempoAhora < amaneciendo) & (miFiltro.ultimoEstado != 'Filtro Desactivado'):
						miFiltro.quitarFiltroIR()
						

			# Draw frame number into image on top
			for infraction in miPoliciaReportando.listaVehiculos:
				
				for puntos in infraction['desplazamiento']:
					puntosExtraidos = puntos.ravel().reshape(puntos.ravel().shape[0]//2,2)
					miAcetatoInformativo.colocarObjeto(puntosExtraidos,infraction['estado'])
					#for punto in puntosExtraidos:
					#	if infraction['estado'] == 'Confirmado':
					#		miAcetatoInformativo.colocarPunto(tuple(punto),0)
					#	else:
					#		miAcetatoInformativo.colocarPunto(tuple(punto),1)

			#for puntoResguardo in miPoliciaReportando.obtenerLineasDeResguardo(False):
			miAcetatoInformativo.colocarObjeto(miPoliciaReportando.obtenerLineasDeResguardo(True),'Referencia')
			
			# Configs and displays for the MASK according to the semaforo
			#miAcetatoInformativo.agregarTextoEn("I{}".format(miPoliciaReportando.infraccionesConfirmadas), 2)
			
			miAcetatoInformativo.colorDeSemaforo(senalSemaforo)

			historial[frame_number] = {'captura':frameFlujo.copy()}
			frameFlujo = miAcetatoInformativo.aplicarAFrame(frameFlujo)
			
			if mostrarImagen:
				#cv2.imshow('Visual', miAcetatoInformativo.aplicarAFrame(frameFlujo)[120:239,60:360])
				cv2.imshow('Visual',frameFlujo)
			if generarArchivosDebug:
				historial[frame_number]['frame'] = frameFlujo.copy()
			else:
				historial[frame_number]['frame'] = historial[frame_number]['captura']
			historial[frame_number]['data'] = [velocidadEnBruto, velocidadFiltrada, pulsoVehiculos, momentumAEmplear]
			miAcetatoInformativo.inicializar()
			
			tiempoEjecucion = time.time() - tiempoAuxiliar
			if tiempoEjecucion>periodoDeMuestreo:
				miReporte.warning('\t[f{}'.format(frame_number)+']'+' Periodo Excedido {0:2f}'.format(tiempoEjecucion)+ '[s]')

			#sys.stdout.write("\033[F")
			while time.time() - tiempoAuxiliar < periodoDeMuestreo:
				True
			tiempoAuxiliar = time.time()

			porcentajeDeMemoria = psutil.virtual_memory()[2]
			
			
			if (porcentajeDeMemoria > 80)&(os.uname()[1] == 'raspberrypi'):
				miReporte.info('Estado de Memoria: '+str(porcentajeDeMemoria)+'/100')
			"""
			if porcentajeDeMemoria > 96:
				miReporte.warning('Alcanzado 96/100 de memoria, borrando todo e inicializando')
				del historial
				historial = {}
				frame_number = 0
			"""
			frame_number += 1
			if (frame_number >= topeEjecucion) &(topeEjecucion!=0):
				miReporte.info('ABANDONANDO LA EJECUCION DE PROGRAMA por indice de auto acabado predeterminado')
				miPoliciaReportando.apagarCamara()
				break
			if senalSemaforo == -2:
				miReporte.critical('ABANDONANDO LA EJECUCION DE PROGRAMA El semaforo ya no obtuvo señal, necesito recalibrar, abandonando la ejecución del programa')
				break
			ch = 0xFF & cv2.waitKey(5)
			if ch == ord('q'):
				miReporte.info('ABANDONANDO LA EJECUCION DE PROGRAMA por salida manual')
				miPoliciaReportando.apagarCamara()
				break
			if ch == ord('s'):
				cv2.imwrite(datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')+'.jpg',frameFlujo)
			
	except KeyboardInterrupt as e:
		miReporte.info('Salida forzada')
		miPoliciaReportando.apagarCamara()
Beispiel #2
0
def __main_function__():
    # Import some global varialbes
    global archivoDeVideo
    global cambiosImportantes
    global grabadoParalelo
    cambiosImportantes = False

    # Creamos el reporte inicial
    miReporte = MiReporte(
        levelLogging=logging.INFO, nombre=__name__
    )  # Se crea por defecto con nombre de la fecha y hora actual
    miReporte.info(
        'Programa iniciado exitosamente con ingreso de senal video ' +
        archivoDeVideo + entradaReal + ' con semaforo ' +
        semaforoSimuladoTexto + str(periodoDeSemaforo) + ', corriendo a ' +
        str(mifps) + ' Frames por Segundo')
    # Si no existe el directorio de reporte lo creo
    if not os.path.exists(directorioDeReporte):
        os.makedirs(directorioDeReporte)

    # Is statements
    if generarArchivosDebug:
        miReporte.info('Generando Archivos de Debug')
    else:
        miReporte.info('Generando infracciones unicamente (No debug video)')

    # If mostrar Imagenes
    if mostrarImagen:
        miReporte.info(
            'Pantalla de muestra de funcionamiento en tiempo real encendida')
    else:
        miReporte.info(
            'Pantalla de muestra de funcionamiento en tiempo real apagada')

    # El directorio de reporte debe crearse al inicio del programa
    # Variables de control:

    numeroDeFrame = 0
    maximoInfraccionesPorFrame = 20
    #colores = np.random.randint(0,100,(maximoInfraccionesPorFrame,3))

    # Cargando los parametros de instalacion:
    # El archivo de video debe tener como minimo 5 caracteres para estar trnajando en modo simulado, de lo contrario estamos trabajando en modo real
    if len(archivoDeVideo) > 4:
        archivoParametrosACargar = archivoDeVideo[:-4] + '.npy'
    else:
        archivoParametrosACargar = 'puntos.npy'

    parametrosInstalacion = np.load(folderDeInstalacion + '/' +
                                    archivoParametrosACargar)
    miReporte.info('Datos de Instalacion de: ' + folderDeInstalacion + '/' +
                   archivoParametrosACargar)
    poligonoSemaforo = parametrosInstalacion[0]
    verticesPartida = parametrosInstalacion[1]
    verticesLlegada = parametrosInstalacion[2]
    indicesSemaforo = obtenerIndicesSemaforo(np.array(poligonoSemaforo))
    angulo = parametrosInstalacion[3]
    poligonoEnAlta = parametrosInstalacion[4]

    miReporte.info('Cargado exitosamente parametros de instalacion: ' +
                   str(parametrosInstalacion))

    # Arrancando camara
    if len(archivoDeVideo) == 0:
        conVideoGrabado = False  # modo real
        miCamara = cv2.VideoCapture(1)
        miCamara.set(3, 640)
        miCamara.set(4, 480)
        time.sleep(1)
        miReporte.info('Activada Exitosamente cámara en tiempo real')
    else:
        conVideoGrabado = True
        try:
            miCamara = cv2.VideoCapture(directorioDeVideos + '/' +
                                        archivoDeVideo)
            time.sleep(1)
            miReporte.info('Archivo de video cargado exitosamente: ' +
                           directorioDeVideos + '/' + archivoDeVideo)
        except Exception as currentException:
            miReporte.error('No se pudo cargar el video por ' +
                            str(currentException))

    # Se captura la imagen de flujo inicial y se trabaja con la misma
    ret, frameVideo = miCamara.read()
    frameFlujo = cv2.resize(frameVideo, (320, 240))

    # Creación de objetos:
    miPoliciaReportando = PoliciaInfractor(frameFlujo, verticesPartida,
                                           verticesLlegada, False)
    miPoliciaReportando.establecerRegionInteresAlta(poligonoEnAlta)
    miGrabadora = GeneradorEvidencia(directorioDeReporte, mifps, False)
    miFiltro = IRSwitch()
    miAcetatoInformativo = Acetato()
    miSemaforo = CreateSemaforo(periodoDeSemaforo)
    miAcetatoInformativo.colocarPoligono(np.array(poligonoSemaforo) // 2)
    miAcetatoInformativo.colocarPoligono(np.array(verticesPartida))
    miAcetatoInformativo.colocarPoligono(np.array(verticesLlegada))

    informacionTotal = {}
    frame_number = 0
    tiempoAuxiliar = time.time()
    periodoDeMuestreo = 1.0 / mifps
    grupo = [0]
    frameAlta = np.empty((320, 240, 3))
    capturaEnAlta = False
    imagenesEnAlta = []

    while True:
        # LEEMOS LA CAMARA DE FLUJO
        if conVideoGrabado:
            for i in range(videofps // mifps):
                ret, frameVideo = miCamara.read()
        else:
            if capturaEnAlta:
                ret, frameAlta = miCamara.read()
                imagenesEnAlta.append([
                    miPoliciaReportando.ultimaCarpetaGuardado + '/imagen.jpg',
                    frameAlta
                ])
                frameVideo = cv2.resize(frameAlta, (320, 240))
                capturaEnAlta = False
                miCamara.set(3, 640)
                miCamara.set(4, 480)
            else:
                ret, frameVideo = miCamara.read()

        pixeles = np.array(
            [frameVideo[indicesSemaforo[0][1], indicesSemaforo[0][0]]])

        #print('IndicesPixel: ',indicesSemaforo[0][0],indicesSemaforo[0][1])
        #print('La longitud semaforo: ',len(indicesSemaforo),' inicial ',pixeles.shape)
        #print('La longitud interna: ',len(indicesSemaforo[0]),' inicial ',pixeles.shape)
        for indiceSemaforo in indicesSemaforo[1:]:
            pixeles = np.append(
                pixeles, [frameVideo[indiceSemaforo[1], indiceSemaforo[0]]],
                axis=0)
            #print('>>> ',pixeles.shape,' in ',indiceSemaforo)
            #cv2.circle(frameVideo, (indiceSemaforo[0],indiceSemaforo[1]), 1, (100,100,100), -1)
        #print('Pixeles: ',pixeles)
        #wtf = pixeles.reshape((24,8,3))
        #cv2.imshow('Semaforo', cv2.resize(wtf, (240,320)))
        #print('La longitud pixels: ',pixeles.shape)
        senalSemaforo, semaforoLiteral, flanco, periodo = miSemaforo.obtenerColorEnSemaforo(
            pixeles)
        frameFlujo = cv2.resize(frameVideo, (320, 240))

        if periodo != 0:
            miReporte.info('SEMAFORO EN VERDE, EL PERIODO ES ' + str(periodo))
        else:
            pass
        # Si tengo infracciones pendientes las evoluciono
        cambiosImportantes, ondaFiltrada, frenteAutomovil, flujoTotal = miPoliciaReportando.seguirImagen(
            frame_number, frameFlujo, colorSemaforo=senalSemaforo)
        if senalSemaforo >= 1:  # Si estamos en rojo, realizamos una accion
            if frenteAutomovil == 1:
                miCamara.set(3, 3280)
                miCamara.set(4, 2464)
                capturaEnAlta = True

            if flanco == 1:  # esto se inicia al principio de este estado
                miReporte.info('SEMAFORO EN ROJO')
                miPoliciaReportando.inicializarAgente()
                del informacionTotal
                informacionTotal = {}
                frame_number = 0
            else:
                pass
        else:
            pass

        if senalSemaforo == 0:  # Si estamos en verde realizamos otra accion
            if flanco == -1:  # Si estamos en verde y en flanco, primer verde, realizamos algo
                miReporte.info(
                    'Infracciones: ' +
                    str(miPoliciaReportando.numeroInfraccionesConfirmadas()))
                if generarArchivosDebug:
                    miGrabadora.generarReporteInfraccion(
                        informacionTotal, False,
                        miPoliciaReportando.numeroInfraccionesConfirmadas())
                miPoliciaReportando.purgeInfractions()
            if miPoliciaReportando.numeroInfraccionesConfirmadas() > 0:
                infraccionEnRevision = miPoliciaReportando.popInfraccion()
                miGrabadora.generarReporteInfraccion(informacionTotal,
                                                     infraccionEnRevision)
            if miPoliciaReportando.numeroInfraccionesConfirmadas == 0:
                for imagen in imagenesEnAlta:
                    print('>>>>> GUARDANDO COMO: ', imagen[0], ' shape ',
                          imagen[1].shape)
                    cv2.imwrite(imagen[0], imagen[1])
            else:
                #Si no hay infracciones a reportar me fijo el estado del filtro:
                tiempoAhora = datetime.datetime.now(
                ).hour * 60 + datetime.datetime.now().minute
                if (tiempoAhora > amaneciendo) & (miFiltro.ultimoEstado !=
                                                  'Filtro Activado'):
                    miFiltro.colocarFiltroIR()
                if (tiempoAhora < amaneciendo) & (miFiltro.ultimoEstado !=
                                                  'Filtro Desactivado'):
                    miFiltro.quitarFiltroIR()
            pass

        # Draw frame number into image on top
        for infraction in miPoliciaReportando.listaDeInfracciones:
            for puntos in infraction['desplazamiento']:
                puntosExtraidos = puntos.ravel().reshape(
                    puntos.ravel().shape[0] // 2, 2)
                for punto in puntosExtraidos:
                    if infraction['estado'] == 'Confirmado':
                        miAcetatoInformativo.colocarPunto(tuple(punto), 0)
                    else:
                        miAcetatoInformativo.colocarPunto(tuple(punto), 1)

        # Configs and displays for the MASK according to the semaforo
        #miAcetatoInformativo.agregarTextoEn("I{}".format(miPoliciaReportando.infraccionesConfirmadas), 2)

        miAcetatoInformativo.colorDeSemaforo(senalSemaforo)

        frameFlujo = miAcetatoInformativo.aplicarAFrame(frameFlujo)

        if mostrarImagen:
            #cv2.imshow('Visual', miAcetatoInformativo.aplicarAFrame(frameFlujo)[120:239,60:360])
            cv2.imshow('Visual', frameFlujo)

        informacionTotal[frame_number] = frameFlujo.copy()
        miAcetatoInformativo.inicializar()

        tiempoEjecucion = time.time() - tiempoAuxiliar
        if tiempoEjecucion > periodoDeMuestreo:
            miReporte.warning('Tiempo Afuera {0:2f}'.format(tiempoEjecucion) +
                              '[s] en frame {}'.format(frame_number))

        #sys.stdout.write("\033[F")
        while time.time() - tiempoAuxiliar < periodoDeMuestreo:
            True
        tiempoAuxiliar = time.time()

        if cambiosImportantes:
            miReporte.info(
                'F{} Sema: '.format(frame_number) + semaforoLiteral + ' I: ' +
                str(miPoliciaReportando.numeroInfraccionesConfirmadas()) +
                '/' + str(miPoliciaReportando.numeroInfraccionesTotales()))

        porcentajeDeMemoria = psutil.virtual_memory()[2]

        if (porcentajeDeMemoria > 80) & (os.uname()[1] == 'raspberrypi'):
            miReporte.info('Estado de Memoria: ' + str(porcentajeDeMemoria) +
                           '/100')

        if porcentajeDeMemoria > 96:
            miReporte.warning(
                'Alcanzado 96/100 de memoria, borrando todo e inicializando')
            del informacionTotal
            informacionTotal = {}
            frame_number = 0

        frame_number += 1
        if (frame_number >= topeEjecucion) & (topeEjecucion != 0):
            miReporte.info(
                'ABANDONANDO LA EJECUCION DE PROGRAMA por indice de auto acabado predeterminado'
            )
            break
        if senalSemaforo == -2:
            miReporte.critical(
                'ABANDONANDO LA EJECUCION DE PROGRAMA El semaforo ya no obtuvo señal, necesito recalibrar, abandonando la ejecución del programa'
            )
            break
        ch = 0xFF & cv2.waitKey(5)
        if ch == ord('q'):
            miReporte.info(
                'ABANDONANDO LA EJECUCION DE PROGRAMA por salida manual')
            break
        if ch == ord('s'):
            cv2.imwrite(
                datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') + '.jpg',
                frameFlujo)
Beispiel #3
0
def __main_function__():
    # Import some global varialbes
    global archivoDeVideo
    global cambiosImportantes
    cambiosImportantes = False
    global numeroDeObjetos
    numeroDeObjetos = 0

    # Creamos el reporte inicial
    miReporte = MiReporte(
        levelLogging=logging.INFO, nombre=__name__
    )  # Se crea por defecto con nombre de la fecha y hora actual
    miReporte.info(
        'Programa iniciado exitosamente con ingreso de senal video ' +
        archivoDeVideo + entradaReal + ' con semaforo ' +
        semaforoSimuladoTexto + str(periodoDeSemaforo) + ', corriendo a ' +
        str(mifps) + ' Frames por Segundo')
    # Si no existe el directorio de reporte lo creo
    if not os.path.exists(directorioDeReporte):
        os.makedirs(directorioDeReporte)

    # Is statements
    if generarArchivosDebug:
        miReporte.info('Generando Archivos de Debug')
    else:
        miReporte.info('Generando infracciones unicamente (No debug video)')

    # If mostrar Imagenes
    if mostrarImagen:
        miReporte.info(
            'Pantalla de muestra de funcionamiento en tiempo real encendida')
    else:
        miReporte.info(
            'Pantalla de muestra de funcionamiento en tiempo real apagada')

    # El directorio de reporte debe crearse al inicio del programa
    # Variables de control:

    numeroDeFrame = 0
    maximoInfraccionesPorFrame = 20
    #colores = np.random.randint(0,100,(maximoInfraccionesPorFrame,3))

    # Cargando los parametros de instalacion:
    # El archivo de video debe tener como minimo 5 caracteres para estar trnajando en modo simulado, de lo contrario estamos trabajando en modo real
    if len(archivoDeVideo) > 4:
        archivoParametrosACargar = archivoDeVideo[:-4] + '.npy'
    else:
        archivoParametrosACargar = 'datos.npy'

    parametrosInstalacion = np.load(folderDeInstalacion + '/' +
                                    archivoParametrosACargar)
    miReporte.info('Datos de Instalacion de: ' + folderDeInstalacion + '/' +
                   archivoParametrosACargar)
    poligonoSemaforo = parametrosInstalacion[0]
    verticesPartida = parametrosInstalacion[1]
    verticesLlegada = parametrosInstalacion[2]
    angulo = parametrosInstalacion[3]

    miReporte.info('Cargado exitosamente parametros de instalacion: ' +
                   str(parametrosInstalacion))

    # Arrancando camara
    if len(archivoDeVideo) == 0:  # modo real
        if os.uname()[1] == 'alvarohurtado-305V4A':
            miCamara = VideoStream(src=1,
                                   resolution=(640, 480),
                                   poligono=poligonoSemaforo,
                                   debug=saltarFrames,
                                   fps=mifps,
                                   periodo=periodoDeSemaforo,
                                   gamma=gamma).start()
            time.sleep(1)
        else:
            miCamara = VideoStream(src=0,
                                   resolution=(3296, 2512),
                                   poligono=poligonoSemaforo,
                                   debug=saltarFrames,
                                   fps=mifps,
                                   periodo=periodoDeSemaforo,
                                   gamma=gamma).start()
            #miCamara = VideoStream(src = 0, resolution = (1920,1080),poligono = poligonoSemaforo, debug = saltarFrames,fps = mifps, periodo = periodoDeSemaforo, gamma = gamma).start()
            #miCamara = VideoStream(src = 0, resolution = (1280,960),poligono = poligonoSemaforo, debug = saltarFrames,fps = mifps, periodo = periodoDeSemaforo, gamma = gamma).start()

            time.sleep(1)

        miReporte.info('Activada Exitosamente cámara en tiempo real')
    else:
        try:
            miCamara = VideoStream(src=directorioDeVideos + '/' +
                                   archivoDeVideo,
                                   resolution=(640, 480),
                                   poligono=poligonoSemaforo,
                                   debug=saltarFrames,
                                   fps=mifps,
                                   periodo=periodoDeSemaforo,
                                   gamma=gamma).start()
            time.sleep(1)
            miReporte.info('Archivo de video cargado exitosamente: ' +
                           directorioDeVideos + '/' + archivoDeVideo)
        except Exception as currentException:
            miReporte.error('No se pudo cargar el video por ' +
                            str(currentException))

    # Se captura la imagen de flujo inicial y se trabaja con la misma
    informacion = miCamara.read()

    # Creación de objetos:
    miPoliciaReportando = PoliciaInfractor(informacion['frame'],
                                           verticesPartida, verticesLlegada)
    miGrabadora = GeneradorEvidencia(directorioDeReporte, mifps,
                                     guardarRecortados)
    miFiltro = IRSwitch()
    miAcetatoInformativo = Acetato()
    miAcetatoInformativo.colocarPoligono(np.array(poligonoSemaforo) // 2)
    miAcetatoInformativo.colocarPoligono(np.array(verticesPartida))
    miAcetatoInformativo.colocarPoligono(np.array(verticesLlegada))

    fps = FPS().start()
    informacionTotal = {}
    frame_number = 0
    tiempoAuxiliar = time.time()
    periodoDeMuestreo = 1.0 / mifps
    grupo = [0]
    while True:
        # LEEMOS LA CAMARA DE FLUJO

        # Ways to access to the information

        # information['frame'] ; numpy array containing the low res frame
        # information['semaforo'] ; list like [self.senalColor, self.colorLiteral, self.flancoSemaforo, self.totalperiodo]
        # information['recortados'] ; list like of tuples  representing listaderecortados from hd frame [(_numpy arrays_)n+1]
        # information['rectangulos'] ; list like of tuples  representing listaderectangulos and centroids in frame [((x,y,h,w),(p1,p2))n+1]
        # n+1 ; represent the 1 by 1 correspndencia de los rectangulos encontrados y imagenes recortadas

        informacion = miCamara.read()  # Ways to access

        # Asign number rfame to the information from miCamara.read()
        #informacion['index'] = frame_number

        informacionTotal[frame_number] = informacion.copy(
        )  #<------ ese .copy() faltaba
        print('Out: ', informacion['semaforo'][2])
        # Si forzamos por entrada o si estamos en verde botamos la información de los rectangulos:

        if (guardarRecortados == False) | (
                informacionTotal[frame_number]['semaforo'][0] == 0):
            del informacionTotal[frame_number]['recortados']
            informacionTotal[frame_number]['recortados'] = {}
        # Se reporta el periodo del semaforo si es necesario:

        if informacion['semaforo'][3] != 0:
            miReporte.info('SEMAFORO EN VERDE, EL PERIODO ES ' +
                           str(informacion['semaforo'][3]))
        else:
            pass
        # Si tengo infracciones pendientes las evoluciono
        if informacion['semaforo'][
                0] >= 1:  # Si estamos en rojo, realizamos una accion
            if informacion['semaforo'][
                    2] == 1:  # esto se inicia al principio de este estado
                miReporte.info('SEMAFORO EN ROJO')
                miPoliciaReportando.inicializarAgente()
                del informacionTotal
                informacionTotal = {}
                frame_number = 0
            else:
                pass
            cambiosImportantes = miPoliciaReportando.seguirObjeto(
                frame_number, informacion)
        else:
            pass

        if informacion['semaforo'][
                0] == 0:  # Si estamos en verde realizamos otra accion
            if informacion['semaforo'][
                    2] == -1:  # Si estamos en verde y en flanco, primer verde, realizamos algo
                miReporte.info(
                    'Infracciones: ' +
                    str(miPoliciaReportando.numeroInfraccionesConfirmadas()))
                if generarArchivosDebug:
                    miGrabadora.generarReporteInfraccion(
                        informacionTotal, False,
                        miPoliciaReportando.numeroInfraccionesConfirmadas())
            if miPoliciaReportando.numeroInfraccionesConfirmadas() > 0:
                infraccionEnRevision = miPoliciaReportando.popInfraccion()
                miGrabadora.generarReporteInfraccion(informacionTotal,
                                                     infraccionEnRevision)
            else:
                #Si no hay infracciones a reportar me fijo el estado del filtro:
                tiempoAhora = datetime.datetime.now(
                ).hour * 60 + datetime.datetime.now().minute
                if (tiempoAhora > amaneciendo) & (miFiltro.ultimoEstado !=
                                                  'Filtro Activado'):
                    miFiltro.colocarFiltroIR()
                if (tiempoAhora < amaneciendo) & (miFiltro.ultimoEstado !=
                                                  'Filtro Desactivado'):
                    miFiltro.quitarFiltroIR()
            pass

        # Draw frame number into image on top
        for infraction in miPoliciaReportando.listaDeInfracciones:
            for puntos in infraction['desplazamiento']:
                puntosExtraidos = puntos.ravel().reshape(
                    puntos.ravel().shape[0] // 2, 2)
                for punto in puntosExtraidos:
                    if infraction['estado'] == 'Confirmado':
                        miAcetatoInformativo.colocarPunto(tuple(punto), 0)
                    else:
                        miAcetatoInformativo.colocarPunto(tuple(punto), 1)

        # Configs and displays for the MASK according to the semaforo
        #miAcetatoInformativo.agregarTextoEn("I{}".format(miPoliciaReportando.infraccionesConfirmadas), 2)

        miAcetatoInformativo.colorDeSemaforo(informacion['semaforo'][0])

        # Draw the rectangles
        for rectangulo in informacion['rectangulos']:
            miAcetatoInformativo.colocarObjetivo(rectangulo[0], rectangulo[2])

        if mostrarImagen:
            #cv2.imshow('Visual', miAcetatoInformativo.aplicarAFrame(informacion['frame'])[120:239,60:360])
            cv2.imshow(
                'Visual',
                miAcetatoInformativo.aplicarAFrame(informacion['frame']))
        miAcetatoInformativo.inicializar()

        tiempoEjecucion = time.time() - tiempoAuxiliar
        #if tiempoEjecucion>periodoDeMuestreo:
        miReporte.warning('Tiempo Afuera {0:2f}'.format(tiempoEjecucion) +
                          '[s] en frame {}'.format(frame_number))

        #sys.stdout.write("\033[F")
        while time.time() - tiempoAuxiliar < periodoDeMuestreo:
            True
        tiempoAuxiliar = time.time()

        if (cambiosImportantes) | (numeroDeObjetos != len(
                informacion['rectangulos'])):
            miReporte.info(
                'F{} Sema: '.format(frame_number) +
                informacion['semaforo'][1] + ' I: ' +
                str(miPoliciaReportando.numeroInfraccionesConfirmadas()) +
                '/' + str(miPoliciaReportando.numeroInfraccionesTotales()) +
                ' Objetos: {}'.format(len(informacion['rectangulos'])))
        numeroDeObjetos = len(informacion['rectangulos'])

        porcentajeDeMemoria = psutil.virtual_memory()[2]

        if porcentajeDeMemoria > 80:
            miReporte.info('Estado de Memoria: ' + str(porcentajeDeMemoria) +
                           '/100')
        if porcentajeDeMemoria > 92:
            frameAOptimizar = min(informacionTotal)
            miReporte.warning('Alcanzado 92/100 de memoria, borrando frame: ' +
                              str(frameAOptimizar))
            del informacionTotal[frameAOptimizar]['recortados']
            informacionTotal[frameAOptimizar]['recortados'] = {}

        if porcentajeDeMemoria > 96:
            miReporte.warning(
                'Alcanzado 96/100 de memoria, borrando todo e inicializando')
            del informacionTotal
            informacionTotal = {}
            frame_number = 0

        frame_number += 1
        if (frame_number >= topeEjecucion) & (topeEjecucion != 0):
            miReporte.info(
                'ABANDONANDO LA EJECUCION DE PROGRAMA por indice de auto acabado predeterminado'
            )
            break
        if informacion['semaforo'][0] == -2:
            miReporte.critical(
                'ABANDONANDO LA EJECUCION DE PROGRAMA El semaforo ya no obtuvo señal, necesito recalibrar, abandonando la ejecución del programa'
            )
            break
        ch = 0xFF & cv2.waitKey(5)
        if ch == ord('q'):
            miReporte.info(
                'ABANDONANDO LA EJECUCION DE PROGRAMA por salida manual')
            break
        if ch == ord('s'):
            cv2.imwrite(
                datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') + '.jpg',
                informacion['frame'])
        fps.update()

    # stop the timer and display FPS information
    fps.stop()
Beispiel #4
0
def __main_function__():
    # Import some global varialbes
    global archivoDeVideo
    global cambiosImportantes
    cambiosImportantes = False

    # Creamos el reporte inicial
    miReporte = MiReporte(
        levelLogging=logging.INFO, nombre=__name__
    )  # Se crea por defecto con nombre de la fecha y hora actual
    miReporte.info(
        'Programa iniciado exitosamente con ingreso de senal video ' +
        archivoDeVideo + entradaReal + ' con semaforo ' +
        semaforoSimuladoTexto + str(periodoDeSemaforo) + ', corriendo a ' +
        str(mifps) + ' Frames por Segundo')
    # Si no existe el directorio de reporte lo creo
    if not os.path.exists(directorioDeReporte):
        os.makedirs(directorioDeReporte)

    # Is statements
    if generarArchivosDebug:
        miReporte.info('Generando Archivos de Debug')
    else:
        miReporte.info('Generando infracciones unicamente (No debug video)')

    # If mostrar Imagenes
    if mostrarImagen:
        miReporte.info(
            'Pantalla de muestra de funcionamiento en tiempo real encendida')
    else:
        miReporte.info(
            'Pantalla de muestra de funcionamiento en tiempo real apagada')

    # El directorio de reporte debe crearse al inicio del programa
    # Variables de control:

    numeroDeFrame = 0
    maximoInfraccionesPorFrame = 20
    #colores = np.random.randint(0,100,(maximoInfraccionesPorFrame,3))

    # Cargando los parametros de instalacion:
    # El archivo de video debe tener como minimo 5 caracteres para estar trnajando en modo simulado, de lo contrario estamos trabajando en modo real
    if len(archivoDeVideo) > 4:
        archivoParametrosACargar = archivoDeVideo[:-4] + '.npy'
    else:
        archivoParametrosACargar = 'datos.npy'

    parametrosInstalacion = np.load(folderDeInstalacion + '/' +
                                    archivoParametrosACargar)
    miReporte.info('Datos de Instalacion de: ' + folderDeInstalacion + '/' +
                   archivoParametrosACargar)
    poligonoSemaforo = parametrosInstalacion[0]
    verticesPartida = parametrosInstalacion[1]
    verticesLlegada = parametrosInstalacion[2]
    angulo = parametrosInstalacion[3]
    indicesSemaforo = SemaphoroParameters(poligonoSemaforo)

    miReporte.info('Cargado exitosamente parametros de instalacion: ' +
                   str(parametrosInstalacion))

    # Arrancando camara
    if len(archivoDeVideo) == 0:
        conVideoGrabado = False  # modo real
        if os.uname()[1] == 'alvarohurtado-305V4A':
            miCamara = cv2.VideoCapture(1)
            time.sleep(1)
        elif os.uname()[1] == 'stanlee321-HP-240-G1-Notebook-PC':
            miCamara = cv2.VideoCapture(0)
            miCamara.set(cv2.CAP_PROP_FRAME_WIDTH, mediumRes[0])
            miCamara.set(cv2.CAP_PROP_FRAME_HEIGHT, mediumRes[1])
            time.sleep(1)
        else:
            miCamara = cv2.VideoCapture(1)
            miCamara.set(cv2.CAP_PROP_FRAME_WIDTH, mediumRes[0])
            miCamara.set(cv2.CAP_PROP_FRAME_HEIGHT, mediumRes[1])
            #miCamara = VideoStream(src = 0, resolution = (1920,1080),poligono = poligonoSemaforo, debug = saltarFrames,fps = mifps, periodo = periodoDeSemaforo, gamma = gamma).start()
            #miCamara = VideoStream(src = 0, resolution = (1280,960),poligono = poligonoSemaforo, debug = saltarFrames,fps = mifps, periodo = periodoDeSemaforo, gamma = gamma).start()
            time.sleep(1)

        miReporte.info('Activada Exitosamente cámara en tiempo real')
    else:
        conVideoGrabado = True
        try:
            miCamara = cv2.VideoCapture(directorioDeVideos + '/' +
                                        archivoDeVideo)
            miCamara.set(cv2.CAP_PROP_FRAME_WIDTH, mediumRes[0])
            miCamara.set(cv2.CAP_PROP_FRAME_HEIGHT, mediumRes[1])

            time.sleep(1)
            miReporte.info('Archivo de video cargado exitosamente: ' +
                           directorioDeVideos + '/' + archivoDeVideo)
        except Exception as currentException:
            miReporte.error('No se pudo cargar el video por ' +
                            str(currentException))

    # Load points for the semaphoro
    # Se captura la imagen de flujo inicial y se trabaja con la misma
    ret, frameVideo = miCamara.read()
    frameFlujo = cv2.resize(frameVideo, (320, 240))
    # Creación de objetos:
    miPoliciaReportando = PoliciaInfractor(frameFlujo, verticesPartida,
                                           verticesLlegada)
    miGrabadora = GeneradorEvidencia(directorioDeReporte, mifps,
                                     guardarRecortados)
    miFiltro = IRSwitch()
    miAcetatoInformativo = Acetato()
    miSemaforo = CreateSemaforo(periodoDeSemaforo)
    miAcetatoInformativo.colocarPoligono(np.array(poligonoSemaforo) // 2)
    miAcetatoInformativo.colocarPoligono(np.array(verticesPartida))
    miAcetatoInformativo.colocarPoligono(np.array(verticesLlegada))

    fps = FPS().start()
    informacionTotal = {}
    frame_number = 0
    tiempoAuxiliar = time.time()
    periodoDeMuestreo = 1.0 / mifps
    grupo = [0]
    while True:

        # LEEMOS LA CAMARA DE FLUJO
        if conVideoGrabado:
            for i in range(videofps // mifps):
                ret, frameVideo = miCamara.read()
        else:
            ret, frameVideo = miCamara.read()
        frameFlujo = cv2.resize(frameVideo, (320, 240),
                                interpolation=cv2.INTER_NEAREST)
        tic = time.time()
        informacionTotal[frame_number] = frameFlujo.copy()
        pixeles = indicesSemaforo(frameVideo)
        print('La longitud pixels: ', pixeles.shape)
        senalSemaforo, semaforoLiteral, flanco, periodo = miSemaforo.obtenerColorEnSemaforo(
            pixeles)
        tac = time.time()

        print('tic-tac', tac - tic)

        if periodo != 0:
            miReporte.info('SEMAFORO EN VERDE, EL PERIODO ES ' + str(periodo))
        else:
            pass
        # Si tengo infracciones pendientes las evoluciono
        if senalSemaforo >= 1:  # Si estamos en rojo, realizamos una accion
            if flanco == 1:  # esto se inicia al principio de este estado
                miReporte.info('SEMAFORO EN ROJO')
                miPoliciaReportando.inicializarAgente()
                del informacionTotal
                informacionTotal = {}
                frame_number = 0
            else:
                pass
            cambiosImportantes, ondaFiltrada, flanco, flujoTotal = miPoliciaReportando.seguirImagen(
                frame_number, frameFlujo)
        else:
            pass

        if senalSemaforo == 0:  # Si estamos en verde realizamos otra accion
            if flanco == -1:  # Si estamos en verde y en flanco, primer verde, realizamos algo
                miReporte.info(
                    'Infracciones: ' +
                    str(miPoliciaReportando.numeroInfraccionesConfirmadas()))
                if generarArchivosDebug:
                    miGrabadora.generarReporteInfraccion(
                        informacionTotal, False,
                        miPoliciaReportando.numeroInfraccionesConfirmadas())
            if miPoliciaReportando.numeroInfraccionesConfirmadas() > 0:
                infraccionEnRevision = miPoliciaReportando.popInfraccion()
                miGrabadora.generarReporteInfraccion(informacionTotal,
                                                     infraccionEnRevision)
            else:
                #Si no hay infracciones a reportar me fijo el estado del filtro:
                tiempoAhora = datetime.datetime.now(
                ).hour * 60 + datetime.datetime.now().minute
                if (tiempoAhora > amaneciendo) & (miFiltro.ultimoEstado !=
                                                  'Filtro Activado'):
                    miFiltro.colocarFiltroIR()
                if (tiempoAhora < amaneciendo) & (miFiltro.ultimoEstado !=
                                                  'Filtro Desactivado'):
                    miFiltro.quitarFiltroIR()
            pass

        # Draw frame number into image on top
        for infraction in miPoliciaReportando.listaDeInfracciones:
            for puntos in infraction['desplazamiento']:
                puntosExtraidos = puntos.ravel().reshape(
                    puntos.ravel().shape[0] // 2, 2)
                for punto in puntosExtraidos:
                    if infraction['estado'] == 'Confirmado':
                        miAcetatoInformativo.colocarPunto(tuple(punto), 0)
                    else:
                        miAcetatoInformativo.colocarPunto(tuple(punto), 1)

        # Configs and displays for the MASK according to the semaforo
        #miAcetatoInformativo.agregarTextoEn("I{}".format(miPoliciaReportando.infraccionesConfirmadas), 2)

        miAcetatoInformativo.colorDeSemaforo(senalSemaforo)

        if mostrarImagen:
            #cv2.imshow('Visual', miAcetatoInformativo.aplicarAFrame(frameFlujo)[120:239,60:360])
            cv2.imshow('Visual',
                       miAcetatoInformativo.aplicarAFrame(frameFlujo))
        miAcetatoInformativo.inicializar()

        tiempoEjecucion = time.time() - tiempoAuxiliar
        if tiempoEjecucion > periodoDeMuestreo:
            miReporte.warning('Tiempo Afuera {0:2f}'.format(tiempoEjecucion) +
                              '[s] en frame {}'.format(frame_number))

        #sys.stdout.write("\033[F")
        while time.time() - tiempoAuxiliar < periodoDeMuestreo:
            True
        tiempoAuxiliar = time.time()

        if cambiosImportantes:
            miReporte.info(
                'F{} Sema: '.format(frame_number) + semaforoLiteral + ' I: ' +
                str(miPoliciaReportando.numeroInfraccionesConfirmadas()) +
                '/' + str(miPoliciaReportando.numeroInfraccionesTotales()))

        porcentajeDeMemoria = psutil.virtual_memory()[2]

        if (porcentajeDeMemoria > 80) & (os.uname()[1] == 'raspberrypi'):
            miReporte.info('Estado de Memoria: ' + str(porcentajeDeMemoria) +
                           '/100')
        if porcentajeDeMemoria > 92:
            frameAOptimizar = min(informacionTotal)
            miReporte.warning('Alcanzado 92/100 de memoria, borrando frame: ' +
                              str(frameAOptimizar))
            del informacionTotal[frameAOptimizar]['recortados']
            informacionTotal[frameAOptimizar]['recortados'] = {}

        if porcentajeDeMemoria > 96:
            miReporte.warning(
                'Alcanzado 96/100 de memoria, borrando todo e inicializando')
            del informacionTotal
            informacionTotal = {}
            frame_number = 0

        frame_number += 1
        if (frame_number >= topeEjecucion) & (topeEjecucion != 0):
            miReporte.info(
                'ABANDONANDO LA EJECUCION DE PROGRAMA por indice de auto acabado predeterminado'
            )
            break
        if senalSemaforo == -2:
            miReporte.critical(
                'ABANDONANDO LA EJECUCION DE PROGRAMA El semaforo ya no obtuvo señal, necesito recalibrar, abandonando la ejecución del programa'
            )
            break
        ch = 0xFF & cv2.waitKey(5)
        if ch == ord('q'):
            miReporte.info(
                'ABANDONANDO LA EJECUCION DE PROGRAMA por salida manual')
            break
        if ch == ord('s'):
            cv2.imwrite(
                datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S') + '.jpg',
                frameFlujo)
        fps.update()

    # stop the timer and display FPS information
    fps.stop()