OpenCV Trouver des contours
Ce tutoriel abordera la recherche de contours présents dans une image à l’aide de la fonction findContours()
d’OpenCV en Python.
Utilisez la fonction findContours()
d’OpenCV pour rechercher des contours dans une image en Python
Les contours sont des courbes formées en joignant les points avec la limite d’un objet. Dans les images, il y a plusieurs objets présents, et en trouvant les contours de l’image, nous pouvons obtenir des informations sur la forme des objets car les contours mettront en évidence les limites des objets présents dans l’image.
Si nous connaissons les formes des objets, nous pouvons facilement deviner quels objets sont présents dans l’image. Les contours sont largement utilisés pour analyser des formes et détecter et reconnaître des objets.
On peut utiliser la fonction findContours()
d’OpenCV pour trouver les contours présents dans une image. Il faut utiliser une image binaire pour trouver les contours pour une meilleure précision.
Si l’image donnée n’est pas binaire, nous pouvons la convertir en binaire. Par exemple, dans le cas de l’image colorée, il faut convertir l’image en niveaux de gris à l’aide de la fonction cvtColor()
d’OpenCV.
Nous pouvons utiliser l’image en niveaux de gris à l’intérieur de la fonction threshold() d’OpenCV pour trouver l’image binaire. Après cela, nous pouvons utiliser la fonction findContours()
et l’image binaire pour trouver les contours.
Si nous voulons montrer les contours, nous devons créer un dessin et tracer les contours à l’aide de la fonction drawContours()
. Le dessin doit être de la même taille que l’image donnée pour mieux visualiser les contours.
Nous pouvons créer un dessin en couleur noire de la même taille que l’image donnée en utilisant la fonction zeros() de la bibliothèque numpy
.
Par exemple, lisons une image à l’aide de la fonction imread()
, convertissons-la en échelle binaire, puis trouvons les contours et montrons-les. Voir le code ci-dessous.
import cv2
import numpy as np
image = cv2.imread("cat.jpg")
cv2.imshow("Original Image", image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray Image", gray)
_, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
cv2.imshow("Binary image", binary)
contours, hierarchy = cv2.findContours(
binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
drawing = np.zeros((gray.shape[0], gray.shape[1], 3), dtype=np.uint8)
CountersImg = cv2.drawContours(drawing, contours, -1, (255, 255, 0), 3)
cv2.imshow("Contours", CountersImg)
cv2.waitKey(0)
Production :
La fonction findContours()
renvoie deux arguments de sortie. Le premier argument de sortie contient les points d’emplacement et les coordonnées du contour dans une liste. Le deuxième argument de sortie contient la hiérarchie des contours.
La première entrée de la fonction findContours()
est une image binaire ou en niveaux de gris. Le deuxième argument d’entrée est le mode de récupération utilisé pour définir la hiérarchie des contours.
Nous pouvons passer différentes valeurs à l’intérieur du mode de récupération comme cv2.RETR_LIST
pour récupérer tous les contours, cv2.RETR_EXTERNAL
pour récupérer uniquement les compteurs externes, cv2.RETR_COMP
pour récupérer les contours dans la hiérarchie à 2 niveaux et cv2.RETR_TREE
pour récupérer les contours dans la hiérarchie complète. Le troisième argument d’entrée de la fonction findContours()
est la méthode approximative utilisée pour stocker les points frontières.
La méthode cv2.CHAIN_APPROX_NONE
stocke tous les points frontières, mais parfois nous n’avons pas besoin de tous les points frontières. Nous pouvons utiliser la méthode cv2.CHAIN_APPROX_SIMPLE
pour stocker les contours des points de départ et d’arrivée.
On peut aussi définir un décalage qui décalera chaque contour en fonction du décalage dans la fonction findContours()
. Nous pouvons également afficher les contours au-dessus de l’image donnée en utilisant la fonction drawContours()
d’OpenCV.
Le premier argument de la fonction drawContours()
est l’image dont on veut dessiner les contours. Le deuxième argument est les contours et le troisième est l’indice de contour.
Le troisième argument est la couleur des contours, et il peut être défini comme un triplet RVB. Le quatrième argument est l’épaisseur des contours qui peut être définie comme un nombre entier.
Par exemple, montrons le contour au-dessus de l’image donnée. Voir le code ci-dessous.
import cv2
import numpy as np
image = cv2.imread("cat.jpg")
cv2.imshow("Original Image", image)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("Gray Image", gray)
_, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)
cv2.imshow("Binary image", binary)
contours, hierarchy = cv2.findContours(
binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
drawing = np.zeros((gray.shape[0], gray.shape[1], 3), dtype=np.uint8)
CountersImg = cv2.drawContours(drawing, contours, -1, (255, 255, 0), 3)
cv2.imshow("Contours", CountersImg)
ImgWithCounter = cv2.drawContours(image, contours, -1, (255, 255, 0), 3)
cv2.imshow("Image with counters", ImgWithCounter)
cv2.waitKey(0)
Production :