OpenCV-Objekterkennung

Im Bereich der Computer Vision ist die Objekterkennung eine sehr wichtige Aufgabe.

OpenCV ist eine leistungsstarke Open-Source-Bibliothek für Computer Vision, die mehrere Methoden zur Implementierung der Objekterkennung bietet.

In diesem Artikel wird ausführlich erklärt, wie man das Template-Matching-Verfahren in OpenCV (cv2.matchTemplate()) zur Objekterkennung verwendet.

Was ist Template-Matching?

Template-Matching ist eine Technik, um den Bereich in einem Bild zu finden, der einem gegebenen Vorlagenbild am ähnlichsten ist.

Einfach ausgedrückt ist Template-Matching der Prozess, den Teil in einem großen Bild zu finden, der am besten zum Vorlagenbild passt (d. h. dem Objekt, das wir erkennen möchten). Diese Methode eignet sich für Fälle, in denen Größe, Ausrichtung und Form des Objekts im Bild im Wesentlichen unverändert bleiben.

  • Vorlagenbild:Ein Bildausschnitt des Zielobjekts.

  • Suchbild:Das zu detektierende Bild.

  • Matching-Ergebnis:Stellt die Ähnlichkeitsverteilung des Vorlagenbilds im Suchbild dar.

Grundprinzipien des Template-Matchings

Das Grundprinzip des Template-Matchings besteht darin, das Vorlagenbild über das Zielbild zu schieben, an jeder Position die Ähnlichkeit zu berechnen und die Position mit der höchsten Ähnlichkeit zu finden. OpenCV bietet mehrere Methoden zur Ähnlichkeitsberechnung, wie z. B. Quadratdifferenz-Matching (cv2.TM_SQDIFF), normalisiertes Quadratdifferenz-Matching (cv2.TM_SQDIFF_NORMED), Kreuzkorrelationsabgleich (cv2.TM_CCORR), normalisierter Kreuzkorrelationsabgleich (cv2.TM_CCORR_NORMED), Korrelationskoeffizienten-Abgleich (cv2.TM_CCOEFF) und normalisierter Korrelationskoeffizienten-Abgleich (cv2.TM_CCOEFF_NORMED)。

Anwendungsszenarien

  • Objekterkennung: Wird verwendet, um bestimmte Objekte in einem Bild zu lokalisieren, wie Logos, Icons usw.
  • Objektverfolgung: Wird verwendet, um ein Zielobjekt in einem Video zu verfolgen.
  • Bildregistrierung: Wird verwendet, um zwei Bilder auszurichten.

Implementierungsschritte des Template-Matchings

  1. Bild laden:Lesen Sie das Suchbild und das Vorlagenbild ein.

  2. Template-Matching:Verwenden Siecv2.matchTemplate(), um das Vorlagenbild im Suchbild zu finden.

  3. Matching-Ergebnis abrufen:Verwenden Siecv2.minMaxLoc()um die Position der besten Übereinstimmung zu erhalten.

  4. Zeichne das Matching-Ergebnis:Zeichne den übereinstimmenden Bereich im Suchbild.

  5. Zeige das Ergebnis:Zeige das Matching-Ergebnis.

Matching-Methoden

OpenCV bietet mehrere Template-Matching-Methoden, die über den dritten Parameter von cv2.matchTemplate() angegeben werden können:

MethodeBeschreibung
cv2.TM_SQDIFFMatching über quadratische Differenz; je kleiner der Wert, desto besser die Übereinstimmung.
cv2.TM_SQDIFF_NORMEDNormalisiertes Matching über quadratische Differenz; je kleiner der Wert, desto besser die Übereinstimmung.
cv2.TM_CCORRKreuzkorrelations-Matching; je größer der Wert, desto besser die Übereinstimmung.
cv2.TM_CCORR_NORMEDNormalisiertes Kreuzkorrelations-Matching; je größer der Wert, desto besser die Übereinstimmung.
cv2.TM_CCOEFFKorrelationskoeffizienten-Matching; je größer der Wert, desto besser die Übereinstimmung.
cv2.TM_CCOEFF_NORMEDNormalisiertes Korrelationskoeffizienten-Matching; je größer der Wert, desto besser die Übereinstimmung.

Verwendungcv2.matchTemplate()zur Objekterkennung

1. Die notwendigen Bibliotheken importieren

Zuerst müssen wir die Bibliotheken OpenCV und NumPy importieren.

NumPy ist eine grundlegende Bibliothek für wissenschaftliches Rechnen in Python, und OpenCV verwendet NumPy-Arrays, um Bilddaten zu speichern.

Beispiel

import cv2
import numpy as np

2. Das Bild und die Vorlage laden

Als Nächstes müssen wir das Zielbild und das Vorlagenbild laden.

Das Zielbild ist das Bild, in dem wir das Objekt finden möchten, und das Vorlagenbild ist das Objekt, das wir erkennen möchten.

Beispiel

# Lade das Zielbild und das Vorlagenbild
img = cv2.imread('target_image.jpg', 0)
template = cv2.imread('template_image.jpg', 0)

3. Die Abmessungen des Vorlagenbildes ermitteln

Um das Vorlagenbild über das Zielbild zu schieben, müssen wir die Breite und Höhe des Vorlagenbildes kennen.

Beispiel

# Die Abmessungen des Vorlagenbildes ermitteln
w, h = template.shape[::-1]

4. Template-Matching durchführen

Verwenden Siecv2.matchTemplate()Funktion zum Durchführen des Template-Matchings.

Diese Funktion gibt eine Ergebnismatrix zurück, wobei jedes Element die Ähnlichkeit zwischen der entsprechenden Position im Zielbild und dem Template-Bild darstellt.

Beispiel

# Template-Matching durchführen
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

5. Den Matching-Schwellenwert festlegen und die Übereinstimmungsposition finden

Wir können einen Schwellenwert festlegen, um zu bestimmen, ob die Übereinstimmung erfolgreich ist.

Dann verwenden Siecv2.minMaxLoc()die Funktion, um die Positionen der Maximal- und Minimalwerte in der Ergebnismatrix zu finden.

Beispiel

# Den Matching-Schwellenwert festlegen
threshold = 0.8

# Übereinstimmungsposition finden
loc = np.where(res >= threshold)

6. Übereinstimmungsposition im Zielbild markieren

Schließlich können wir die Position im Zielbild markieren, die mit der Vorlage übereinstimmt.

Normalerweise verwenden wir ein Rechteck, um den übereinstimmenden Bereich zu markieren.

Beispiel

# Übereinstimmungsposition im Zielbild markieren
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)

# Ergebnisbild anzeigen
cv2.imshow('Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Vollständiger Code

Das Folgende ist ein vollständiges Codebeispiel, das zeigt, wie mancv2.matchTemplate()um Objekterkennung durchzuführen.

Beispiel

import cv2
import numpy as np

# Lade das Zielbild und das Vorlagenbild
img = cv2.imread('target_image.jpg', 0)
template = cv2.imread('template_image.jpg', 0)

# Die Abmessungen des Vorlagenbildes ermitteln
w, h = template.shape[::-1]

# Template-Matching durchführen
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)

# Den Matching-Schwellenwert festlegen
threshold = 0.8

# Übereinstimmungsposition finden
loc = np.where(res >= threshold)

# Übereinstimmungsposition im Zielbild markieren
for pt in zip(*loc[::-1]):
    cv2.rectangle(img, pt, (pt[0] + w, pt[1] + h), (0, 255, 0), 2)

# Ergebnisbild anzeigen
cv2.imshow('Matched Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Weitere Erweiterungen