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