Búsqueda de sitios web

Conecte un nuevo punto al punto anterior en una imagen con una línea recta en OpenCV-Python


Es posible que tengamos que dibujar líneas en una imagen para diversos fines, como dibujar, garabatear, seguir los movimientos de un punto, etc., por lo que es necesario saber cómo conectar 2 puntos en el procesamiento de imágenes.

OpenCV es una biblioteca de funciones de programación principalmente para visión por computadora en tiempo real. La biblioteca es multiplataforma y tiene licencia de software gratuito y de código abierto bajo la licencia Apache.

En este artículo, aprenderemos cómo podemos conectar un nuevo punto al punto anterior en una imagen con una línea recta usando OpenCV-Python.

Conectando un Punto con el Anterior

Nuestra tarea es conectar la posición de coordenadas actual en la imagen en la que se realiza el clic del mouse con el punto anterior.

Antes de comenzar los pasos para conectar los puntos debemos saber cómo lo haremos. Una imagen se compone de muchos píxeles que se pueden especificar mediante coordenadas. Podemos seleccionar 2 puntos cualesquiera en esta imagen y ambos tendrán algunas coordenadas. Al conectar estos 2 puntos, podemos dibujar fácilmente una línea. Pero necesitamos tener esas coordenadas con nosotros.

Para dibujar una línea recta entre dos puntos en una imagen podemos usar OpenCV cv2.line(). La sintaxis de este método es:

cv2.line(img, pt1, pt2, color, thickness)

Para dibujar líneas entre cada clic del mouse, debe seguir los pasos que se detallan a continuación:

Paso 1: importar las bibliotecas necesarias

El primer paso es importar las bibliotecas necesarias. Para abrir, leer y manipular las imágenes usaremos la biblioteca Open CV.

import cv2
import numpy as np

Paso 2: leer la imagen

Podemos usar la función cv2.imread() para leer una imagen de un archivo. En el siguiente fragmento, leímos una imagen de un archivo y la mostramos usando la función cv2.imshow.

# Read the image
img = cv2.imread('image.jpg')

# Display the image
cv2.imshow('Image', img)
cv2.waitKey(0)

Paso 3: declarar una lista que contenga todos los puntos

Para realizar un seguimiento de todos los puntos visitados, crearemos una lista en la que agregaremos todos los puntos en las imágenes donde hicimos clic con el mouse.

Point = []

Paso 4: Definir el evento de clic del mouse

El siguiente paso es definir la acción que debemos realizar cada vez que se hace clic con el mouse en cualquier lugar de la pantalla.

  • Primero agregaremos las coordenadas del punto en el que hicimos clic en la lista de puntos.

  • Luego crearemos un pequeño punto para mostrar el punto donde hicimos clic en la imagen.

  • Si hacemos clic en la imagen por primera vez, no es necesario dibujar una línea.

  • Pero después de eso necesitamos trazar una línea entre los últimos 2 puntos de la lista de puntos. Luego mostraremos la nueva imagen.

  • Agregaremos esta función como devolución de llamada a los eventos del mouse.

En el siguiente fragmento, la función cv2.setMouseCallback captura los eventos del mouse y luego agrega la posición del clic del mouse cuando se presiona el botón izquierdo del mouse y almacena las coordenadas del nuevo punto en la lista de puntos. Luego, los últimos 2 puntos disponibles en la lista de puntos se conectan mediante una línea recta.

Aquí hemos utilizado la función cv2.line() para dibujar una línea entre el punto anterior y el nuevo punto. La función toma como entrada las coordenadas de los dos puntos y el color y grosor de la línea. Luego hemos mostrado la imagen con la línea usando la función cv2.imshow.

# Define a callback function to capture mouse events
def mouse_callback(event, x, y, flags, param):
   if event == cv2.EVENT_LBUTTONDOWN:
      points.append((x,y))
      cv2.circle(img,(x,y), 1, (100, 100, 100), -1)
      if len(points) >= 2:
         cv2.line(img, points[-1], points[-2], (0, 0, 10), 2)
      cv2.imshow('image', img)
      
# Set the callback function for mouse events
cv2.setMouseCallback('Image', mouse_callback)

# Wait for the user to click on the image
cv2.waitKey(0)

Paso 6: cerrar todas las ventanas

Finalmente, necesitamos destruir todas las ventanas usando la función destroyAllWindows() –

Cv2.destroyAllWindows()

Ejemplo

Aquí está el código completo para conectar un nuevo punto al punto anterior en una imagen con una línea recta usando OpenCV-Python:

import cv2
import numpy as np
img = cv2.imread('image5.jpg')
cv2.imshow('image',img)
points = []
def click_event(event, x, y, flags, params):
   if event == cv2.EVENT_LBUTTONDOWN:
      points.append((x,y))
      cv2.circle(img,(x,y), 1, (100, 100, 100), -1)
      if len(points) >= 2:
         cv2.line(img, points[-1], points[-2], (0, 0, 10), 2)
         cv2.imshow('image', img)
cv2.setMouseCallback('image', click_event)
cv2.waitKey(0)
cv2.destroyAllWindows()

Producción

Conclusión

En este artículo vimos cómo podemos conectar un punto nuevo a un punto anterior en una imagen con una línea recta usando la biblioteca OpenCV del lenguaje Python. Seguimos todos los pasos necesarios para leer la imagen, definiendo el punto anterior y el nuevo y luego conectando los puntos con una línea recta. Conocimos la biblioteca Opencv de Python y sus aplicaciones en el procesamiento de imágenes.

Artículos relacionados: