Requisitos previos: OpenCV
OpenCV es una biblioteca de código abierto que se usa principalmente para procesar imágenes y videos para identificar formas, objetos, texto, etc. Se usa principalmente con python. En este artículo vamos a ver cómo detectar formas en imagen. Para esto necesitamos la función cv2.findContours() de OpenCV, y también vamos a usar la función cv2.drawContours() para dibujar bordes en las imágenes. Un contorno es un contorno o un límite de forma.
Acercarse
- Módulo de importación
- Importar imagen
- Convertirlo a imagen en escala de grises
- Aplique el umbral en la imagen y luego descubra los contornos.
- Ejecute un ciclo en el rango de contornos e itere a través de él.
- En este ciclo, dibuje un contorno de formas (Usando drawContours() ) y descubra el punto central de la forma.
- Clasifique la forma detectada sobre la base de una cantidad de puntos de contorno que tiene y coloque el nombre de la forma detectada en el punto central de la forma.
Función utilizada
- cv2.findContours(): Básicamente, este método descubre todos los puntos límite de la forma en la imagen.
Sintaxis: cv2.findContours(src, contorno_recuperación, contornos_aproximación)
Parámetros:
- src: imagen de entrada n-dimensional (pero en nuestro ejemplo vamos a usar una imagen bidimensional, que es la
preferida).- recuperación_de_contorno:
- cv.RETR_EXTERNAL: recupera solo los contornos exteriores extremos
- cv.RETR_LIST: recupera todos los contornos sin establecer relaciones jerárquicas.
- cv.RETR_TREE: recupera todos los contornos y reconstruye una jerarquía completa de contornos anidados.
- contornos_aproximación:
- cv.CHAIN_APPROX_NONE: Almacenará todos los puntos límite.
- cv.CHAIN_APPROX_SIMPLE: almacenará la cantidad de puntos finales (por ejemplo, en el caso de un rectángulo, almacenará 4)
Valor de retorno: lista de puntos de contorno
- cv2.drawContours() : este método dibuja un contorno. También puede dibujar una forma si proporciona puntos de contorno.
Sintaxis: cv.DrawContours(src, contorno, índice de contorno, color, grosor)
Parámetros:
- src: imagen n dimensional
- contorno: puntos de contorno que puede ser una lista.
- índice de contorno:
- -1: dibujar todos los contornos
- Para dibujar un contorno individual, podemos pasar aquí el valor del índice
- color: valores de color
- grosor: tamaño del contorno
Aporte:
Programa:
Python3
import cv2 import numpy as np from matplotlib import pyplot as plt # reading image img = cv2.imread('shapes.png') # converting image into grayscale image gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # setting threshold of gray image _, threshold = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # using a findContours() function contours, _ = cv2.findContours( threshold, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) i = 0 # list for storing names of shapes for contour in contours: # here we are ignoring first counter because # findcontour function detects whole image as shape if i == 0: i = 1 continue # cv2.approxPloyDP() function to approximate the shape approx = cv2.approxPolyDP( contour, 0.01 * cv2.arcLength(contour, True), True) # using drawContours() function cv2.drawContours(img, [contour], 0, (0, 0, 255), 5) # finding center point of shape M = cv2.moments(contour) if M['m00'] != 0.0: x = int(M['m10']/M['m00']) y = int(M['m01']/M['m00']) # putting shape name at center of each shape if len(approx) == 3: cv2.putText(img, 'Triangle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) elif len(approx) == 4: cv2.putText(img, 'Quadrilateral', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) elif len(approx) == 5: cv2.putText(img, 'Pentagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) elif len(approx) == 6: cv2.putText(img, 'Hexagon', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) else: cv2.putText(img, 'circle', (x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255, 255, 255), 2) # displaying the image after drawing contours cv2.imshow('shapes', img) cv2.waitKey(0) cv2.destroyAllWindows()
Producción:
Publicación traducida automáticamente
Artículo escrito por patildhanu4111999 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA