Los contornos se definen como la línea que une todos los puntos a lo largo del límite de una imagen que tienen la misma intensidad. Los contornos son útiles en el análisis de formas, en encontrar el tamaño del objeto de interés y en la detección de objetos.
OpenCV tiene findContour()
una función que ayuda a extraer los contornos de la imagen. Funciona mejor en imágenes binarias, por lo que primero debemos aplicar técnicas de umbralización, bordes de Sobel, etc.
A continuación se muestra el código para encontrar contornos:
import cv2 import numpy as np # Let's load a simple image with 3 black squares image = cv2.imread('C://Users//gfg//shapes.jpg') cv2.waitKey(0) # Grayscale gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # Find Canny edges edged = cv2.Canny(gray, 30, 200) cv2.waitKey(0) # Finding Contours # Use a copy of the image e.g. edged.copy() # since findContours alters the image contours, hierarchy = cv2.findContours(edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow('Canny Edges After Contouring', edged) cv2.waitKey(0) print("Number of Contours found = " + str(len(contours))) # Draw all contours # -1 signifies drawing all contours cv2.drawContours(image, contours, -1, (0, 255, 0), 3) cv2.imshow('Contours', image) cv2.waitKey(0) cv2.destroyAllWindows()
Salida:
Vemos que hay tres argumentos esenciales en cv2.findContours()
función. El primero es la imagen de origen, el segundo es el modo de recuperación de contornos, el tercero es el método de aproximación de contornos y genera la imagen, los contornos y la jerarquía. ‘ contornos ‘ es una lista de Python de todos los contornos de la imagen. Cada contorno individual es una array Numpy de coordenadas (x, y) de puntos límite del objeto.
Método de aproximación de contornos:
arriba, vemos que los contornos son los límites de una forma con la misma intensidad. Almacena las coordenadas (x, y) del límite de una forma. ¿Pero almacena todas las coordenadas? Eso se especifica mediante este método de aproximación de contorno.
Si pasamos cv2.CHAIN_APPROX_NONE
, todos los puntos límite se almacenan. Pero en realidad, ¿necesitamos todos los puntos? Por ejemplo, si tenemos que encontrar el contorno de una línea recta. Solo necesitamos dos extremos de esa línea. Esto es lo que cv2.CHAIN_APPROX_SIMPLE
hace. Elimina todos los puntos redundantes y comprime el contorno, ahorrando así memoria.
Publicación traducida automáticamente
Artículo escrito por Sourabh_Sinha y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA