Objektextraktion im Bild durch Mustervergleich mit OpenCV mit Python

Einführung

Es gab eine Konsultation: "Ist es nicht möglich, dasselbe Objekt auf dem Bild automatisch zu finden und es entsprechend dem Winkel und der Position auszuschneiden?"

Die Bedingung ist, dass Sie ein Objekt entdecken möchten und nur ein Objekt im Bild angezeigt wird.

Ich hatte ein wenig Probleme, es zu realisieren, also werde ich es aufnehmen. Es scheint auch, dass eine Anpassung abhängig vom Bild notwendig ist (^ _ ^;)

Betriebsumgebung

Artikel Inhalt
Maschine MacBook Air (13-inch, Early 2015)
Prozessor 2.2 GHz Intel Core i7
Erinnerung 8 GB 1600 MHz DDR3
Python 3.6.0 :: Anaconda 4.3.1 (x86_64)
Jupyter Notebook 4.2.1
OpenCV 3.3.0-rc

Bauverfahren für die Umwelt

Die übliche Front-Miso finden Sie unter der folgenden URL.

Foto verwendet

Erstes Blatt (IMG_4754.JPG)

IMG_4754.jpg

Zweites Stück (IMG_4777.JPG)

IMG_4777.jpg

Hier wird das erste Stück wie folgt manuell bearbeitet und bearbeitet. (IMG_4754s.JPG)

IMG_4754s.jpg

Verwenden Sie dies als Vorlagenbild.

Bibliothek gelesen

python


import cv2
import math

Deklarieren Sie außerdem die folgende Funktion für die Bildanzeige.

python


from IPython.display import display, Image

def display_cv_image(image, format='.png'):
    decoded_bytes = cv2.imencode(format, image)[1].tobytes()
    display(Image(data=decoded_bytes))

Bildlesen und Merkmalsextraktion

Ich habe auf den folgenden Artikel verwiesen.

Anpassung der Funktionsmenge an OpenCV 3 und Python 3 (A-KAZE, KNN)

python


#Bild lesen
img1 = cv2.imread("IMG_4777.JPG")
img2 = cv2.imread("IMG_4754s.JPG")

# A-Erzeugung eines KAZE-Detektors
detector = cv2.AKAZE_create()

#Merkmalserkennung und Merkmalsvektorberechnung
kp1, des1 = detector.detectAndCompute(img1, None)
kp2, des2 = detector.detectAndCompute(img2, None)

# Brute-Force Matcher generieren
bf = cv2.BFMatcher()

#Brute-Feature-Mengenvektoren-Matching mit Force & KNN
matches = bf.knnMatch(des1, des2, k=2)

#Daten ausdünnen
ratio = 0.2
good = []
for m, n in matches:
    if m.distance < ratio * n.distance:
        good.append([m])

#Sortieren Sie Features nach Übereinstimmungsstatus
good = sorted(matches, key = lambda x : x[1].distance)

#Zeichnen Sie entsprechende Feature-Punkte
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good[:2], None, flags=2)

display_cv_image(img3, '.png')

Das folgende Bild wird angezeigt, und Sie können sehen, dass die Feature-Punkte korrekt übereinstimmen.

Unknown1.png

Schneiden Sie durch Anpassen von Winkel, Position und Größe aus

python


#Funktionsdaten abrufen

q_kp = []
t_kp = []

for p in good[:2]:
    for px in p:
        q_kp.append(kp1[px.queryIdx])
        t_kp.append(kp2[px.trainIdx])

#Berechnen Sie den Winkel und den Abstand zwischen Feature-Punkten des zu verarbeitenden Bildes
q_x1, q_y1 = q_kp[0]
q_x2, q_y2 = q_kp[-1]

q_deg = math.atan2(q_y2 - q_y1, q_x2 - q_x1) * 180 / math.pi
q_len = math.sqrt((q_x2 - q_x1) ** 2 + (q_y2 - q_y1) ** 2)

#Berechnen Sie den Winkel und den Abstand zwischen Feature-Punkten aus dem Vorlagenbild
t_x1, t_y1 = t_kp[0]
t_x2, t_y2 = t_kp[-1]

t_deg = math.atan2(t_y2 - t_y1, t_x2 - t_x1) * 180 / math.pi
t_len = math.sqrt((t_x2 - t_x1) ** 2 + (t_y2 - t_y1) ** 2)

#Berechnung der Ausschnittposition
x1 = q_x1 - t_x1 * (q_len / t_len)
x2 = x1 + img2.shape[1] * (q_len / t_len)

y1 = q_y1 - t_y1 * (q_len / t_len)
y2 = y1 + img2.shape[0] * (q_len / t_len)

#Bildgröße
x, y, c = img1.shape
size = (x, y)

#Drehposition in der Mitte
center = (q_x1, q_y1)

#Drehwinkel
angle = q_deg - t_deg

#Größenverhältnis
scale = 1.0

#Berechnung der Rotationsumwandlungsmatrix
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)

#Affin-Konvertierung
img_rot = cv2.warpAffine(img1, rotation_matrix, size, flags=cv2.INTER_CUBIC)

#Schneiden Sie das Bild aus
img_rot = img_rot[y1:y2, x1:x2]

#Skaleneinstellung
x, y, c = img2.shape
img_rot = cv2.resize(img_rot, (y, x))

#Ergebnisanzeige
display_cv_image(img_rot, '.png')

Bei der Ausführung wurde das folgende Bild angezeigt.

Unknown.png

erledigt!

Zukünftige Aufgaben

Es kann für Dinge verwendet werden, die an einer festen Position aufgenommen wurden, wie z. B. eine Festkommakamera. Wenn es jedoch geneigt ist, ist ein anderer Vorgang erforderlich.

Da wir dieselbe Berechnung wiederholt durchführen, ist es möglicherweise besser, sie zu einer Funktion zu machen und die Wiederverwendung zu vereinfachen ... Stattdessen.

... Ich werde wieder Zeit finden und darüber nachdenken (^ - ^)

2017.08.20 Nachtrag Ich habe einen etwas anderen Test gemacht. Bitte sehen Sie auch. Versuchen Sie die projektive Konvertierung von Bildern mit OpenCV mit Python

Recommended Posts

Objektextraktion im Bild durch Mustervergleich mit OpenCV mit Python
[Python] Verwenden von OpenCV mit Python (Basic)
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Verwenden von OpenCV mit Python @Mac
Zahlenerkennung in Bildern mit Python
[Python] Verwenden von OpenCV mit Python (Bildfilterung)
[Python] Verwenden von OpenCV mit Python (Kantenerkennung)
Verwenden Sie OpenCV mit Python 3 in Window
Objekterkennung mit openCV durch traincascade
Arbeiten mit DICOM-Bildern in Python
Wenden Sie verschiedene Formen von Mosaiken auf Bilder an (Python, OpenCV).
Speichern Sie Videos Frame für Frame mit Python OpenCV
Bilder mit Pupil, Python und OpenCV aufnehmen
[Python] Bilder mit OpenCV lesen (für Anfänger)
Lesen von Zeichen in Bildern mit Python OCR
Kantenextraktion mit Python + OpenCV (Sobel-Filter, Laplace-Filter)
Ich habe versucht, Objekte mit Python und OpenCV zu erkennen
Laden Sie Bilder von der URL mit Pillow in Python 3
Feature Matching mit OpenCV 3 und Python 3 (A-KAZE, KNN)
So zeichnen Sie Bilder mit mehreren Anpassungen nebeneinander mit Python
Singleton-Muster in Python
Binarisierung mit OpenCV / Python
Objektverfolgung mit OpenCV3 und Python3 (Verfolgung von Funktionspunkten, die mit der Maus mithilfe der Lucas-Kanade-Methode festgelegt wurden)
Besuchermuster in Python
Zeigen Sie Bilder in OpenCV von Python mit einer externen USB-Kamera auf Ihrem MacBook an
Objektorientiert in Python
JPEG-Bilderzeugung durch Angabe der Qualität mit Python + OpenCV
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Cloud-Funktionen zum Ändern der Bildgröße mithilfe von OpenCV mit Cloud Storage-Trigger
Aufblasen von Textdaten durch erneute Übersetzung mithilfe der Google-Übersetzung in Python
Vorsichtsmaßnahmen bei der Verwendung von Python mit AtCoder
Dinge, die Sie bei der Verwendung von CGI mit Python beachten sollten.
Morphologische Analyse mit Igo + mecab-ipadic-neologd in Python (mit Ruby-Bonus)
Schneiden Sie mit Python + OpenCV jede Sekunde ein Bild aus einem Video aus
Template Matching von OpenCV (CUDA)
Speichern Sie Bilder mit Python3-Anforderungen
Angrenzende Bilder mit Python Teil 1
Base64-Codierung von Bildern in Python 3
Schaben mit Selen in Python
"Apple-Verarbeitung" mit OpenCV3 + Python3
[S3] CRUD mit S3 unter Verwendung von Python [Python]
Betreiben Sie LibreOffice mit Python
Schaben mit Chromedriver in Python
String-Objektmethoden in Python
Verwenden von Quaternion mit Python ~ numpy-quaternion ~
Bildbearbeitung mit Python OpenCV
Kameraerfassung mit Python + OpenCV
Debuggen mit pdb in Python
Scraping mit Selen in Python
Scraping mit Tor in Python
Keyword-Extraktion mit MeCab (Python)
Tweet mit Bild in Python
Kombiniert mit Ordnungszahl in Python
Stellen Sie Opencv in Python zur Verfügung
Gesichtserkennung mit Python + OpenCV
Übersetzt mit Googletrans in Python
Verwenden des Python-Modus in der Verarbeitung
Sortieren nach Datum in Python
Senden Sie mit Python mit Google Mail
Zeichnen Sie eine Aquarellillusion mit Kantenerkennung in Python3 und openCV3