class ImagenTratada():
	
	def __init__(self ):
		self.camara = Camera()
		self.archivoAjustesPorDefecto = '/home/cubie/Guhorus/Brazo mas Vision/GUI-para-el-control-visual-de-brazo-robotico/imagen/MisAjustes/ajustesBuenos.json'
		self.cargaAjustes()
		self.rutaImagenOriginal = 'imagen/imagenesGuardadas/ImagenOriginal.jpg'
		self.rutaImagenReducida = 'imagen/imagenesGuardadas/imagenReducida.jpg'
		self.rutaImagenBlobs = 'imagen/imagenesGuardadas/imagenBlobs.jpg'
		self.rutaImagenTratada_Fase1 = 'imagen/imagenesGuardadas/imagenTratada_fase1.jpg'
		self.rutaImagenTratada_Fase2 = 'imagen/imagenesGuardadas/imagenTratada_fase2.jpg'
		self.angulosHuesos = []		
		self.articulaciones = []
		self.blobsFiltradosPorForma = []
		self.todosLosCandidatos = []	 
		self.AreaBlobs = []
 		self.numBlobsCandidatosPorArea = 0
 		self.enDepuracion = False
 		self.listaAngulos = []
 		
 	def cargaAjustes(self, archivo='/home/cubie/Guhorus/Brazo mas Vision/GUI-para-el-control-visual-de-brazo-robotico/imagen/MisAjustes/ajustesBuenos.json'):	
		self.ajustes = Ajustes()
		self.ajustes.cargaAjustes(archivo)
		
	def capturaImagen(self):
		img = self.camara.getImage()
		img.save(self.rutaImagenOriginal)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  
		imgReducida = img.resize(320, 240)
		imgReducida.save(self.rutaImagenReducida)
		return imgReducida

	def trataImagen(self):
		
		img = Image(self.rutaImagenReducida)
		result = img.colorDistance((self.ajustes.r, self.ajustes.g, self.ajustes.b))
		result.save(self.rutaImagenTratada_Fase1) 
		result = result.invert()
		result = result.binarize(float(self.ajustes.umbralBinarizado)).invert()
		result.save(self.rutaImagenTratada_Fase2) 
		
		#self.depuracion()
				
	def capturaYTrataLaImagen(self):
		img = self.capturaImagen()
		self.trataImagen()
		return Image(self.rutaImagenTratada_Fase1)
		
	def capturaTrataYFiltraBlobsDeImagen(self):
		img = self.capturaImagen()
		self.trataImagen()
		self.encuentraYFiltraBlobs()
		return (Image(self.rutaImagenBlobs), self.listaAngulos)
	
		
	def encuentraYFiltraBlobs(self, tipoDibujo = 'estructura'):
		
		imagenBlobs = Image(self.rutaImagenTratada_Fase2).copy()
		blobs = imagenBlobs.findBlobs()
		self.todosLosCandidatos = blobs
		
		if blobs != []:	
			
			blobs.image = imagenBlobs
			
			self.areaBlobs = blobs.area()
			blobs = self.filtroPorArea(blobs)
			self.numBlobsCandidatosPorArea = len(blobs)
			
			# Busca los blobs de forma circular , los blobs que pasan el filtro
			# se guardan en la lista self.articulaciones
			blobs = self.filtroPorForma(blobs)
			
			if tipoDibujo == 'blobs':
				self.dibujaBlobs(blobs)
			elif tipoDibujo == 'estructura':
				self.listaAngulos = self.encuentraYDibujaAngulos(imagenBlobs)
				
			# La imagen tratada tiene que ser guardada porque sino no funciona
			# la integracion con Tkinter
			imagenBlobs.save(self.rutaImagenBlobs)
			return Image(self.rutaImagenBlobs)
				
		
	def filtroPorArea(self, blobs):
		return blobs.filter((blobs.area()> self.ajustes.areaMin) & (blobs.area()< self.ajustes.areaMax))
		
	def filtroPorForma(self, blobs ):
		""" Busca los blobs de forma circular , los blobs que pasan el filtro
		se guardan en la lista self.articulaciones"""
		
		numero_Iteraciones = 2 
		
		self.articulaciones = []
                self.todosLosCandidatos = []
                self.blobsFiltradosPorForma = []
		for blob in blobs:
			candidato = blob.blobMask()
			hayCirculo, errorCode = aux.esCirculo(candidato, self.ajustes.toleranciaWH,
												  self.ajustes.toleranciaLP, 
												  self.ajustes.desviacionD, 
												  numero_Iteraciones)
                        self.todosLosCandidatos.append(blob)
			if not hayCirculo and self.enDepuracion :
				print errorCode
			if hayCirculo:
				self.articulaciones.append((blob.x, blob.y))
                self.blobsFiltradosPorForma.append(blob)
                
	def dibujaBlobs(self, blobs):
		if self.todosLosCandidatos:
				for blob in self.todosLosCandidatos:
						blob.draw(width=2, color=Color.YELLOW)
			
	def encuentraYDibujaAngulos(self, img):
		""" Ademas de dibujar la estructura de los huesos del brazo
		devuelve los angulos de dichos huesos con la horizontal """
		
		# Pinto ejes de coordenadas
		img.dl().line((20, img.height - 20), (20, img.height - 60), Color.RED, width=5)
		img.dl().line((20, img.height - 20), (60, img.height - 20), Color.RED, width=5)
		textLayer = DrawingLayer((img.width, img.height))
		textLayer.setFontSize(20)
		textLayer.text("90 grados", (20, img.height - 80), Color.RED)
		textLayer.text("0 grados", (70, img.height - 20), Color.RED)
		img.addDrawingLayer(textLayer)
				 
		angulosHuesos = []
		if self.articulaciones != []:
			self.articulaciones = aux.ordenaListaPorDistanciaApunto(self.articulaciones, [0,480])
			puntoInicial = self.articulaciones.pop()
			img.dl().circle(puntoInicial, 10, Color.BLUE, width=5)
			numAngulo = 1
			while self.articulaciones != []:
				p = self.articulaciones.pop()
				img.dl().line(puntoInicial, p, Color.BLUE, width=5)
				img.dl().circle(p, 10, Color.BLUE, width=5)
				textLayer = DrawingLayer((img.width, img.height))
				textLayer.setFontSize(24)
				textLayer.text(str(numAngulo), (p[0] , p[1] ), Color.RED)
				img.addDrawingLayer(textLayer)
				numAngulo += 1
				img.applyLayers()
				angulosHuesos.append(aux.anguloLineaEntreDosPuntos(p, puntoInicial))
				puntoInicial = p
				
		if len(angulosHuesos) == 3:
			return angulosHuesos
		else:
			return []
				
		
	def depuracion(self):
		self.enDepuracion = True
		print " ---------------------"
		print "Areas: "
		print self.AreaBlobs  
		print "Numero de blobs candidatos por area: "
		print self.numBlobsCandidatosPorArea
		print "Tiempo de tratamiento de imagen: "
 		print self.tiempoTratamiento 
 		print "Numero Articulaciones detectadas: "
 		print len(self.articulaciones) 
		print " ---------------------"
		time.sleep(1)
Beispiel #2
0
class ImagenTratada():
    def __init__(self):
        self.camara = Camera()
        self.archivoAjustesPorDefecto = '/home/cubie/Guhorus/Brazo mas Vision/GUI-para-el-control-visual-de-brazo-robotico/imagen/MisAjustes/ajustesBuenos.json'
        self.cargaAjustes()
        self.rutaImagenOriginal = 'imagen/imagenesGuardadas/ImagenOriginal.jpg'
        self.rutaImagenReducida = 'imagen/imagenesGuardadas/imagenReducida.jpg'
        self.rutaImagenBlobs = 'imagen/imagenesGuardadas/imagenBlobs.jpg'
        self.rutaImagenTratada_Fase1 = 'imagen/imagenesGuardadas/imagenTratada_fase1.jpg'
        self.rutaImagenTratada_Fase2 = 'imagen/imagenesGuardadas/imagenTratada_fase2.jpg'
        self.angulosHuesos = []
        self.articulaciones = []
        self.blobsFiltradosPorForma = []
        self.todosLosCandidatos = []
        self.AreaBlobs = []
        self.numBlobsCandidatosPorArea = 0
        self.enDepuracion = False
        self.listaAngulos = []

    def cargaAjustes(
        self,
        archivo='/home/cubie/Guhorus/Brazo mas Vision/GUI-para-el-control-visual-de-brazo-robotico/imagen/MisAjustes/ajustesBuenos.json'
    ):
        self.ajustes = Ajustes()
        self.ajustes.cargaAjustes(archivo)

    def capturaImagen(self):
        img = self.camara.getImage()
        img.save(self.rutaImagenOriginal)
        imgReducida = img.resize(320, 240)
        imgReducida.save(self.rutaImagenReducida)
        return imgReducida

    def trataImagen(self):

        img = Image(self.rutaImagenReducida)
        result = img.colorDistance(
            (self.ajustes.r, self.ajustes.g, self.ajustes.b))
        result.save(self.rutaImagenTratada_Fase1)
        result = result.invert()
        result = result.binarize(float(self.ajustes.umbralBinarizado)).invert()
        result.save(self.rutaImagenTratada_Fase2)

        #self.depuracion()

    def capturaYTrataLaImagen(self):
        img = self.capturaImagen()
        self.trataImagen()
        return Image(self.rutaImagenTratada_Fase1)

    def capturaTrataYFiltraBlobsDeImagen(self):
        img = self.capturaImagen()
        self.trataImagen()
        self.encuentraYFiltraBlobs()
        return (Image(self.rutaImagenBlobs), self.listaAngulos)

    def encuentraYFiltraBlobs(self, tipoDibujo='estructura'):

        imagenBlobs = Image(self.rutaImagenTratada_Fase2).copy()
        blobs = imagenBlobs.findBlobs()
        self.todosLosCandidatos = blobs

        if blobs != []:

            blobs.image = imagenBlobs

            self.areaBlobs = blobs.area()
            blobs = self.filtroPorArea(blobs)
            self.numBlobsCandidatosPorArea = len(blobs)

            # Busca los blobs de forma circular , los blobs que pasan el filtro
            # se guardan en la lista self.articulaciones
            blobs = self.filtroPorForma(blobs)

            if tipoDibujo == 'blobs':
                self.dibujaBlobs(blobs)
            elif tipoDibujo == 'estructura':
                self.listaAngulos = self.encuentraYDibujaAngulos(imagenBlobs)

            # La imagen tratada tiene que ser guardada porque sino no funciona
            # la integracion con Tkinter
            imagenBlobs.save(self.rutaImagenBlobs)
            return Image(self.rutaImagenBlobs)

    def filtroPorArea(self, blobs):
        return blobs.filter((blobs.area() > self.ajustes.areaMin)
                            & (blobs.area() < self.ajustes.areaMax))

    def filtroPorForma(self, blobs):
        """ Busca los blobs de forma circular , los blobs que pasan el filtro
		se guardan en la lista self.articulaciones"""

        numero_Iteraciones = 2

        self.articulaciones = []
        self.todosLosCandidatos = []
        self.blobsFiltradosPorForma = []
        for blob in blobs:
            candidato = blob.blobMask()
            hayCirculo, errorCode = aux.esCirculo(candidato,
                                                  self.ajustes.toleranciaWH,
                                                  self.ajustes.toleranciaLP,
                                                  self.ajustes.desviacionD,
                                                  numero_Iteraciones)
            self.todosLosCandidatos.append(blob)
            if not hayCirculo and self.enDepuracion:
                print errorCode
            if hayCirculo:
                self.articulaciones.append((blob.x, blob.y))
        self.blobsFiltradosPorForma.append(blob)

    def dibujaBlobs(self, blobs):
        if self.todosLosCandidatos:
            for blob in self.todosLosCandidatos:
                blob.draw(width=2, color=Color.YELLOW)

    def encuentraYDibujaAngulos(self, img):
        """ Ademas de dibujar la estructura de los huesos del brazo
		devuelve los angulos de dichos huesos con la horizontal """

        # Pinto ejes de coordenadas
        img.dl().line((20, img.height - 20), (20, img.height - 60),
                      Color.RED,
                      width=5)
        img.dl().line((20, img.height - 20), (60, img.height - 20),
                      Color.RED,
                      width=5)
        textLayer = DrawingLayer((img.width, img.height))
        textLayer.setFontSize(20)
        textLayer.text("90 grados", (20, img.height - 80), Color.RED)
        textLayer.text("0 grados", (70, img.height - 20), Color.RED)
        img.addDrawingLayer(textLayer)

        angulosHuesos = []
        if self.articulaciones != []:
            self.articulaciones = aux.ordenaListaPorDistanciaApunto(
                self.articulaciones, [0, 480])
            puntoInicial = self.articulaciones.pop()
            img.dl().circle(puntoInicial, 10, Color.BLUE, width=5)
            numAngulo = 1
            while self.articulaciones != []:
                p = self.articulaciones.pop()
                img.dl().line(puntoInicial, p, Color.BLUE, width=5)
                img.dl().circle(p, 10, Color.BLUE, width=5)
                textLayer = DrawingLayer((img.width, img.height))
                textLayer.setFontSize(24)
                textLayer.text(str(numAngulo), (p[0], p[1]), Color.RED)
                img.addDrawingLayer(textLayer)
                numAngulo += 1
                img.applyLayers()
                angulosHuesos.append(
                    aux.anguloLineaEntreDosPuntos(p, puntoInicial))
                puntoInicial = p

        if len(angulosHuesos) == 3:
            return angulosHuesos
        else:
            return []

    def depuracion(self):
        self.enDepuracion = True
        print " ---------------------"
        print "Areas: "
        print self.AreaBlobs
        print "Numero de blobs candidatos por area: "
        print self.numBlobsCandidatosPorArea
        print "Tiempo de tratamiento de imagen: "
        print self.tiempoTratamiento
        print "Numero Articulaciones detectadas: "
        print len(self.articulaciones)
        print " ---------------------"
        time.sleep(1)
 	def cargaAjustes(self, archivo='/home/cubie/Guhorus/Brazo mas Vision/GUI-para-el-control-visual-de-brazo-robotico/imagen/MisAjustes/ajustesBuenos.json'):	
		self.ajustes = Ajustes()
		self.ajustes.cargaAjustes(archivo)
Beispiel #4
0
 def cargaAjustes(
     self,
     archivo='/home/cubie/Guhorus/Brazo mas Vision/GUI-para-el-control-visual-de-brazo-robotico/imagen/MisAjustes/ajustesBuenos.json'
 ):
     self.ajustes = Ajustes()
     self.ajustes.cargaAjustes(archivo)