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 (^ _ ^;)
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 |
Die übliche Front-Miso finden Sie unter der folgenden URL.
Erstes Blatt (IMG_4754.JPG)
Zweites Stück (IMG_4777.JPG)
Hier wird das erste Stück wie folgt manuell bearbeitet und bearbeitet. (IMG_4754s.JPG)
Verwenden Sie dies als Vorlagenbild.
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))
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.
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.
erledigt!
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