¿Cómo detectar formas en imágenes en Python usando OpenCV?

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *