[PYTHON] So speichern Sie die Feature-Point-Informationen des Bildes in einer Datei und verwenden sie zum Abgleichen

Einführung

Es gibt viele Möglichkeiten, OpenCV-Feature-Point-Extraktion und -Anpassung zu verwenden. Bei Verwendung mehrerer Bilder dauerte das Extrahieren von Feature-Punkten häufig einige Zeit. Daher habe ich dieses Mal ein Programm erstellt, das die Feature-Point-Informationen in eine Datei ausgibt und zum Abgleichen verwendet.

Lassen Sie uns diesmal als Beispiel ein Mädchen mit roter Brille (Zielbild) von den Mädchen (12 Quellbilder) finden!

Quellbild ⬇︎ youngwoman_37.jpgyoungwoman_38.jpgyoungwoman_39.jpgyoungwoman_40.jpg

youngwoman_41.jpgyoungwoman_42.jpgyoungwoman_43.jpgyoungwoman_44.jpg

youngwoman_45.jpgyoungwoman_46.jpgyoungwoman_47.jpgyoungwoman_48.jpg

Zielbild ⬇︎ target_girl.jpg

Entwicklungsumgebung

Dieses Mal haben wir uns in der folgenden Umgebung entwickelt. OpenCV 4.1.2 Python 3.8.1

Verfassung

Unten ist der Ablauf des Programms. Ich werde Schritt für Schritt aus dem nächsten Abschnitt erklären.

  1. Rufen Sie die Feature-Point-Informationen des Quellbilds ab und speichern Sie sie in einer Datei
  2. Holen Sie sich Feature-Point-Informationen des Zielbilds
  3. Rufen Sie Feature-Point-Informationen des Quellbilds aus der Datei ab
  4. Matching

1. Rufen Sie die Feature-Point-Informationen des Quellbilds ab und speichern Sie sie in einer Datei

Rufen Sie zunächst die Feature-Point-Informationen des Quellbilds (Mädchen) in save_features.py ab und speichern Sie sie in einer Datei. Dieses Mal habe ich AKAZE verwendet, einen in OpenCV implementierten Feature-Point-Deskriptor. Um den "Schlüsselpunkt" als Datei zu speichern, müssen Sie auf den "cv :: KeyPoint" zugreifen und ihn auflisten.

save_features.py


#Schlüsselpunkt auflisten
keypoint = []
for p in features[0]:
    temp = (p.pt, p.size, p.angle, p.response, p.octave, p.class_id)
    keypoint.append(temp)

Auch dieses Mal wurden die Feature-Point-Informationen in den Bytetyp konvertiert, um den Speicherverbrauch zu reduzieren.

save_features.py


#Konvertieren Sie den Schlüsselpunkt in Bytes
map(bytes, keypoints)

Unten finden Sie den gesamten Quellcode.

save_features.py


import cv2 as cv
import pickle

SOURCE_FILES = [
    "youngwoman_37.jpg ",
    "youngwoman_38.jpg ",
    "youngwoman_39.jpg ",
    "youngwoman_40.jpg ",
    "youngwoman_41.jpg ",
    "youngwoman_42.jpg ",
    "youngwoman_43.jpg ",
    "youngwoman_44.jpg ",
    "youngwoman_45.jpg ",
    "youngwoman_46.jpg ",
    "youngwoman_47.jpg ",
    "youngwoman_48.jpg ",
]


def get_features(img_file_name):
    """Get features of master images

        Args:
            img_file_name(list): Master image

        Returns:
            keypoints, descriptors, img

    """
    img = cv.imread("images/" + img_file_name)

    #Extraktion von Feature-Point-Informationen
    akaze = cv.AKAZE_create()
    kp, des = akaze.detectAndCompute(img, None)

    features = [kp, des]

    return features


sources = {}
for item in SOURCE_FILES:
    features = get_features(item)
    #Schlüsselpunkt auflisten
    keypoints = []
    for p in features[0]:
        temp = (p.pt, p.size, p.angle, p.response, p.octave, p.class_id)
        keypoints.append(temp)

    #Konvertieren Sie Schlüsselpunkte in Bytes
    map(bytes, keypoints)
    #Charakteristische Punktinformationen werden in ein Wörterbuch umgewandelt
    sources[item] = {
        "src": item,
        "keypoint": keypoints,
        "descriptor": features[1],
    }

#Schreiben Sie Feature-Point-Informationen in eine Datei
with open("sources_data.pickle", mode="wb") as f:
    pickle.dump(sources, f)

2. Holen Sie sich Feature-Point-Informationen des Zielbilds

Die Verarbeitung erfolgt in get_features_from_file.py ab Schritt 2. Wie beim Quellbild werden Merkmalspunktinformationen mit AKAZE erfasst, einem Merkmalspunktdeskriptor.

get_features_from_file.py


#Zielbild laden
target_img = cv.imread("images/target_girl.jpg ")
#Funktionserfassung
akaze = cv.AKAZE_create()
target_keypoint, target_descriptor = akaze.detectAndCompute(target_img, None)

3. Rufen Sie Feature-Point-Informationen des Quellbilds aus der Datei ab

Holen Sie sich Feature-Point-Informationen aus der Datei mit get_sources (). Da "Schlüsselpunkte" in Byte konvertiert wurden, um es zum Einlegen zu bringen, wird es in eine Liste konvertiert und zur ursprünglichen Struktur zurückgeführt.

get_features_from_file.py


def get_sources():
    """Get source's features from file

        Returns:
            sources(list): source's keypoints, descriptors,and img
        """
    #Informationen zu Feature-Punkten aus der Datei abrufen
    with open("sources_data.pickle", mode="rb") as f:
        sources = pickle.load(f)

    for n in sources:
        items = sources[n]
        #Ändern Sie die Schlüsselpunkte von Bytes in Liste
        list(map(list, items["keypoint"]))
        #Stellen Sie die Schlüsselpunkte in der ursprünglichen Struktur wieder her
        keypoints = []
        for p in items["keypoint"]:
            temp = cv.KeyPoint(
                x=p[0][0],
                y=p[0][1],
                _size=p[1],
                _angle=p[2],
                _response=p[3],
                _octave=p[4],
                _class_id=p[5],
            )
            keypoints.append(temp)
        items["keypoint"] = keypoints

    return sources

4. Matching

Stimmt mit den Merkmalspunktinformationen des Zielbilds für jedes Quellbild überein. Die Daten werden ausgedünnt, und wenn die Anzahl der übereinstimmenden Merkmalspunkte gleich oder größer als der festgelegte Schwellenwert ist (diesmal auf 20 festgelegt), ist der Abgleich erfolgreich.

get_features_from_file.py


for n in sources:
    source = sources[n]
    source_img = cv.imread("images/" + source["src"])
    matches = matcher.knnMatch(source["descriptor"], target_des, k=2)
    #Daten ausdünnen
    ratio = 0.5
    matched_keypoints = []
    for m, n in matches:
        if m.distance < ratio * n.distance:
            matched_keypoints.append([m])

    #Ausgabe-Ergebnisbild, wenn mehr als ein Schwellenwert vorhanden ist
    if len(matched_keypoints) > 20:
        out = cv.drawMatchesKnn(
            source_img,
            source["keypoint"],
            target_img,
            target_kp,
            matched_keypoints,
            None,
            flags=2,
        )

Unten finden Sie den gesamten Quellcode.

get_features_from_file.py


import cv2 as cv
import pickle


def get_sources():
    """Get source's features from file

        Returns:
            sources(list): source's keypoints, descriptors,and img
        """
    #Informationen zu Feature-Punkten aus der Datei abrufen
    with open("sources_data.pickle", mode="rb") as f:
        sources = pickle.load(f)

    for n in sources:
        items = sources[n]
        #Ändern Sie die Schlüsselpunkte von Bytes in Liste
        list(map(list, items["keypoint"]))
        #Stellen Sie die Schlüsselpunkte in der ursprünglichen Struktur wieder her
        keypoints = []
        for p in items["keypoint"]:
            temp = cv.KeyPoint(
                x=p[0][0],
                y=p[0][1],
                _size=p[1],
                _angle=p[2],
                _response=p[3],
                _octave=p[4],
                _class_id=p[5],
            )
            keypoints.append(temp)
        items["keypoint"] = keypoints

    return sources


matcher = cv.BFMatcher()

#Zielbild laden
target_img = cv.imread("images/target_girl.jpg ")
#Funktionserfassung
akaze = cv.AKAZE_create()
target_kp, target_des = akaze.detectAndCompute(target_img, None)
#Lesen Sie die Feature-Point-Informationen des Quellbilds aus der Datei
sources = get_sources()

for n in sources:
    source = sources[n]
    source_img = cv.imread("images/" + source["src"])
    matches = matcher.knnMatch(source["descriptor"], target_des, k=2)
    #Daten ausdünnen
    ratio = 0.5
    matched_keypoints = []
    for m, n in matches:
        if m.distance < ratio * n.distance:
            matched_keypoints.append([m])

    #Ausgabe-Ergebnisbild, wenn mehr als ein Schwellenwert vorhanden ist
    if len(matched_keypoints) > 20:
        out = cv.drawMatchesKnn(
            source_img,
            source["keypoint"],
            target_img,
            target_kp,
            matched_keypoints,
            None,
            flags=2,
        )

cv.imwrite("images/result.jpg ", out)
cv.waitKey()

Ergebnis

Im folgenden Ergebnisbild werden die zwischen dem Quellbild und dem Zielbild übereinstimmenden Merkmalspunkte gezeichnet. Ich konnte das Zielmädchen sicher finden! image.png

Am Ende

Der Schlüssel zum Speichern von Feature-Punkten in einer Datei ist Zugriff auf cv :: KeyPoint Erstellen Sie eine Liste basierend auf den Informationen, auf die zugegriffen wird ist. Wenn Sie die Möglichkeit haben, Bilder mit OpenCV zu verarbeiten, probieren Sie es bitte aus.

Referenzseite

Exportieren Sie KeyPoint von OpenCV für Python 3 in eine Datei

[Feature Point Matching mit Python3, OpenCV3 (AKAZE, KNN)] (https://techtech-sorae.com/python3opencv3%E3%81%A7%E7%89%B9%E5%BE%B4%E7%82%B9%E3%83%9E%E3%83%83%E3%83%81%E3%83%B3%E3%82%B0akaze-knn/)

Recommended Posts

So speichern Sie die Feature-Point-Informationen des Bildes in einer Datei und verwenden sie zum Abgleichen
Extrahieren Sie die Textinformationen in die MP3 / MP4-Datei und speichern Sie sie in der Textdatei (* .lrc) für Sony Walkman.
[Einführung in Python] Wie verwende ich den Operator in in der for-Anweisung?
So ermitteln Sie die Scheitelpunktkoordinaten eines Features in ArcPy
Starten Sie die Webkamera, machen Sie ein Standbild und speichern Sie es lokal
Verwenden Sie Cloud Dataflow, um das Ziel dynamisch entsprechend dem Wert der Daten zu ändern und in GCS zu speichern
Die Geschichte, ein Tool zum Laden von Bildern mit Python zu erstellen ⇒ Speichern unter
So zählen Sie die Anzahl der Elemente in Django und geben sie in die Vorlage aus
Verwenden Sie Pillow, um das Bild transparent zu machen und nur einen Teil davon zu überlagern
Speichern Sie das numpy-Array mithilfe des Wave-Moduls in einer WAV-Datei
So lesen Sie Seriennummerndateien in einer Schleife, verarbeiten sie und zeichnen sie grafisch auf
Wie man Decorator in Django benutzt und wie man es macht
So zeigen Sie das Änderungsdatum einer Datei in C-Sprache bis zu Nanosekunden an
Speichern Sie das Pystan-Modell und erhalten Sie eine Pickle-Datei
Verwendung der Methode __call__ in der Python-Klasse
Vergleich der Verwendung von Funktionen höherer Ordnung in Python 2 und 3
So zeichnen Sie interaktiv eine Pipeline für maschinelles Lernen mit scikit-learn und speichern sie in HTML
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Ich habe versucht, die affine Matrix in der Bildausrichtung (Feature-Point-Matching) mithilfe der affinen Transformation zu finden
Eine einfache Möglichkeit, die in Python benötigte Zeit anzuzeigen und sie intelligenter zu verbessern
Es kann ein Problem sein, Japanisch für Ordnernamen und Notizbuchnamen in Databricks zu verwenden
So bestimmen Sie die Existenz eines Selenelements in Python
Wie Sie die interne Struktur eines Objekts in Python kennen
So überprüfen Sie die Speichergröße einer Variablen in Python
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
So geben Sie das Ausgabeergebnis des Linux-Befehls man in eine Datei aus
Wie nutzt man maschinelles Lernen für die Arbeit? 01_ Den Zweck des maschinellen Lernens verstehen
So machen Sie einen Screenshot des Chrome-Bildschirms (verhindern Sie, dass er in der Mitte abgeschnitten wird)
[Python] Was ist ein Slice? Eine leicht verständliche Erklärung zur Verwendung anhand eines konkreten Beispiels
So erhalten Sie den Pixelwert des Punkts aus dem Satellitenbild, indem Sie den Breiten- und Längengrad angeben
[Python] Die Rolle des Sterns vor der Variablen. Teilen Sie den Eingabewert und weisen Sie ihn einer Variablen zu
[Python] Verwendung der for-Anweisung. Eine Methode zum Extrahieren durch Angabe eines Bereichs oder von Bedingungen.
Erfahren Sie anhand eines einfachen Regressionsmodells den Ablauf der Bayes'schen Schätzung und die Verwendung von Pystan
Ich möchte Tag-Informationen (Titel und Künstler) einer Musikdatei (flac, wav) extrahieren.
Started Python: Tauschen Sie das im SQL-Ergebnis erhaltene Array von Werten in den Listentyp aus und verwenden Sie es in IN einer anderen Abfrage
Von der Einführung der GoogleCloudPlatform Natural Language API bis zur Verwendung
So teilen und speichern Sie einen DataFrame
[Python / Jupyter] Übersetzen Sie den Kommentar des in die Zwischenablage kopierten Programms und fügen Sie ihn in eine neue Zelle ein.
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
So senden Sie ein visualisiertes Bild der in Python erstellten Daten an Typetalk
So geben Sie eine .ui-Datei in der Dialog- / Widget-GUI in PySide an
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
So machen Sie den Containernamen in Docker als Subdomain zugänglich
Öffnen Sie eine Excel-Datei in Python und färben Sie die Karte von Japan
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Kopieren und Einfügen des Inhalts eines Blattes im JSON-Format mit einer Google-Tabelle (mithilfe von Google Colab)
[Python] Senden Sie das von der Webkamera aufgenommene Bild an den Server und speichern Sie es
Verwendung ist und == in Python
So geben Sie eine Zeichenfolge in Python ein und geben sie unverändert oder in die entgegengesetzte Richtung aus.
Der tree.plot_tree von scikit-learn war sehr einfach und bequem, daher habe ich versucht, zusammenzufassen, wie man es einfach benutzt.
Eine Geschichte über einen Ingenieur, der das Emo der Kryptographie bemerkt hat und versucht, es in Python zu implementieren
GAE - Drehen Sie mit Python das Bild basierend auf den Rotationsinformationen von EXIF und laden Sie es in den Cloud-Speicher hoch.
Ich dachte, es wäre langsam, die for-Anweisung in NumPy zu verwenden, aber das war nicht der Fall.
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
Testen Sie das Hochladen von Bildern, indem Sie in Python erstellen, ohne Dummy-Bilddateien in Django zu platzieren
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
Verwenden Sie libsixel, um Sixel in Python auszugeben und das Matplotlib-Diagramm an das Terminal auszugeben.
Ich möchte ein Element mit numpy in eine Datei schreiben und es überprüfen.
[Python] Kombinieren von Listen mit Zahlen zu Zeichenfolgen und Schreiben in eine Ausgabedatei