OpenCV Konturen finden

Ammar Ali 12 April 2022
OpenCV Konturen finden

In diesem Tutorial wird das Finden von in einem Bild vorhandenen Konturen mit der Funktion findContours() von OpenCV in Python erläutert.

Verwenden Sie die Funktion findContours() von OpenCV, um Konturen in einem Bild in Python zu finden

Konturen sind Kurven, die durch Verbinden der Punkte mit der Grenze eines Objekts gebildet werden. In Bildern sind mehrere Objekte vorhanden, und wenn wir die Konturen des Bildes finden, können wir Informationen über die Form der Objekte erhalten, da Konturen die Grenzen der im Bild vorhandenen Objekte hervorheben.

Wenn wir die Formen von Objekten kennen, können wir leicht erraten, welche Objekte im Bild vorhanden sind. Konturen werden häufig verwendet, um Formen zu analysieren und Objekte zu erkennen und zu erkennen.

Wir können die Funktion findContours() von OpenCV verwenden, um die in einem Bild vorhandenen Konturen zu finden. Wir müssen ein binäres Bild verwenden, um die Konturen für eine bessere Genauigkeit zu finden.

Wenn das angegebene Bild nicht binär ist, können wir es in binär konvertieren. Beispielsweise müssen wir im Fall des farbigen Bildes das Bild mit der Funktion cvtColor() von OpenCV in Graustufen umwandeln.

Wir können das Graustufenbild in der Funktion threshold() von OpenCV verwenden, um das Binärbild zu finden. Danach können wir die Funktion findContours() und das Binärbild verwenden, um die Konturen zu finden.

Wenn wir die Konturen zeigen wollen, müssen wir eine Zeichnung erstellen und mit der Funktion drawContours() Konturen zeichnen. Die Zeichnung sollte die gleiche Größe wie das gegebene Bild haben, um Konturen besser sichtbar zu machen.

Mit der zeros()-Funktion der numpy-Bibliothek können wir eine schwarze Farbzeichnung in der gleichen Größe wie das angegebene Bild erstellen.

Lesen wir zum Beispiel ein Bild mit der Funktion imread(), wandeln es in die Binärskala um und finden dann die Konturen und zeigen sie an. Siehe Code unten.

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)

Ausgabe:

Konturen finden mit opencv

Die Funktion findContours() gibt zwei Ausgabeargumente zurück. Das erste Ausgabeargument enthält die Positionspunkte und Koordinaten der Kontur in einer Liste. Das zweite Ausgabeargument enthält die Hierarchie der Konturen.

Die erste Eingabe der Funktion findContours() ist ein Binär- oder Graustufenbild. Das zweite Eingabeargument ist der Abrufmodus, der zum Definieren der Konturenhierarchie verwendet wird.

Wir können verschiedene Werte innerhalb des Abrufmodus übergeben, wie cv2.RETR_LIST, um alle Konturen abzurufen, cv2.RETR_EXTERNAL, um nur externe Zähler abzurufen, cv2.RETR_COMP, um Konturen in der 2-Ebenen-Hierarchie abzurufen, und cv2.RETR_TREE zum Abrufen von Konturen in der vollständigen Hierarchie. Das dritte Eingabeargument der Funktion findContours() ist die ungefähre Methode, die zum Speichern der Grenzpunkte verwendet wird.

Die Methode cv2.CHAIN_APPROX_NONE speichert alle Grenzpunkte, aber manchmal brauchen wir nicht alle Grenzpunkte. Wir können die Methode cv2.CHAIN_APPROX_SIMPLE verwenden, um die Konturen der Start- und Endpunkte zu speichern.

Wir können auch einen Versatz definieren, der jede Kontur entsprechend dem Versatz in der Funktion findContours() verschiebt. Wir können die Konturen auch über dem gegebenen Bild anzeigen, indem wir die Funktion drawContours() von OpenCV verwenden.

Das erste Argument der Funktion drawContours() ist das Bild, mit dem wir die Konturen zeichnen möchten. Das zweite Argument sind die Konturen und das dritte der Konturindex.

Das dritte Argument ist die Farbe der Konturen und kann als RGB-Triplett definiert werden. Das vierte Argument ist die Dicke der Konturen, die als ganze Zahl definiert werden kann.

Lassen Sie uns zum Beispiel die Kontur über dem gegebenen Bild anzeigen. Siehe Code unten.

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)

Ausgabe:

Konturen über dem Bild

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Verwandter Artikel - Python OpenCV