diciembre 1, 2021 10:00 am

Jesús

Una de las habilidades más subestimadas de OpenCV es la de dibujar formas geométricas básicas.

¿Dibujar? Sé que, a priori, parece un tanto básico y sencillo, pero es una parte fundamental de computer vision. 

Saber dibujar figuras geométricas sencillas, así como líneas y demás polígonos es tan esencial en el mundo de la visión artificial, como imprimir strings lo es en la programación tradicional.

Dibujar nos permite manifestar en una foto digital dónde están los objetos detectados o puntos de interés. Es por eso que es fundamental familiarizarnos con las funciones que nos permiten realizar trazos en fotografías.

Al final de este artículo habrás aprendido:

  • Cómo dibujar líneas con OpenCV.
  • Cómo dibujar rectángulos con OpenCV.
  • Cómo dibujar círculos con OpenCV.

Sin más preámbulo, comencemos.

Formas Útiles

Aunque es posible representar otras formas diferentes a las que pronto describiremos, éstas son las más útiles y las que, en la mayoría de los casos, necesitarás:

  • Líneas: Después de alterar píxeles individuales, lo más sencillo que podemos hacer es trazar una línea, bien sea vertical, horizontal o diagonal.
  • Rectángulos: Estas figuras geométricas son particularmente útiles para encerrar objetos de interés, típicamente detecciones, en una foto digital.
  • Círculos: Cumplen una función similar a la de los rectángulos. Cuando nos interesa identificar y resaltar elementos circulares en una imagen, como monedas, botones o planetas, dibujar un círculo a su alrededor suele ser más apropiado que un rectángulo.

Creación del Entorno de Desarrollo con Anaconda

Como siempre, empecemos viendo la estructura del proyecto:

.
├── datasmarts
│   └── draw.py
└── env.yml

Vemos que se compone de un único script, datasmarts/draw.py, que encapsula la lógica para dibujar en OpenCV.

Para crear el ambiente de Anaconda, corre este comando:

conda env create -f opencv-drawing

Esta instrucción habrá creado un ambiente llamado opencv-drawing, configurado de la siguiente manera:

Puedes activar el ambiente así:

conda activate opencv-drawing

Excelente. Sigamos adelante.

Dibujando Figuras con OpenCV

Abre el archivo datasmarts/draw.py e inserta estas líneas para importar las dependencias del programa:

A continuación, crearemos un “lienzo” a partir de un arreglo multidimensional de NumPy:

Nota que generamos un arreglo de ceros, con dimensiones 300x300x3. Recordemos que en una imagen RGB, 0 representa el negro absoluto, así que nuestro lienzo será de color negro.

Ahora, trazamos una línea, usando la función cv2.line() de OpenCV, la cual va del píxel (0, 0) al píxel (300, 300). La línea es de color verde:

Análogamente, en el siguiente extracto dibujamos una línea que comienza en el píxel (300, 0) y acaba en (0, 300). En esta ocasión la línea es roja. El 3 al final de la lista de parámetros de la función especifica el grosor:

Lo siguiente que haremos es dibujar un rectángulo cuya esquina superior izquierda está en (10, 10), mientras que la esquina inferior derecha está en (60, 60). Este rectángulo es verde:

Luego, dibujamos un rectángulo rojo más largo y con mayor grosor (especificado por el 5 al final de la lista de argumentos de la función cv2.rectangle()), con vértice superior izquierdo en (50, 200) y vértice inferior derecho en (200, 225):

Seguidamente, dibujamos un rectángulo con esquina superior izquierda en (200, 50) y esquina inferior derecha en (255, 125), de color azul. Cuando usamos un grosor de -1 le indicamos a OpenCV que queremos un rectángulo sólido, en vez del contorno, como es usual:

Para dibujar un círculo llamamos a la función cv2.circle() de OpenCV, la cual espera una imagen dónde trazar la figura como primer parámetro, una tupla de enteros que representa el centro del círculo, el radio del mismo y el color. 

Al igual que con los rectángulos, opcionalmente podemos especificar el grosor del trazo en el último parámetro de la función (-1 quiere decir que dibujaremos un círculo per se, no una circunferencia).

Definimos el centro de los círculos como el punto central de la imagen. Posteriormente dibujamos círculos concéntricos:

Sólo por diversión, en el último extracto estamos creando “arte abstracto” mediante el trazado de 25 círculos de colores, radio y centros aleatorios:

Puedes ejecutar el programa así (desde la raíz del proyecto):

python datasmarts/drawing.py

Esta es la secuencia de imágenes que obtuve (recuerda que para avanzar a la siguiente parte del script debes presionar alguna tecla, de manera que OpenCV pueda dibujar más formas):

Cool, ¿no? 

Resumen

Hoy aprendimos sobre lo fácil que resulta dibujar figuras geométricas sencillas en OpenCV.

En particular, descubrimos que podemos dibujar líneas, rectángulos y círculos, lo cual es más que suficiente para la mayoría de las situaciones que nos encontraremos.

Entre las cosas que podemos controlar al dibujar, tenemos:

  • El color.
  • La ubicación.
  • El tamaño de la figura.
  • El grueso del trazo.

¿Qué te pareció el post de hoy? Aunque parezca y sea sencillo trazar polígonos en OpenCV, es una técnica muy poderosa y versátil.

¿Por qué no te descargas el códgo a continuación, para que sigas experimentando y ahondando tu conocimiento?

¡Nos vemos!

Sobre el Autor

Jesús Martínez es el creador de DataSmarts, un lugar para los apasionados por computer vision y machine learning. Cuando no se encuentra bloggeando, jugando con algún algoritmo o trabajando en un proyecto (muy) cool, disfruta escuchar a The Beatles, leer o viajar por carretera.

Paso 2/2: Celebra tu NUEVO EMPLEO en Machine Learning ?

A %d blogueros les gusta esto: