Búsqueda de bloques de color

Tutorial en video 4 - Reconocimiento de color: https://singtown.com/learn/49993/

función find_blobs

Rastrear la pelota es la función más utilizada de OpenMV. En inicio rápido de 10 minutos,\ podemos encontrar el bloque de color mediante la función find_blobs. Veamos los detalles de find_blobs.

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

Aquí hay muchos parámetros.

  • thresholds es el umbral de color. Nota: este parámetro es una lista que puede contener múltiples colores. Si solo necesitas un color, entonces solo hay un valor de color en esta lista. Si quieres varios umbrales de color, entonces esta lista necesita varios umbrales de color. Nota: se puede llamar al método correspondiente sobre el objeto de bloque de color (blob) devuelto para determinar de qué color es el bloque de color.
red = (xxx,xxx,xxx,xxx,xxx,xxx)
blue = (xxx,xxx,xxx,xxx,xxx,xxx)
yellow = (xxx,xxx,xxx,xxx,xxx,xxx)

img=csi0.snapshot()
red_blobs = img.find_blobs([red])

color_blobs = img.find_blobs([red,blue, yellow])
  • roi es la "región de interés" (region of interest). Ya se ha presentado en el uso de estadísticas.

    left_roi = [0,0,160,240]\ blobs = img.find_blobs([red],roi=left_roi)

  • x_stride es el ancho mínimo en píxeles, en la dirección x, del bloque de color a buscar. El valor predeterminado es 2. Si solo quieres encontrar bloques de color con un ancho superior a 10 píxeles, establece este parámetro en 10:

    blobs = img.find_blobs([red],x_stride=10)

  • y_stride es el ancho mínimo en píxeles, en la dirección y, del bloque de color a buscar. El valor predeterminado es 1. Si solo quieres encontrar bloques de color con un ancho superior a 5 píxeles, establece este parámetro en 5:

    blobs = img.find_blobs([red],y_stride=5)

  • invert invierte el valor del umbral y usa el color fuera del umbral como el valor de umbral de búsqueda

  • area_threshold es el valor de umbral de área. Si el área del bloque de color enmarcado es menor que este valor, se filtrará

  • pixels_threshold es el umbral de recuento de píxeles; si el número de píxeles en un bloque de color es menor que este valor, se filtrará

  • merge (fusionar), si se establece en True, fusiona todos los blobs que se superponen en uno solo.\ Nota: esto fusionará todos los blobs, sin importar el color. Si quieres combinar blobs de varios colores, simplemente llama a find_blobs con distintos umbrales de color por separado.

all_blobs = img.find_blobs([red,blue,yellow],merge=True)

red_blobs = img.find_blobs([red],merge=True)
blue_blobs = img.find_blobs([blue],merge=True)
yellow_blobs = img.find_blobs([yellow],merge=True)
  • margin (margen), si se establece en 1, dos blobs se fusionarán si están separados por 1 píxel.

umbral

La estructura de un umbral de color es la siguiente:

red = (minL, maxL, minA, maxA, minB, maxB)

Los valores de la tupla son, respectivamente, los valores máximo y mínimo de L, A y B.

Si quieres obtener este umbral en la imagen del IDE, consulta: inicio rápido de 10 minutos

En la nueva versión del IDE, hay una herramienta de selección de umbral más conveniente, ver a continuación.

Herramienta de selección de umbral de color

El IDE de OpenMV ha agregado una herramienta de selección de umbral, que facilita enormemente la depuración de los umbrales de color.

Primero ejecuta hello world.py para mostrar el patrón en el framebuffer en el IDE.\ \ Luego abre Tools → Mechine Vision → Threshold Editor\

Haz clic en Frame Buffer para obtener la imagen en el IDE, e Image File te permite seleccionar un archivo de imagen por tu cuenta.

Arrastra los seis controles deslizantes para ver los resultados del umbral en tiempo real. El resultado que queremos es que nuestro color objetivo se vuelva blanco y todos los demás colores se vuelvan negros.

Blobs es una lista

El objeto devuelto por find_blobs es una lista de múltiples blobs. (Nota la diferencia entre blobs y blob. Esto es solo un nombre usado para distinguir varios bloques de color de un solo bloque de color).\ Una lista es similar a un array en el lenguaje C. Una lista de blobs contiene muchos objetos blob. Los objetos blob son bloques de color, y cada objeto blob contiene información sobre un bloque de color.

blobs = img.find_blobs([red])

Blobs son muchos bloques de color.

Puedes usar un bucle for para encontrar todos los bloques de color.

for blob in blobs:
    print(blob.cx)

Para el uso de bucles for, consulta los conocimientos previos de Python

Objeto blob de bloque de color

Blob tiene varios métodos:

  • blob.rect devuelve el marco exterior de este bloque de color: una tupla rectangular (x, y, w, h), que se puede usar directamente en image.draw_rectangle.

  • blob.x devuelve la coordenada x del borde del blob (int), también disponible desde blob[0].

  • blob.y devuelve la coordenada y del borde del blob (int), también disponible desde blob[1].

  • blob.w devuelve el ancho w del borde del blob (int), también disponible desde blob[2].

  • blob.h devuelve la altura h del borde del blob (int), también disponible desde blob[3].

  • blob.pixels devuelve el número de píxeles en el blob (int), también disponible desde blob[4].

  • blob.cx devuelve la coordenada x del centro del borde del blob (int), también disponible desde blob[5].

  • blob.cy devuelve la coordenada y del centro del borde del blob (int), también disponible desde blob[6].

  • blob.rotation devuelve el ángulo de rotación del blob en radianes (float). Si el blob se parece a un lápiz, este valor está entre 0 y 180°. Si el blob es un círculo, este valor no tiene utilidad. Si el blob no tiene ninguna simetría, obtendrás un valor entre 0 y 360°. También puedes obtener esto desde blob[7].

  • blob.code devuelve un número de 16 bits, donde cada bit corresponde a un umbral. Por ejemplo:

    blobs = img.find_blobs([red, blue, yellow], merge=True)

Si el blob es rojo, su código es 0001, y si es azul, su código es 0010. Nota: un blob puede estar fusionado, así que si es un blob rojo y azul, el código del blob es 0011. Esta función puede usarse para encontrar códigos de color. También puedes obtener esto desde blob[8].

  • blob.count Si merge=True, se fusionan varios blobs en uno solo, y esta función devuelve el número de blobs fusionados. Si merge=False, el valor devuelto siempre es 1. También puedes obtener esto desde blob[9].

  • blob.area devuelve el área del marco exterior del blob. Debería ser igual a (w * h)

  • blob.density devuelve la densidad del blob. Es igual al número de píxeles del blob dividido entre el área del marco exterior. Si la densidad es baja, significa que el objetivo no está bien localizado.\ Por ejemplo, al reconocer un círculo rojo, blob.pixels devuelto es el número de píxeles del círculo objetivo, y blob.area es el área del cuadrado circunscrito al círculo.

results matching ""

    No results matching ""