Identificando y procesando los objetivos

Una vez que se captura una imagen, el siguiente paso es identificar el/los objetivo(s) de la visión en la imagen. Este documento se ocupará de un enfoque para la identificación de los objetivos de 2016. Obsérvese que las imágenes utilizadas en esta sección fueron tomadas con la cámara intencionalmente configurada para subexponer las imágenes, produciendo imágenes muy oscuras con la excepción de los objetivos iluminados, ver la sección de ajustes de la cámara para más detalles.

Imagen original

La imagen que se muestra a continuación es la imagen inicial del ejemplo descrito aquí. La imagen era tomada usando la luz verde del anillo disponible en FIRST®Choice combinada con un anillo adicional de luz de un tamaño diferente. Se proporcionan imágenes de muestra adicionales con los ejemplos de código de visión.

Sample image using a green ring light showing the retroreflective tape.

¿Qué es HSL/HSV?

El tono del color se ve comúnmente en la rueda de colores del artista y contiene los colores del arco iris: rojo, naranja, amarillo, verde, azul, índigo y violeta. El tono se especifica usando un ángulo radial en la rueda, pero en la imagen el círculo típicamente contiene sólo 256 empezando con el rojo en el cero, pasando por el arco iris, y volviendo al rojo en el extremo superior. La saturación de un color especifica la cantidad de color, o la proporción del color de la tonalidad a una sombra de gris. Una proporción más alta significa más colorido, menos gris. La saturación cero no tiene ningún matiz y es completamente gris. La luminancia o valor indica el tono de gris que el tono está mezclado con. El negro es 0 y el blanco es 255.

El código de ejemplo utiliza el espacio de color HSV para especificar el color del objetivo. La razón principal es que permite utilizar fácilmente el brillo de los objetivos en relación con el resto de la imagen como un criterio de filtrado utilizando el componente de Valor (HSV) o Luminancia (HSL). Otra razón para usar el sistema de color HSV es que la operación de umbral utilizada en el ejemplo funciona más eficientemente en el roboRIO cuando se hace en el espacio de color del HSV.

Enmascarando

En este paso inicial, los valores de los píxeles se comparan con los valores de color o brillo constantes para crear una máscara binaria que se muestra abajo en amarillo. Este único paso elimina la mayoría de los píxeles que son no es parte de la cinta retro-reflectante del objetivo. El enmascaramiento basado en el color funciona bien siempre que el color es relativamente saturado, brillante y consistente. Las desigualdades de color son generalmente más precisas cuando se especifica usando el HSL (Tono, Saturación y Luminancia) o el HSV (Tono, Saturación, y Valor) que el espacio de color RGB (Rojo, Verde y Azul). Esto es especialmente cierto cuando la gama de colores es bastante grande en una o más dimensiones.

Observe que además del objetivo, otras partes brillantes de la imagen (la luz superior y la torre iluminación) también son atrapados por el paso de la máscara.

Masked version of the image above showing the "bright" parts of the image.

Análisis de partículas

Después de la operación de enmascaramiento, se utiliza una operación de informe de partículas para examinar la zona, delimitando rectángulo, y un rectángulo equivalente para las partículas. Estos se utilizan para ayudar a elegir las formas más rectangulares. Cada prueba descrita a continuación genera una puntuación (0-100) que luego se compara con los límites de puntuación predefinidos para decidir si el de las partículas es un objetivo o no.

Área de cobertura

La puntuación del área se calcula comparando el área de la partícula con el área del cuadro delimitador dibujado alrededor de la partícula. El área de las bandas retrorreflectoras es de 80 pulgadas cuadradas (~516 \(cm^2\)). El área del rectángulo que contiene el objetivo es de 240 pulgadas cuadradas (~0.15 \(m^2\)). Esto significa que la relación ideal entre el área y el área del cuadro delimitador es de 1/3. Las relaciones de área cercanas a 1/3 producirán un puntaje cercano a 100, a medida que la relación se aleje de 1/3 el puntaje se acercará a 0.

Relación de aspecto

La puntuación de la relación de aspecto se basa en (Ancho de la partícula / Altura de la partícula). El ancho y la altura de la partícula se determinan usando algo llamado «rectángulo equivalente». El rectángulo equivalente es el rectángulo con longitudes laterales :math: ´x´ y ´y´ donde :math: ´2x+2y´ es igual a la partícula perímetro y :math: ´x cdot y´ es igual al área de la partícula. El rectángulo equivalente se utiliza para el aspecto de cálculo de la proporción, ya que se ve menos afectado por el sesgo del rectángulo que por el uso del límite caja. Cuando se utiliza el rectángulo del cuadro delimitador para la relación de aspecto, como el rectángulo está sesgado la altura aumenta y la anchura disminuye.

El objetivo tiene 20» (508 mm) de ancho por 12» (304,8 mm) de alto, para una relación de 1,6. La relación de aspecto detectada se compara con esta relación ideal. La puntuación de la relación de aspecto se normaliza para obtener 100 cuando la relación coincide con la del objetivo y desciende linealmente a medida que la relación varía por debajo o por encima.

Momento

The «moment» measurement calculates how spread out each pixel is from the center of the blob. This measurement provides a representation of the pixel distribution in the particle. It can be thought of as analogous to a physics moment of inertia calculation. The ideal score for this test is ~0.28.

Perfiles X/Y

A graph and LabVIEW plot showing X/Y Profiles.

El puntaje del borde describe si la partícula coincide con el perfil apropiado tanto en el X y las direcciones Y. Como se muestra, se calcula usando los promedios de fila y columna a través de la caja delimitadora extraída de la imagen original y comparada con una máscara de perfil. La puntuación oscila entre 0 y 100 en función del número de valores dentro de los promedios de las filas o columnas que están entre los valores límite superior e inferior.

Medidas

Si una partícula puntúa lo suficientemente bien como para ser considerada un objetivo, tiene sentido calcular algunas medidas del mundo real como la posición y la distancia. El código de ejemplo incluye estas medidas básicas, así que veamos las matemáticas involucradas para entenderlo mejor.

Posición

La posición del objetivo está bien descrita tanto por la partícula como por el cuadro delimitador, pero todas las coordenadas están en píxeles con el 0,0 estando en la parte superior izquierda de la pantalla y la derecha y la parte inferior de los bordes determinados por la resolución de la cámara. Este es un sistema útil para la matemática de los píxeles, pero no casi tan útil para conducir un robot; así que cambiémoslo a algo que pueda ser más útil.

Para convertir un punto del sistema de píxeles al sistema de puntería, podemos usar la fórmula mostrada debajo.

The resulting coordinates are close to what you may want, but the Y axis is inverted. This could be corrected by multiplying the point by [1,-1] (Note: this is not done in the sample code). This coordinate system is useful because it has a centered origin and the scale is similar to joystick outputs and Drive inputs.

\[A_{x,y} = \left(P_{x,y} - \frac{\textit{resolution}_{x,y}}{2}\right) / \frac{\textit{resolution}_{x,y}}{2}\]
Two images one of a pixel based axis and another from -1 to 1 that can be directly used with motors for aiming.

Vista de campo

Puede utilizar constantes conocidas y la posición del objetivo en el plano de coordenadas para determinar la distancia, la guiñada y el cabeceo del objetivo. Sin embargo, para calcularlas, debes determinar tu FOV (campo de visión). Para determinar empíricamente el campo vertical de la vista, coloca tu cámara a una distancia determinada de una superficie plana, y mide la distancia entre la fila de píxeles más alta y la más baja.

\[\frac{1}{2}FOV_{vertical}=tan\left(\frac{\frac{1}{2}distance_{y}}{distance_{z}}\right)\]

Puede encontrar el FOV horizontal usando el mismo método, pero usando la distancia entre la primera y última columna de píxeles.

Lanzamiento y guiño

Encontrar el lanzamiento y el guiño del objetivo en relación con tu robot es simple una vez que conoces tu FOV y la ubicación de su objetivo en el sistema de coordenadas de puntería.

\[pitch=\frac{A_y}{2}FOV_{vertical}\]
\[yaw=\frac{A_x}{2}FOV_{horizontal}\]

Distancia

Si tu objetivo está a una altura significativamente diferente a la de tu robot, puedes usar constantes conocidas, como la altura física del objetivo y tu cámara, así como el ángulo en el que se monta la cámara, para calcular la distancia entre la cámara y el objetivo.

\[distance=\frac{height_{target}-height_{camera}}{tan(angle_{camera}+pitch)}\]

Otra opción es crear una tabla de búsqueda de área a distancia, o estimar el inverso constante de variación de área y distancia. Sin embargo, este método es menos preciso.

Nota

Para obtener los mejores resultados de los métodos anteriores de estimación del ángulo y la distancia, puede calibrar su cámara usando OpenCV para deshacerse de cualquier distorsión que pueda estar afectando a la precisión reproyectando los píxeles del objetivo usando la matriz de calibración