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:
• Diccionario con la información individual de cada blob (dict). Las claves (key) del diccionario son de tipo BlobColor (ver Clase Blob) y contienen los posibles colores detectados. Los valores (values) del diccionario son de tipo Blob (ver Clase Blob) y contienen la información 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: 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:
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 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:
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:

• Diccionario con la información individual de cada blob (dict). Las claves (key) del diccionario son de tipo BlobColor (ver Clase Blob) y contienen los posibles colores detectados. Los valores (values) del diccionario son de tipo Blob (ver Clase Blob) y contienen la información 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 (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 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)
Robobo
Resumen de privacidad

Esta web utiliza cookies para que podamos ofrecerte la mejor experiencia de usuario posible. La información de las cookies se almacena en tu navegador y realiza funciones tales como reconocerte cuando vuelves a nuestra web o ayudar a nuestro equipo a comprender qué secciones de la web encuentras más interesantes y útiles.