[Reimpreso] Introducción al esquema de la serie OpenCV-Python (27)

Esta vez discutiremos los contornos en OpenCV. Los contornos son una parte muy importante de OpenCV. Al mismo tiempo, la detección de bordes Canny que hemos mencionado antes servirá como base.

Detección de contornos

Prototipo de función:

cv2.findContours (imagen, modo, método, contornos = Ninguno, jerarquía = Ninguno, desplazamiento = Ninguno)

Significado del parámetro: la
imagen representa la imagen de entrada. Tenga en cuenta que la imagen de entrada debe ser una imagen binaria. Si la imagen de entrada es una imagen en color, primero debe ser en escala de grises y binarizada.

El modo representa el modo de recuperación del contorno, hay 4 tipos:

cv2.RETR_EXTERNAL significa que solo se detecta el contorno exterior.

El contorno detectado por cv2.RETR_LIST no establece una relación jerárquica.

cv2.RETR_CCOMP establece dos niveles de contornos, la capa superior es el límite exterior y la capa interior es la información del límite del agujero interior. Si hay un objeto conectado en el agujero interior, el límite de este objeto también está en la capa superior.

cv2.RETR_TREE construye el esquema de una estructura de árbol jerárquica.

El método es el método aproximado de contorno, hay 4 tipos:

cv2.CHAIN_APPROX_NONE almacena todos los puntos de contorno, y la diferencia de posición de píxel entre dos puntos adyacentes no excede 1, es decir, max (abs (x1-x2), abs (y2-y1)) <= 1.

cv2.CHAIN_APPROX_SIMPLE comprime elementos en las direcciones horizontal, vertical y diagonal, y solo retiene las coordenadas del punto final en esa dirección. Por ejemplo, un contorno rectangular solo necesita 4 puntos para guardar la información del contorno.

cv2.CHAIN_APPROX_TC89_L1 y cv2.CHAIN_APPROX_TC89_KCOS utilizan el algoritmo de aproximación de cadena teh-Chinl.

valor de retorno:

La función cv2.findContours () devuelve dos valores, uno es el contorno del contorno en sí y el otro es la jerarquía de atributos correspondiente a cada contorno.

Normalmente, elegimos el parámetro cv2.CHAIN_APPROX_SIMPLE, porque solo necesitamos la información más simple del punto de contorno.

Dibujo de contorno

Ahora miramos otra función:

cv2.drawContours (imagen, contornos, contourIdx, color, espesor = Ninguno, lineType = Ninguno, jerarquía = Ninguno, maxLevel = Ninguno, desplazamiento = Ninguno)

El primer parámetro es especificar en qué imagen dibujar el contorno; la imagen solo puede mostrar el contorno con tres canales

El segundo parámetro es el contorno mismo, que es una lista en Python;

El tercer parámetro especifica qué contorno en la lista de contornos dibujar, si es -1, dibuje todos los contornos en él. Los siguientes parámetros son muy simples. Espesor indica el ancho de la línea de contorno, si es -1 (cv2.FILLED), es el modo de llenado.

A continuación tomamos esta imagen como ejemplo:
Inserte la descripción de la imagen aquí

Ahora llegamos al combate de código real:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("contours.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
contour = cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]  
cv2.drawContours(img,contour,-1,(0,0,255),2)  
cv2.imshow("res",img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Inserte la descripción de la imagen aquí

También podemos cambiar los parámetros:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("contours.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
contour = cv2.findContours(gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[0]  
cv2.drawContours(img,contour,-1,(0,0,255),2)  
cv2.imshow("res",img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Cambie RETR_EXTERNAL a RETR_TREE para detectar todos los contornos (previamente para detectar contornos externos):
Inserte la descripción de la imagen aquí

Ahora también podemos seleccionar el contorno, necesitamos modificar los parámetros de drawContours, el código:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("contours.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
contour = cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]  
cv2.drawContours(img,contour,1,(0,0,255),2)  
cv2.imshow("res",img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Inserte la descripción de la imagen aquí

Modificando el tercer parámetro, podemos personalizar qué contorno seleccionar, lo cual es muy conveniente para nuestras otras operaciones posteriores.

Del mismo modo, también podemos calcular varios contornos. Aplicar Numpy. Veamos el código:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("contours.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
contour = cv2.findContours(gray,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[0]  
print(np.array(contour).shape)  
cv2.drawContours(img,contour,1,(0,0,255),2)  
cv2.imshow("res",img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Inserte la descripción de la imagen aquí

La siguiente columna de salida imprimirá el número de contornos, cambiará los parámetros y volverá a intentarlo:

view plaincopy to clipboardprint?
import cv2  
import numpy as np  
  
img = cv2.imread("contours.png")  
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)  
contour = cv2.findContours(gray,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[0]  
print(np.array(contour).shape)  
cv2.drawContours(img,contour,1,(0,0,255),2)  
cv2.imshow("res",img)  
cv2.waitKey(0)  
cv2.destroyAllWindows()  

Inserte la descripción de la imagen aquí

Este tutorial ha hecho una introducción básica a los contornos, la próxima vez presentaremos algún otro contenido sobre contornos.

Consulte la página de resumen del artículo https://blog.csdn.net/weixin_44237705/article/details/107864965
Se puede intercambiar más información técnica de openvino en el grupo ~
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_44237705/article/details/108572914
Recomendado
Clasificación