Wir haben mit dem Erlernen der Grundlagen von OpenCV begonnen und dann einige grundlegende Bildverarbeitungen und Manipulationen an Bildern durchgeführt, gefolgt von Bildsegmentierungen und vielen anderen Vorgängen mit OpenCV und Python. In diesem Abschnitt werden einige einfache Objekterkennungstechniken unter Verwendung des Vorlagenabgleichs durchgeführt. Wir werden ein Objekt in einem Bild finden und dann seine Merkmale beschreiben. Merkmale sind die allgemeinen Attribute des Bildes wie Ecken, Kanten usw. Wir werden uns auch einige gängige und beliebte Objekterkennungsalgorithmen wie SIFT, SURF, FAST, BREIF & ORB ansehen.
Wie in den vorherigen Tutorials beschrieben, ist OpenCV eine Open Source Commuter Vision Library, die über C ++ -, Python- und Java-Schnittstellen verfügt und Windows, Linux, Mac OS, iOS und Android unterstützt. So kann es einfach in Raspberry Pi mit Python- und Linux-Umgebung installiert werden. Mit Raspberry Pi mit OpenCV und angeschlossener Kamera können viele Echtzeit-Bildverarbeitungsanwendungen wie Gesichtserkennung, Gesichtsverriegelung, Objektverfolgung, Erkennung von Autokennzeichen, Haussicherungssystem usw. erstellt werden.
Objekterkennung und -erkennung bilden den wichtigsten Anwendungsfall für Computer Vision. Sie werden verwendet, um leistungsstarke Aufgaben wie z
- Szenen beschriften
- Roboternavigation
- Selbstfahrende Autos
- Körpererkennung (Microsoft Kinect)
- Krankheits- und Krebserkennung
- Gesichtserkennung
- Handschrifterkennung
- Objekte in Satellitenbildern identifizieren
Objekterkennung VS Erkennung
Die Objekterkennung ist die zweite Ebene der Objekterkennung, bei der der Computer ein Objekt aus mehreren Objekten in einem Bild erkennen und möglicherweise identifizieren kann.
Jetzt werden wir einige Bildverarbeitungsfunktionen ausführen, um ein Objekt aus einem Bild zu finden.
Suchen eines Objekts aus einem Bild
Hier verwenden wir die Vorlagenübereinstimmung zum Suchen von Zeichen / Objekten in einem Bild. Verwenden Sie die OpenCV- Funktion cv2.matchTemplate () , um dieses Objekt zu finden
import cv2 import numpy as np
Laden Sie das Eingabebild und konvertieren Sie es in Grau
image = cv2.imread ('WaldoBeach.jpg') cv2.imshow ('people', image) cv2.waitKey (0) grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Laden Sie das Vorlagenbild
template = cv2.imread ('waldo.jpg', 0) # Ergebnis der Vorlagenübereinstimmung des Objekts über ein Bildergebnis = cv2.matchTemplate (grau, Vorlage, cv2.TM_CCOEFF) sin_val, max_val, min_loc, max_loc = cv2.minMaxLoc (Ergebnis)
Begrenzungsrahmen erstellen
top_left = max_loc # Erhöht die Größe des Begrenzungsrechtecks um 50 Pixel. bottom_right = (top_left + 50, top_left + 50) cv2.rectangle (Bild, top_left, bottom_right, (0,255,0), 5) cv2.imshow ('Objekt gefunden'), Bild) cv2.waitKey (0) cv2.destroyAllWindows ()
Geben Sie in cv2.matchTemplate (grau, Vorlage, cv2.TM_CCOEFF) das Graustufenbild ein, um das Objekt und die Vorlage zu finden. Wenden Sie dann die Template-Matching-Methode an, um die Objekte aus dem Bild zu finden. Hier wird cv2.TM_CCOEFF verwendet.
Die gesamte Funktion gibt ein Array zurück, das als Ergebnis eingegeben wird. Dies ist das Ergebnis der Template-Matching-Prozedur.
Und dann verwenden wir cv2.minMaxLoc (Ergebnis) , das die Koordinaten oder den Begrenzungsrahmen angibt , in dem das Objekt in einem Bild gefunden wurde. Wenn wir diese Koordinaten erhalten, zeichnen Sie ein Rechteck darüber und strecken ein wenig die Abmessungen des Felds so Objekt kann leicht in das Rechteck passen.
Es gibt verschiedene Methoden, um einen Vorlagenabgleich durchzuführen. In diesem Fall verwenden wir cv2.TM_CCOEFF, was für Korrelationskoeffizient steht.
Hier sind die Schlüsselpunkte (X, Y) -Koordinaten, die mit dem Siebdetektor extrahiert und mit der cv2-Zeichenschlüsselfunktion über das Bild gezeichnet wurden.
SURFEN
cv2 importieren numpy als np importieren image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Erstellen Sie das SURF Feature Detector-Objekt. Hier setzen wir den hessischen Schwellenwert auf 500
surf = cv2.xfeatures2d.SURF_create (500) Schlüsselpunkte, Deskriptoren = surf.detectAndCompute (grau, keine) print ("Anzahl der erkannten Schlüsselpunkte:", len (Schlüsselpunkte))
Zeichnen Sie wichtige Punkte auf das Eingabebild
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature-Methode - SURF', image) cv2.waitKey () cv2.destroyAllWindows ()
Konsolenausgabe:
SCHNELL
cv2 importieren numpy als np importieren image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Erstellen Sie ein FAST Detector-Objekt
schnell = cv2.FastFeatureDetector_create () # Kernpunkte erhalten, die standardmäßig Unterdrückung nicht max ist auf # set auszuschalten fast.setBool ('nonmaxSuppression', False) keypoints = fast.detect (grau, None) print ("Anzahl der keypoints Erkannt: ", len (Schlüsselpunkte))
Zeichnen Sie reichhaltige Schlüsselpunkte auf dem Eingabebild
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Funktionsmethode - SCHNELL ', image) cv2.waitKey () cv2.destroyAllWindows ()
Konsolenausgabe:
KURZ
cv2 importieren numpy als np importieren image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Erstellen Sie ein FAST-Detektorobjekt
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create ()
Erstellen Sie ein kurzes Extraktionsobjekt
#brief = cv2.DescriptorExtractor_create ("BRIEF") # Bestimmen Sie die wichtigsten Punkte keypoints = fast.detect (grau, Keine)
Erhalten Sie mit BRIEF Deskriptoren und neue endgültige Schlüsselpunkte
Schlüsselpunkte, Deskriptoren = brief.compute (grau, Schlüsselpunkte) print ("Anzahl der erkannten Schlüsselpunkte:", len (Schlüsselpunkte))
Zeichnen Sie reichhaltige Schlüsselpunkte auf dem Eingabebild
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Feature Method - BRIEF', image) cv2.waitKey () cv2.destroyAllWindows ()
Konsolenausgabe:
ORB
cv2 importieren numpy als np importieren image = cv2.imread ('paris.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY)
Wenn Sie ein ORB-Objekt erstellen, können Sie die Anzahl der gewünschten Schlüsselpunkte angeben
orb = cv2.ORB_create () # Schlüsselpunkte bestimmen keypoints = orb.detect (grau, keine)
Besorgen Sie sich die Deskriptoren
Schlüsselpunkte, Deskriptoren = orb.compute (grau, Schlüsselpunkte) print ("Anzahl der erkannten Schlüsselpunkte:", len (Schlüsselpunkte))
Zeichnen Sie reichhaltige Schlüsselpunkte auf dem Eingabebild
image = cv2.drawKeypoints (image, keypoints, None, flags = cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) cv2.imshow ('Funktionsmethode - ORB', image) cv2.waitKey () cv2.destroyAllWindows ()
Konsolenausgabe:
Wir können die Anzahl der Schlüsselpunkte angeben, die eine maximale Grenze von 5000 haben. Der Standardwert ist jedoch 500, dh ORB erkennt automatisch die besten 500 Schlüsselpunkte, wenn sie für keinen Wert der Schlüsselpunkte angegeben werden.
Auf diese Weise erfolgt die Objekterkennung in OpenCV. Dieselben Programme können auch in dem in OpenCV installierten Raspberry Pi ausgeführt und als tragbares Gerät wie Smartphones mit Google Lens verwendet werden.
Dieser Artikel stammt aus dem Master Computer Vision ™ OpenCV4 in Python mit dem von Rajeev Ratan erstellten Deep Learning-Kurs über Udemy. Abonnieren Sie ihn, um mehr über Computer Vision und Python zu erfahren.