5. | Métodos de sensorización
5.6 Detección de blobs
Introducción
Robobo permite detectar blobs de distintos colores. Un blob es un área de la imagen con el mismo color uniforme, y su detección implica un procesado interno de la imagen obtenida.
Elementos de programación
5.6.1 Clase Blob
Representa un blob detectado por Robobo. Los ejes de referencia que se utilizan son los siguientes:
Atributos:
• color (string): El color del blob detectado.
• posx (int): Representa la localización de la pelota en el eje X respecto al robot. Los valores están en el rango de 0 a 100. Ver imagen anterior.
• posy (int): Representa la posición de la pelota en el eje Y respecto al robot, es decir, lo cerca o lejos que se encuentra del mismo. Los valores están en el rango de 0 a 100. Ver imagen anterior.
• size (int): El área del blob medida en píxeles. Cuanto mayor es el valor, más cerca se encuentra el robot del blob detectado.
• frame_timestamp (long): La hora a la que el frame se comenzó a procesar.
• status_timestamp (long): La hora a la que se envió el estado.
5.6.2 Enumerado BlobColor
Representa la lista de colores que Robobo puede detectar.
RED: Rojo.
BLUE: Azul.
GREEN: Verde.
CUSTOM: Personalizado.
5.6.3 Método readColorBlob
| readColorBlob(color) |
|
Lee el último blob del color indicado detectado. Parámetros: • color ( BlobColor): El color del blob. Ver Enumerado BlobColor.Devuelve: • El blob ( Blob). Ver Clase Blob.
|
Ejemplo de Uso
El siguiente programa hace que Robobo diga si ve un objeto de color verde y dónde lo ve, de forma natural para el usuario, es decir, hablando.
Si el robot no ve el objeto, dice que no lo ve, y si lo ve, comprueba la posición en la que lo encuentra respecto al robot y lo comunica. Para comprobar si ve o no el objeto, usa el atributo size, y para comprobar la posición utiliza la coordenada x del objeto verde detectado en la imagen.
El pequeño movimiento que se realiza antes de comprobar si el robot detecta el objeto se debe a que los sensores solo devuelven valores cuando se produce un cambio.
from robobopy.Robobo import Robobo
from robobopy.utils.BlobColor import BlobColor
rob = Robobo("localhost")
rob.connect()
rob.moveWheelsByTime(2,2,1)
if rob.readColorBlob(BlobColor.GREEN).size > 0:
if 0 <= rob.readColorBlob(BlobColor.GREEN).posx < 45:
rob.sayText('Verde a la izquierda')
elif 45 <= rob.readColorBlob(BlobColor.GREEN).posx <= 55:
rob.sayText('Verde en el medio')
elif 55 < rob.readColorBlob(BlobColor.GREEN).posx < 100:
rob.sayText('Verde a la derecha')
else:
rob.sayText('No veo verde')5.6.4 Método setActiveBlobs
| setActiveBlobs(red, green, blue, custom) |
|
Habilita o deshabilita el seguimiento individual de cada color. Por defecto, el seguimiento del color verde está habilitado y los demás deshabilitados. Parámetros: • red ( bool): Si es True, habilita el seguimiento del color rojo.• green ( bool): Si es True, habilita el seguimiento del color verde.• blue ( bool): Si es True, habilita el seguimiento del color azul.• custom ( bool): Si es True, habilita el seguimiento del color personalizable.Advertencia: El seguimiento de color es una tarea computacionalmente intensiva; habilitar todos los colores a la vez puede afectar al rendimiento. El uso del color custom en el robot real requiere la calibración de la cámara, tal y como se explica aquí: https://github.com/mintforpeople/robobo-programming/wiki/camera-calibration-tutorial_es |
Ejemplo de Uso
El siguiente programa configura la detección de todos los colores. A continuación, hace que Robobo gire sobre sí mismo, diga el nombre del color que detecta y encienda los LEDs en ese color (en el caso del color personalizado, se encienden en amarillo). Inicialmente, los LEDs de la base se apagan:
from robobopy.Robobo import Robobo
from robobopy.utils.BlobColor import BlobColor
from robobopy.utils.Color import Color
from robobopy.utils.LED import LED
rob = Robobo("localhost")
rob.connect()
rob.setActiveBlobs(True, True, True, True)
rob.setLedColorTo(LED.All, Color.OFF)
rob.moveWheels(10,-10)
while True:
if rob.readColorBlob(BlobColor.RED).size > 0:
rob.setLedColorTo(LED.All, Color.RED)
rob.sayText('Veo rojo')
elif rob.readColorBlob(BlobColor.BLUE).size > 0:
rob.setLedColorTo(LED.All, Color.BLUE)
rob.sayText('Veo azul')
elif rob.readColorBlob(BlobColor.GREEN).size > 0:
rob.setLedColorTo(LED.All, Color.GREEN)
rob.sayText('Veo verde')
elif rob.readColorBlob(BlobColor.CUSTOM).size > 0:
rob.setLedColorTo(LED.All, Color.YELLOW)
rob.sayText('Veo color personalizado')
else:
rob.setLedColorTo(Color.OFF)
rob.wait(0.5)5.6.5 Método readAllColorBlobs()
| readAllColorBlobs() |
|
Lee los datos de todos los blobs de colores.
Devuelve: |
Ejemplo de Uso
En este ejemplo, se leen los datos de todos los blobs detectados (diccionario) y se muestra por pantalla la información de cada color: nombre del color, posición X e Y y su área.
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
rob.wait(1)
blobs = rob.readAllColorBlobs()
for key in blobs:
blob = blobs[key]
print(blob.color)
print(blob.posx)
print(blob.posy)
print(blob.size)5.6.6 Método resetColorBlobs
| resetColorBlobs() |
| Reinicia el detector de colores. Esto pone a 0 los atributos de los últimos blobs detectados, pero mantiene iguales los colores habilitados y deshabilitados. |
Ejemplo de Uso
En el siguiente programa se reinician los valores leídos de color y se le indica al usuario en voz alta dicha acción.
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
rob.resetColorBlobs()
rob.sayText('Los valores de los colores han sido reiniciados')5.6.7 Método whenANewColorBlobIsDetected
| whenANewColorBlobIsDetected(callback) |
|
Establece la función callback que se llama cuando se detecta un nuevo blob. Parámetros: • callback ( fun): La función callback que será llamada.
|
Ejemplo de Uso
El siguiente programa hace que Robobo diga de forma continuada el color que detecta, asumiendo que están activados verde, rojo y azul:
from robobopy.Robobo import Robobo
from robobopy.utils.Color import *
def color_detected():
print(rob.readColorBlob(Color.BLUE).size)
if rob.readColorBlob(Color.GREEN).size != 0:
rob.sayText('Estoy viendo verde')
else:
if rob.readColorBlob(Color.RED).size != 0:
rob.sayText('Estoy viendo rojo')
else:
rob.sayText('Estoy viendo azul')
rob = Robobo("localhost")
rob.connect()
rob.setActiveBlobs(True, True, True, False)
rob.whenANewColorBlobIsDetected(color_detected)
# el programa se mantiene en ejecución continua
while True:
rob.wait(0.1)5.6.8 Método setAdvancedLostBlobParameters
| setAdvancedLostBlobParameters(frames=5, minarea=1000, max_count=1, epsilon=0) |
|
Configura los parámetros avanzados para el seguimiento de blobs. Parámetros: • frames ( int): Número de fotogramas transcurridos durante los que no se ha detectado el blob para considerarlo perdido.• minarea ( int): Área mínima para considerar a un blob como un blob.• max_count ( int): Parámetro max_count del termcriteria.• epsilon ( int): Parámetro epsilon del termcriteria.Advertencia: Solo utiliza esta función si sabes lo que estás haciendo. Una mala configuración podría traer consecuencias inesperadas. |
Ejemplo de Uso
En este ejemplo, se varían varios hiperparámetros que definen cuándo se considera que se ha perdido un color. Entre ellos, se aumenta el número de fotogramas de 5 a 10 y el área mínima para considerar que un blob es un blob se reduce a la mitad (500).
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
rob.setAdvancedLostBlobParameters(frames= 10, minarea= 500)5. | Métodos de sensorización
5.6 Detección de blobs
Introducción
Robobo permite detectar blobs de distintos colores. Un blob es un área de la imagen con el mismo color uniforme, y su detección implica un procesado interno de la imagen obtenida.
Elementos de programación
5.6.1 Clase Blob
Representa un blob detectado por Robobo. Los ejes de referencia que se utilizan son los siguientes
Atributos:
• color (string): El color del blob detectado.
• posx (int): Representa la localización de la pelota en el X respecto al robot. Los valores están en el rango de 0 a 100. Ver imagen anterior.
• posy (int): Representa la posición de la pelota en el Y respecto al robot, es decir, lo cerca o lejos que se encuentra del mismo. Los valores están en el rango de 0 a 100. Ver imagen anterior.
• size (int): El área del blob medida en pixels, de forma que, cuanto mayor es el valor, más cerca se encuentra el robot del blob detectado.
• frame_timestamp (long): La hora a la que el frame se comenzó a procesar.
• status_timestamp (long): La hora a la que se envió el estado.
5.6.2 Enumerado BlobColor
Representa la lista de colores que Robobo puede detectar.
RED: Rojo.
BLUE: Azul.
GREEN: Verde.
CUSTOM: Personalizado.
5.6.3 Método readColorBlob
| readColorBlob(color) |
Lee el último blob del color indicado detectado. Parámetros: Devuelve: |
Ejemplo de Uso
El siguiente programa hace que Robobo diga si ve un color un objeto de color verde y dónde lo ve, de forma natural para el usuario, es decir, hablando.
Si el robot no ve el objeto, dice que no lo ve, y si lo ve, comprueba la posición en la que encuentra respecto al robot y lo dice. Para comprobar si ve o no el objeto, usa el atributo “size”, y para comprobar la posición usar la coordenada x del objeto verde detectado en la imagen.
El pequeño movimiento que se realiza antes de comprobar si el robot detecta el objeto se debe a que, los sensores solo devuelven valores cuando se produce un cambio.
from robobopy.Robobo import Robobo
from robobopy.utils.BlobColor import BlobColor
rob = Robobo("localhost")
rob.connect()
rob.moveWheelsByTime(2,2,1)
if rob.readColorBlob(BlobColor.GREEN).size > 0:
if 0 <= rob.readColorBlob(BlobColor.GREEN).posx < 45:
rob.sayText('Verde a la izquierda')
elif 45 <= rob.readColorBlob(BlobColor.GREEN).posx <= 55:
rob.sayText('Verde en el medio')
elif 55 < rob.readColorBlob(BlobColor.GREEN).posx < 100:
rob.sayText('Verde a la derecha')
else:
rob.sayText('No veo verde')5.6.4 Método setActiveBlobs
| setActiveBlobs(red, green, blue, custom) |
|
Habilita o deshabilita el seguimiento individual de cada color. Por defecto, el seguimiento del color verde está habilitado y los demás deshabilitados. Parámetros: Advertencia: El seguimiento de color es una tarea computacionalmente intensiva; habilitar todos los colores a la vez puede afectar al rendimiento. El uso del color custom en el robot real requiere la calibración de la cámara, tal y como se explica aquí: https://github.com/mintforpeople/robobo-programming/wiki/camera-calibration-tutorial_es |
Ejemplo de Uso
El siguiente programa configura la detección de todos los colores. A continuación, hace que Robobo
gire sobre sí mismo, diga el nombre del color que detecta y encienda los leds en ese color (en el caso del color personalizado, se encienden en amarillo). Inicialmente, los LEDs de la base se apagan:
from robobopy.Robobo import Robobo
from robobopy.utils.BlobColor import BlobColor
from robobopy.utils.Color import Color
from robobopy.utils.LED import LED
rob = Robobo("localhost")
rob.connect()
rob.setActiveBlobs(True, True, True, True)
rob.setLedColorTo(LED.All, Color.OFF)
rob.moveWheels(10,-10)
while True:
if rob.readColorBlob(BlobColor.RED).size > 0:
rob.setLedColorTo(LED.All, Color.RED)
rob.sayText('Veo rojo')
elif rob.readColorBlob(BlobColor.BLUE).size > 0:
rob.setLedColorTo(LED.All, Color.BLUE)
rob.sayText('Veo azul')
elif rob.readColorBlob(BlobColor.GREEN).size > 0:
rob.setLedColorTo(LED.All, Color.GREEN)
rob.sayText('Veo verde')
elif rob.readColorBlob(BlobColor.CUSTOM).size > 0:
rob.setLedColorTo(LED.All, Color.YELLOW)
rob.sayText('Veo color personalizado')
else:
rob.setLedColorTo(Color.OFF)
rob.wait(0.5)5.6.5 Método readAllColorBlobs()
| readAllColorBlobs() |
|
Lee los datos de todos los blobs de colores. Devuelve: • Diccionario con la información individual de cada blob ( |
Ejemplo de Uso
En este ejemplo, se leen los datos de todos los blobs detectados (diccionario) y se muestra por pantalla la información de cada color: nombres color, posición X e Y y su área.
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
rob.wait(1)
blobs = rob.readAllColorBlobs()
for key in blobs:
blob = blobs[key]
print(blob.color)
print(blob.posx)
print(blob.posy)
print(blob.size)5.6.6 Método resetColorBlobs
| resetColorBlobs() |
| Reinicia el detector de colores. Esto pone a 0 los atributos de los últimos blobs detectados, pero mantiene iguales los colores habilitados y deshabilitados. |
Ejemplo de Uso
En el siguiente programa se reinician los valores leídos de color y se le indica al usuario en voz alta dicha acción
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
rob.resetColorBlobs()
rob.sayText('Los valores de los colores han sido reiniciados')5.6.7 Método whenANewColorBlobIsDetected
| whenANewColorBlobIsDetected(callback) |
|
Establece la función callback que se llama cuando se detecta un nuevo blob. Parámetros: • callback ( |
Ejemplo de Uso
El siguiente programa hace que Robobo diga de forma continuada el color que detecta, asumiendo que están activados verde, rojo y azul:
from robobopy.Robobo import Robobo
from robobopy.utils.Color import *
def color_detected():
print(rob.readColorBlob(Color.BLUE).size)
if rob.readColorBlob(Color.GREEN).size != 0:
rob.sayText('Estoy viendo verde')
else:
if rob.readColorBlob(Color.RED).size != 0:
rob.sayText('Estoy viendo rojo')
else:
rob.sayText('Estoy viendo azul')
rob = Robobo("localhost")
rob.connect()
rob.setActiveBlobs(True, True, True, False)
rob.whenANewColorBlobIsDetected(color_detected)
# el programa se mantiene en ejecución continua
while True:
rob.wait(0.1)5.6.8 Método setAdvancedLostBlobParameters
| setAdvancedLostBlobParameters(frames=5, minarea=1000, max_count=1, epsilon=0) |
|
Configura los parámetros avanzados para el seguimiento de blobs. Parámetros: • frames ( int): Número de fotogramas transcurridos durante los que no se ha detectado el blob para considerarlo perdido.• minarea ( int): Área mínima para considerar a un blob como un blob.• max_count ( int): Parámetro max_count del termcriteria.• epsilon ( int): Parámetro epsilon del termcriteria.Advertencia: Solo utiliza esta función si sabes lo que estás haciendo. Una mala configuración podría traer consecuencias inesperadas. |
Ejemplo de Uso
En este ejemplo, se varían varios hiperparámetros que definen cuando se considera que se ha perdido un color. Entre ellos se aumenta el número de fotogramas de 5 a 10 y el área mínima para considerar
que un Blob es un Blob se reduce a la mitad (500).
from robobopy.Robobo import Robobo
rob = Robobo("localhost")
rob.connect()
rob.setAdvancedLostBlobParameters(frames= 10, minarea= 500)