Introducción a GRIP

GRIP es una herramienta para desarrollar algoritmos de visión por computadora de forma interactiva en lugar de a través de codificación de prueba y error. Después de desarrollar su algoritmo, puede ejecutar GRIP en modo sin cabeza en su roboRIO, en una computadora portátil Driver Station o en un coprocesador conectado a la red de su robot. Con Grip, eliges operaciones de visión para crear una pipeline gráfica que represente la secuencia de operaciones que se realizan para completar el algoritmo de visión.

GRIP se basa en OpenCV, una de las bibliotecas de software de visión por computadora más populares utilizadas para investigaciones, robótica e implementaciones de algoritmos de visión. Las operaciones que están disponibles. en GRIP son casi una coincidencia de 1 a 1 con las operaciones disponibles si estaba codificando manualmente el mismo algoritmo con algún lenguaje de programación basado en texto.

La interfaz de usuario GRIP

../../../../_images/the-grip-user-interface.png

La interfaz de usuario GRIP consta de 4 partes:

  • Image Sources son las formas de obtener imágenes en la pipeline GRIP. Usted puede proporcionar imágenes a través de cámaras o archivos adjuntos. Las fuentes son casi siempre el comienzo del algoritmo de procesamiento de imágenes.

  • Operation Palette contiene los pasos de procesamiento de imágenes de la librería OpenCV que puedes encadenar en la pipeline para formar tu algoritmo. Al hacer clic en una operación en la paleta lo agrega al final de la pipeline. Luego puedes usar las flechas izquierda y derecha para mover la operación dentro de la pipeline.

  • Pipeline es la secuencia de pasos que componen el algoritmo. Cada paso (operación) en la pipeline está conectada a un paso anterior desde la salida de un paso a una entrada para el siguiente paso. Los datos fluyen generalmente de izquierda a derecha a través de las conexiones que creas

  • Image Preview La vista previa de la imagen muestra vistas previas del resultado de cada paso que tiene su botón de vista previa presionado. Esto facilita la depuración de algoritmos al poder obtener una vista previa de las salidas de cada paso intermedio.

Encontrando el cuadro amarillo

../../../../_images/finding-the-yellow-square.png

En esta aplicación intentaremos encontrar el cuadrado amarillo en la imagen y mostrar su posición. La configuración es bastante simple, solo una cámara web USB conectada a la computadora mirando hacia abajo algunos objetos coloridos. El cuadrado de plástico amarillo es lo que nos interesa ubicar en la imagen.

Habilitar la fuente de la imagen

../../../../_images/enable-the-image-source.png

El primer paso es adquirir una imagen. Para usar la fuente, haga clic en el botón «Add Webcam» y seleccione el número de cámara. En este caso, la cámara USB Logitech que apareció como Webcam 0 y la cámara del monitor de la computadora era Webcam 1. La cámara web está seleccionada en este caso para tomar la imagen detrás de la computadora como se muestra en la configuración. Luego seleccione el botón de vista previa de la imagen y la visualización en tiempo real de la transmisión de la cámara se mostrará en el área de vista previa.

Cambiar el tamaño de la imagen

../../../../_images/resize-the-image.png

En este caso, la resolución de la cámara es demasiado alta para nuestros propósitos, y de hecho toda la imagen ni siquiera se puede ver en la ventana de vista previa. Se hace clic en la operación «Resize» desde la paleta de operaciones para agregarlo al final de la pipeline. Para ayudar a localizar la operación de cambio de tamaño, escriba «Resize» en el cuadro de búsqueda en la parte superior de la paleta. Los pasos son:

  1. Escriba «Resize» en el cuadro de búsqueda en la paleta

  2. Haga clic en la operación Resize de la paleta. Aparecerá en la pipeline.

  3. Ingrese el factor de escala de cambio de tamaño x & y en la operación de cambio de tamaño en la pipeline. En este caso 0.25 fue elegido para ambos.

  4. Arrastre desde el socket del tapete de salida de imagen de la cámara web al socket del tapete fuente de cambio de tamaño de imagen. Se mostrará una conexión que indica que la salida de la cámara se está enviando a la entrada de cambio de tamaño.

  5. Haga clic en el botón de vista previa de destino en la operación «Cambiar tamaño» en la pipeline. Se mostrará una imagen más pequeña junto con la imagen original más grande. Es posible que necesites desplazarse horizontalmente para ver ambos como se muestra.

  6. Por último, haga clic en el botón de vista previa de la fuente de la cámara web, ya que no hay razón para ver la imagen grande y la imagen más pequeña al mismo tiempo.

Encuentra solo las partes amarillas de la imagen

../../../../_images/find-only-the-yellow-parts-of-the-image.png

El siguiente paso es eliminar todo de la imagen que no coincida con el color amarillo de la pieza de plástico que es el objeto que se detecta. Para hacer eso, una operación de umbral de HSV se elige para establecer los límites superior e inferior de los valores de HSV para indicar qué píxeles deben ser incluido en la imagen binaria resultante. Observe que el área objetivo es blanca mientras todo que no estaban dentro de los valores umbral se muestran en negro. De nuevo, como antes:

  1. Escriba HSV en el cuadro de búsqueda para encontrar la operación HSV Threshold

  2. Haga clic en la operación en la paleta y aparecerá al final de la pipeline.

  3. Conecte el socket dst (salida) en la operación de cambio de tamaño a la entrada de HSV Threshold.

  4. Habilite la vista previa de la operación HSV Threshold para que el resultado de la operación sea mostrada en la ventana de vista previa.

  5. Ajuste los parámetros de Tono, Saturación y Valor, solo el objeto de destino se muestra en la ventana de vista previa.

Deshazte del ruido y los golpes extraños

../../../../_images/get-rid-of-the-noise.png

Esto se ve bastante bien hasta ahora, pero a veces hay ruido de otras cosas que no pudieron ser filtradas. Para ilustrar una posible técnica para reducir esos píxeles ocasionales que se detectaron, se elige una operación de erosión. La erosión eliminará pequeños grupos de píxeles que no forman parte del área de interés.

Enmascarar solo el área amarilla de la imagen original

../../../../_images/mask-just-the-yellow-area.png

Here a new image is generated by taking the original image and masking (and operation) it with the results of the erosion. This leaves just the yellow card as seen in the original image with nothing else shown. And it makes it easy to visualize exactly what was being found through the series of filters.

Encuentre el área amarilla (blob)

../../../../_images/find-the-yellow-area.png

The last step is actually detecting the yellow card using a Blob Detector. This operation looks for a grouping of pixels that have some minimum area. In this case, the only non-black pixels are from the yellow card after the filtering is done. You can see that a circle is drawn around the detected portion of the image. In the release version of GRIP (watch for more updates between now and kickoff) you will be able to send parameters about the detected blob to your robot program using NetworkTables.

Estado de GRIP

As you can see from this example, it is very easy and fast to be able to do simple object recognition using GRIP. While this is a very simple example, it illustrates the basic principles of using GRIP and feature extraction in general. Over the coming weeks the project team will be posting updates to GRIP as more features are added. Currently it supports cameras (Axis ethernet camera and web cameras) and image inputs. There is no provision for output yet although NetworkTables and ROS (Robot Operating System) are planned.

Puede ya sea, descargar una versión del código precompilada desde la sección «Versiones» de la página de GitHub (https://github.com/WPIRoboticsProjects/GRIP) o puede clonar el repositorio de origen y construirlo usted mismo. Las instrucciones para construir GRIP se encuentran en la página del proyecto. También hay documentación adicional en el proyecto wiki.

Por lo tanto, juegue con GRiP y envíenos sus comentarios aquí en el foro. Si encuentra errores, puede publicarlos aquí o como un problema del proyecto de GitHub en la página del proyecto.