FUNCIONES DE DIBUJO en OpenCV – Python
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:
¿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:
¿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:
¿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.
¿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
.
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:
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.
no se que estas usando como editor me gustaria que me indicaras para tus tutoriales
que debo de tener instalado en mi compu, ya que tienes eb ynos tutoriales sublime, en este de funciones de dibujo no se cual es
me gustaria saber eso bien que programas necesito
Hola Armida, con este tutorial: https://youtu.be/6R_VU958jPY Ya tendrías todo lo necesario para seguir los tutoriales. Puedes usar cualquier editor de texto o ide para desarrollarlos. En este tutorial también uso Sublime text. 🙂
Hola
Tenia esa pregunta dias, buscando y viendo otros videos vi que se puede hacer desde el mismo IDLE de Python, para correr el programa usas el F5 y todo bien…
Saludos. 🙂
Muchas gracias por el tutorial.
Se pueden dibujar formas geométricas con transparencia, canal alpha por ejemplo?
No he podido encontrar un módulo qu e me permita hacer este tipo de dibujos.
Hola Néstor, podrías usar algo parecido a lo de este videotutorial: https://youtu.be/R6wgJ6epakU y crear tu imagen binaria para que represente el canal alpha.
Hola, como puedo hacer para que la ventana de dibujo me ocupe toda la pantalla, algo así como un fullscreen, gracias.
Hola Julian, podrías usar una imagen más grande, o a su vez redimensionarla con ayuda de imutils o cv2.resize.
Hola, felicidades por el blog, me está ayudando muchisimo!!! tengo una duda a ver si me puedes ayudar? como podria hacer para que se imprimiera en la foto el valor de una variable? se usa putText? gracias anticipadas
Hola, tengo una duda, se puede dibujar estas funciones pero con los colores en HSV? o que transformación se tendría que realizar para poder hacerlo? Gracias