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)
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)
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)