FUNCIONES DE DIBUJO en OpenCV – Python

Por Administrador

En muchas de las aplicaciones de visión por computador son dibujados círculos, líneas, rectángulos o texto, y eso es precisamente lo que estudiaremos hoy, las funciones necesarias para dibujar cada una de ellas en una imagen. ¿Estás listo?, ¡sigamos adelante!.

CONTENIDO

  • ¿Cómo dibujar líneas?
  • ¿Cómo dibujar rectángulos?
  • ¿Cómo dibujar círculos?
  • ¿Cómo dibujar texto?
    • Tipos de fuentes que se pueden usar para texto en OpenCV

Antes de hablar de cada una de las funciones de dibujo que veremos en este post, será necesario tener una imagen que servirá de lienzo, por eso vamos a emplear el siguiente código (realizado en python 3.6.7 y OpenCV 3.4.4):

import cv2
import numpy as np

imagen = 255*np.ones((400,600,3),dtype=np.uint8)

cv2.imshow('imagen',imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()

En la línea 1 y 2 importamos OpenCV y numpy con un alías np. En la línea 4 estamos construyendo una imagen con ayuda de np.ones, en donde construiremos una matriz de unos, de 400 filas por 600 columnas y 3 canales, lo que nos ayudará a crear una imagen para manejar los canales B, G y R, seguido de dtype=np.uint8. Esta matriz es multiplicada por 255, con ello cada uno de los canales adquirirá dicho valor, entonces la imagen se mostrará en blanco totalmente. ¿Recuerdas que (255, 255, 255) es la representación de blanco en BGR?.

En las líneas 6 a 8 visualizamos la imagen, establecemos que la visualización se detenga hasta que sea presionada una tecla con cv2.waitKey(0)y que finalmente se cierren las ventanas con cv2.destroyAllWindows(). Lo que veríamos es lo siguiente:

Figura 1: Visualización de una imagen creada en blanco.

¿Cómo dibujar líneas en OpenCV?

Para poder dibujar una línea en OpenCV, vamos a emplear la función cv2.line, en ella debemos especificar:

  • La imagen en donde se va a visualizar.
  • Las coordenadas del punto inicial en x e y.
  • Las coordenadas del punto final en x e y.
  • El color en BGR.
  • Grosor de línea.

La  programación sería la siguiente:

import cv2
import numpy as np

imagen = 255*np.ones((400,600,3),dtype=np.uint8)

#Dibujando lineas
cv2.line(imagen,(0,0),(600,400),(255,0,0),4)
cv2.line(imagen,(300,0),(300,200),(255,100,255),10)

cv2.imshow('imagen',imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()

Línea 7: Usamos la función cv2.line, en ella especificamos que se va a dibujar en la variable imagen, el punto inicial está en (0,0) en x e y, mientras que el punto final está en (600,400), el color en BGR es (255,0, 0), que corresponde al color azul, mientras que el grosor de línea es de 4 pixeles.

Línea 8: Esta es similar a la anterior, las diferencias están en los datos ingresado, pues el punto inicial está en (300,0), mientras que el final en (300,200), se visualizará en un color lila (255,100,255), mientras que el grosor de línea será de10.

El resultado de estas dos líneas de código serán la siguiente visualización:

Figura 2: Visualización de las 2 líneas creadas por cv2.line

¿Cómo dibujar rectángulos en OpenCV?

Para poder dibujar un rectángulo en OpenCV, vamos a emplear la función cv2.rectangle, en ella debemos especificar:

  • La imagen en donde se va a visualizar.
  • Las coordenadas del punto superior izquierdo.
  • Las coordenadas del punto inferior derecho.
  • El color en BGR.
  • Grosor de línea.

La  programación sería la siguiente:

import cv2
import numpy as np

imagen = 255*np.ones((400,600,3),dtype=np.uint8)

#Dibujando un rectangulo
cv2.rectangle(imagen,(50,80),(200,200),(0,255,0),1)
cv2.rectangle(imagen,(300,80),(450,230),(0,0,0),-1)

cv2.imshow('imagen',imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()

Línea 7: Usamos la función cv2.rectangle, en ella especificamos que el rectángulo se va a dibujar en la variable imagen, el punto inicial está en (50,80), x e y, mientras que el inferior derecho está en (200,200), el color en BGR es (0,255,0) que corresponde al color verde, mientras que el grosor de línea es de 1 pixel.

Línea 8: Los valores de los argumentos ingresado son similares al de la línea anterior, pero ¿te diste cuenta que el grosor de línea es un número negativo?. Pues bien, si damos un número negativo en el grosor de línea, este va a hacer que el rectángulo se dibuje totalmente lleno, como veremos a continuación:

Figura 3: Visualización de 2 rectángulos creadas por cv2.rectangle

¿Cómo dibujar círculos en OpenCV?

Para poder dibujar círculos en OpenCV, vamos a emplear la función cv2.circle, en ella debemos especificar:

  • La imagen en donde se va a visualizar.
  • Las coordenadas del punto central.
  • Radio del círculo a dibujar.
  • El color en BGR.
  • Grosor de línea.

La  programación sería la siguiente:

import cv2
import numpy as np

imagen = 255*np.ones((400,600,3),dtype=np.uint8)

#Dibujando un círculos
cv2.circle(imagen,(300,200),100,(255,255,0),-1)
cv2.circle(imagen,(300,20),10,(255,0,255),3)

cv2.imshow('imagen',imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()

Línea 7: Se dibujará un círculo con cv2.circle, la imagen en la que se visualizará es en imagen, el punto central del círculo está en (300,200), con un radio de 100 y color cian con (255,255,0). Mientras que el grosor de línea es -1, un número negativo, por ello al igual que con los rectángulos, el círculo se llenará.

Línea 8: Ahora en esta línea especificamos que el círculo se va a dibujar en la variable imagen, el punto central está en (300,20), x e y, con un radio de 10, el color en BGR es (255,0,255) que corresponde al color rosa, mientras que el grosor de línea es de 3 pixeles.

Figura 4: Visualización de 2 círculos creadas por cv2.circle

¿Cómo dibujar texto en OpenCV?

Para poder visualizar texto en OpenCV, vamos a emplear la función cv2.putText, en ella debemos especificar:

  • La imagen en donde se va a visualizar.
  • El texto que se va a visualizar.
  • Ubicación de la esquina inferior izquierda del texto en la imagen
  • Fuente del texto
  • Tamaño del texto
  • El color en BGR.
  • Grosor de línea para el texto

La  programación sería la siguiente:

import cv2
import numpy as np

imagen = 255*np.ones((400,600,3),dtype=np.uint8)

font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(imagen,'Practicando con OpenCV',(10,30),font,1,(0,255,255),2,cv2.LINE_AA)

cv2.imshow('imagen',imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()

En la línea 6 se especifica el tipo de fuente del texto que se va a visualizar en la imagen, esta se va a utilizar a continuación, en la línea 7.

Línea 7: Se usa cv2.putText, para poder ubicar texto en la imagen, entonces se entrega la imagen en donde se va a visualizar que sería imagen, el texto'Practicando con OpenCV', su ubicación en las coordenadas x e y (10,30), la fuente que está almacenada en font, el tamaño que sería 1, el color amarillo (0,255,255), con un grosor de línea de 2.

Figura 5: Visualización texto creado por cv2.putText

Tipos de fuentes que se pueden usar para texto en OpenCV

Existe otra forma de especificar el tipo de fuente del texto, y es con números, esto ya viene dado por OpenCV, veamos los tipos de letras que podemos usar, y sus números asignados.

  • FONT_HERSHEY_SIMPLEX = 0
  • FONT_HERSHEY_PLAIN = 1
  • FONT_HERSHEY_DUPLEX = 2
  • FONT_HERSHEY_COMPLEX = 3
  • FONT_HERSHEY_TRIPLEX = 4
  • FONT_HERSHEY_COMPLEX_SMALL = 5
  • FONT_HERSHEY_SCRIPT_SIMPLEX = 6
  • FONT_HERSHEY_SCRIPT_COMPLEX = 7

Veamos el código aplicando estos distintos tipos de fuentes:

import cv2
import numpy as np

imagen = 255*np.ones((400,600,3),dtype=np.uint8)

cv2.putText(imagen,'Practicando con OpenCV',(10,30),0,1,(255,0,0),2)
cv2.putText(imagen,'Practicando con OpenCV',(10,60),1,1,(255,0,0),2)
cv2.putText(imagen,'Practicando con OpenCV',(10,90),2,1,(255,0,0),2)
cv2.putText(imagen,'Practicando con OpenCV',(10,120),3,1,(255,0,0),2)
cv2.putText(imagen,'Practicando con OpenCV',(10,150),4,1,(255,0,0),2)
cv2.putText(imagen,'Practicando con OpenCV',(10,180),5,1,(255,0,0),2)
cv2.putText(imagen,'Practicando con OpenCV',(10,210),6,1,(255,0,0),2)
cv2.putText(imagen,'Practicando con OpenCV',(10,240),7,1,(255,0,0),2)
cv2.imshow('imagen',imagen)
cv2.waitKey(0)
cv2.destroyAllWindows()

En las líneas 6 a la 13 podemos ver como se aplica la función cv2.putText, las únicas diferencias están en la ubicación de cada texto y la asignación de la fuente a través de números, el resultado sería el siguiente:

Figura 6: Visualización las distintas fuentes para texto usadas en cv2.putText

Recuerda que para especificar el tipo de fuente puedes usar los números asignados por OpenCV o asignar previamente el tipo de fuente a una variable como lo hicimos en un principio.

Y es aquí donde terminamos el post de hoy, recuerda revisar las imágenes resumen que te pueden ayudar con el estudio de estas funciones. Nos vemos en el siguiente post.

#infoOmes