Búsqueda de sitios web

Dibuja una forma rectangular y extrae objetos usando OpenCV de Python


OpenCV es una biblioteca de visión por computadora de código abierto en Python. Proporciona numerosas funciones para realizar diversas operaciones de procesamiento de imágenes y videos. La biblioteca utiliza el módulo Numpy para representar todos los cuadros de video e imágenes como un tipo ndarray. Necesita la biblioteca numpy, debemos asegurarnos de que el módulo numpy también esté instalado en nuestro intérprete de Python.

En este artículo, veremos diferentes formas de dibujar formas rectangulares y extraer el objeto usando Python OpenCV.

Dibujar un rectángulo

Para dibujar la forma rectangular en una imagen, el módulo Python OpenCV proporciona un método llamado cv2.rectangle(). Este método dibujará las formas rectangulares en una imagen. La siguiente es la sintaxis:

cv.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]	)

Parámetros

  • img: La imagen de origen donde dibujar el rectángulo.

  • pt1: una tupla con las coordenadas xey de uno de los vértices del rectángulo (la esquina superior izquierda del rectángulo)

  • pt2: Una tupla con las coordenadas xey del vértice opuesto del rectángulo, respecto al anterior (la esquina inferior derecha del rectángulo).

  • color: Especifica el color del rectángulo.

  • espesor: Es un parámetro opcional. Especifica el grosor de las líneas del rectángulo. Y el grosor predeterminado es 1.

x1,y1----------|
|		   | 
| 		   |
| ------------x2,y2

Por tanto las coordenadas de pt1 pt2 serán (x1,y1) y (x2,y2) respectivamente.

Usando dimensiones predefinidas

En este enfoque, dibujaremos la forma rectangular en una imagen utilizando las coordenadas predefinidas. Lo que significa que definiremos el valor pt1, pt2 manualmente.

Ejemplo

En este ejemplo, usaremos las coordenadas de la imagen para dibujar y extraer el objeto de una forma rectangular.

import cv2
import numpy as np

# Load the image
img = cv2.imread("Images/Tajmahal.jpg")

# Define the dimensions and position of the rectangle using two points
top_left = (80, 80)
bottom_right = (500, 300)

# defining the colour and thickness of the rectangle
thickness = 2 
color = (0, 255, 0) # Green color
shape = cv2.rectangle(img, top_left, bottom_right, color, thickness)

# Extracting objects from the rectangular area
rect_area = img[top_left[0]:bottom_right[1], top_left[1]:bottom_right[0]]

# Display the image with the drawn rectangle
cv2.imshow("Image with Rectangle", img)

# Display the extracted rectangular area
cv2.imshow("Rectangular Area", rect_area)

cv2.waitKey(0)
cv2.destroyAllWindows()

Producción

Imagen recortada

Usar indicadores de eventos del mouse

Para dibujar formas rectangulares en una imagen, aquí usaremos el siguiente evento del mouse:

  • cv2.EVENT_RBUTTONDOWN: indica que se presiona el botón derecho.

  • cv2.EVENT_LBUTTONUP: indica que se soltó el botón izquierdo

Además, usaremos la función setMouseCallback() para configurar el controlador de eventos del mouse para la ventana especificada.

La función setMouseCallback()

La función se utiliza para especificar qué función debe llamarse para una ventana específica. En otras palabras, la función crea un controlador de eventos del mouse para la ventana especificada.

Sintaxis

cv2.setMouseCallback(winname, onMouse, userdata)

Parámetros

  • Winname: Nombre de la ventana específica.

  • OnMouse: función de devolución de llamada para eventos del mouse.

  • Datos de usuario: el parámetro opcional pasado a la devolución de llamada.

Este enfoque se puede ejecutar utilizando la interfaz de línea de comando. Entonces aquí usaremos el módulo argparse ya que proporciona una interfaz conveniente para manejar los argumentos de la línea de comando.

Inicialmente, configuraremos una función de devolución de llamada del mouse en un método nombradoWindow() para leer las coordenadas rectangulares donde dibuja el usuario. Y al usar los eventos de clic del mouse, identificaremos las coordenadas xey y luego dibujaremos la forma rectangular usando la función cv2.rectangle().

Nota : para ejecutar este código, debemos guardar el archivo del programa e ingresar la imagen en la misma ubicación y luego ejecutar el siguiente comando en el símbolo del sistema.

Python program_file_name.py --image source_image_name.jpg

Ejemplo

Tomemos un ejemplo para dibujar la forma rectangular para extraer el objeto.

import cv2
import argparse

point = []
crop = False
  
def shape_selection(event, x, y, flags, param):
   # grab references to the global variables
   global point, crop
   
   # Record the starting(x, y) coordinates when the left mouse button was clicked
   if event == cv2.EVENT_LBUTTONDOWN:
      point = [(x, y)]
   
   # check to see if the left mouse button was released
   elif event == cv2.EVENT_LBUTTONUP:
      # record the ending (x, y) coordinates 
      point.append((x, y))
   
      # draw a rectangle
      cv2.rectangle(image, point[0], point[1], (0, 255, 0), 2)
      cv2.imshow("image", image)
  
# construct the argument parser and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help ="Images/Dog.jpg")
args = vars(ap.parse_args())
  
# load the image
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
# setting the mouse callback function
cv2.setMouseCallback("image", shape_selection)
  
# keep looping until the 'q' key is pressed
while True:
    # display the image and wait for a keypress
    cv2.imshow("image", image)
    key = cv2.waitKey(1) & 0xFF
  
    # press 'r' to reset window 
    if key == ord("r"):
        image = clone.copy()
  
    # if the 'c' key is pressed, break from the loop
    elif key == ord("c"):
        break

if len(point) == 2:
    crop_img = clone[point[0][1]:point[1][1], point[0][0]:point[1][0]]
    cv2.imshow("crop_img", crop_img)
    cv2.waitKey(0)

    # close all open windows
cv2.destroyAllWindows()

Abra el símbolo del sistema y ejecute el programa anterior usando el siguiente comando:

python test.py --image image5.jpg

Esto generará una ventana que muestra la imagen de entrada en la que puede seleccionar el objeto deseado como se muestra a continuación:

Nota - Después de seleccionar el área deseada de la imagen, presione la tecla C en su teclado para recortar.

Dibujamos con éxito la forma rectangular y extrajimos el objeto seleccionado de la imagen.

Artículos relacionados: