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.