Dibujar con el mouse en imágenes usando Python-OpenCV

OpenCV es una enorme biblioteca de código abierto para visión artificial, aprendizaje automático y procesamiento de imágenes. OpenCV admite una amplia variedad de lenguajes de programación como Python, C++, Java, etc. Puede procesar imágenes y videos para identificar objetos, rostros o incluso la escritura a mano de un ser humano. En este artículo, intentaremos dibujar imágenes con la ayuda del mouse. Antes de aprender a dibujar imágenes con el mouse, debemos comprender qué es una devolución de llamada.<

Llamar de vuelta

Una devolución de llamada en programación significa llamar a esta función (la devolución de llamada) cuando se completa un proceso. Lo mismo se aplica a la programación orientada a eventos en general. Cuando se hace clic en un botón del mouse (un evento), llama a una función. No sabemos cuándo se hará clic en el botón. Todo lo que podemos hacer es decirle al botón que «me devuelva la llamada» o llamar a esta función cuando se hace clic en el botón del mouse.

Devoluciones de llamada del ratón

Una devolución de llamada puede ocurrir cuando un usuario realiza una operación con el mouse; esta operación se conoce generalmente como un evento. Solo hay una devolución de llamada presente para un mouse, que es setMouseCallback() , todas las operaciones del mouse llamarán solo a esta función.

Podemos tener bloques condicionales para ejecutar algo en función del evento/operación realizada con el mouse. Los eventos/operaciones del ratón podrían ser:

  • EVENT_MOUSEMOVE
  • EVENTO_LBOTÓNABAJO
  • EVENTO_RBOTÓN ABAJO
  • EVENT_LBBOTÓN ARRIBA
  • EVENT_RBUTTONUP

¿Cuándo debería ocurrir esta devolución de llamada?

Queremos recuperar esta llamada solo cuando usamos el mouse en la ventana emergente, que tiene el título «Título de la ventana emergente».

cv2.namedWindow("Title of Popup Window")

Ejemplo 1: dibuja un círculo cuando hacemos clic izquierdo en una ventana emergente con OpenCV:

import cv2
  
  
img = cv2.imread("flower.jpg")
  
def draw_circle(event, x, y, flags, param):
      
    if event == cv2.EVENT_LBUTTONDOWN:
        print("hello")
        cv2.circle(img, (x, y), 100, (0, 255, 0), -1)
          
cv2.namedWindow(winname = "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", draw_circle)
  
while True:
    cv2.imshow("Title of Popup Window", img)
      
    if cv2.waitKey(10) & 0xFF == 27:
        break
          
cv2.destroyAllWindows()

Producción:

Ejemplo 2: dibujar un rectángulo arrastrando imágenes con OpenCV

import cv2
  
  
img = cv2.imread("flower.jpg")
  
# variables
ix = -1
iy = -1
drawing = False
  
def draw_rectangle_with_drag(event, x, y, flags, param):
      
    global ix, iy, drawing, img
      
    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix = x
        iy = y            
              
    elif event == cv2.EVENT_MOUSEMOVE:
        if drawing == True:
            cv2.rectangle(img, pt1 =(ix, iy),
                          pt2 =(x, y),
                          color =(0, 255, 255),
                          thickness =-1)
      
    elif event == cv2.EVENT_LBUTTONUP:
        drawing = False
        cv2.rectangle(img, pt1 =(ix, iy),
                      pt2 =(x, y),
                      color =(0, 255, 255),
                      thickness =-1)
          
cv2.namedWindow(winname = "Title of Popup Window")
cv2.setMouseCallback("Title of Popup Window", 
                     draw_rectangle_with_drag)
  
while True:
    cv2.imshow("Title of Popup Window", img)
      
    if cv2.waitKey(10) == 27:
        break
  
cv2.destroyAllWindows()

Producción:

¿Qué hace (cv2.waitKey(10) & 0xFF == 27)?

cv2.waitKey() devuelve un valor entero de 32 bits (puede depender de la plataforma). La entrada clave está en ASCII, que es un valor entero de 8 bits. Entonces, solo te importan estos 8 bits y quieres que todos los demás bits sean 0. Esto lo puedes lograr con:cv2.waitKey(10) & 0xFF == 27

Publicación traducida automáticamente

Artículo escrito por ayushiyadav05 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *