[PYTHON] Finden Sie Kartenillustrationen aus Bildern mithilfe der Feature-Point-Anpassung

Zweck

Dies ist ein Memorandum zum Auffinden von Kartenillustrationen aus Bildern mithilfe der Feature-Point-Anpassung.

Vorbereitung

    1. Kartenillustration
  1. Bild mit Kartenillustration
    1. Code, um die Kartenillustration aus dem Bild zu finden, das die Kartenillustration enthält

(Beispiel 1. Kartenillustration test2.png Quelle: [[Alle Blue Eyes White Dragon] Legendäre Drachenbahn mit dem stärksten Titel von Yugioh](https://yu-gi-oh.xyz/ Blue Eyes White Dragon / post- 49725 /) blueeyes2.jpg

(Beispiel) 2. Bild einschließlich Kartenillustration test1.png Quelle: Adere blueeyes1.jpg

3. 3. Code, um die Kartenillustration aus dem Bild zu finden, das die Kartenillustration enthält

Code, der Feature-Punkte berechnet und Kartenillustrationen aus Bildern extrahiert Referenz: Mickey anhand der Feature-Point-Übereinstimmung erkennen

Der Feature-Point verwendet AKAZE.

sample.py


import cv2
import numpy as np

fname_img1='test1.png'
fname_img2='test2.png'

img1 = cv2.imread(fname_img1)
img2 = cv2.imread(fname_img2)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
akaze = cv2.AKAZE_create()
kp1, des1 = akaze.detectAndCompute(gray1, None)
kp2, des2 = akaze.detectAndCompute(gray2, None)

#img1_sift = cv2.drawKeypoints(gray1, kp1, None, flags=4)
#img2_sift = cv2.drawKeypoints(gray2, kp2, None, flags=4)
#cv2.imwrite('out1.png', img1_sift)
#cv2.imwrite('out2.png', img2_sift)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key = lambda x:x.distance)
img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2)
cv2.imwrite('out-match.png', img3)

#homography
good_match_rate = 0.15;
good = matches[:int(len(matches) * good_match_rate)]

min_match=10
if len(good) > min_match:
    src_pts = np.float32([kp1[m.queryIdx].pt for m in good]).reshape(-1, 1, 2)
    dst_pts = np.float32([kp2[m.trainIdx].pt for m in good]).reshape(-1, 1, 2)
    # Find homography
    M, mask = cv2.findHomography(dst_pts, src_pts, cv2.RANSAC)
    matchesMask = mask.ravel().tolist()

    print(M)
    print(M[0][2])
    print(M[1][2])

    height = img2.shape[0]
    width = img2.shape[1]
    top_left = (int(M[0][2] +0.5), int(M[1][2] +0.5)); #tx,ty
    bottom_right = (top_left[0] + width, top_left[1] + height)

#result
result = cv2.imread(fname_img1)
cv2.rectangle(result,top_left, bottom_right, (255, 0, 0), 10)
cv2.imwrite("result.png ", result)

Prüfung

Ausführungsergebnis

$ python sample.py
[[ 6.43984577e-01 -4.58173428e-02  1.61203033e+02]
 [ 2.85![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/23ae3f02-409a-6a3a-5e8b-673a20afa502.png)
230902e-02  4.12312421e-01  1.50286636e+02]
 [ 4.54533377e-04 -5.75705548e-04  1.00000000e+00]]
161.2030333928222
150.28663624674783

Berechnen und stimmen Sie Feature-Punkte ab

out-match.png

Rahmen erkennen

result.png

Für Webkamerabilder (1 Karte)

Es scheint, dass ein Blatt erkannt werden kann.

out-match.png result.png

Die Rahmenabweichung muss angepasst werden (derzeit fester Wert).

Für Webkamerabilder (mehrere Karten)

Mehrere Blätter sind streng.

out-match.png result.png

Aufgabe

Es kann für Yugiohs Fernduell verwendet werden.

Codierungsfehler Maßnahmen

nichts Besonderes

Referenz

[[Alles über Blue Eyes White Dragon] Der Ort des legendären Drachen mit dem stärksten Titel von Yugioh](https://yu-gi-oh.xyz/ Blue Eyes White Dragon / post-49725 /) Adere Mickey anhand des Feature-Point-Matchings erkennen AKAZE

Recommended Posts

Finden Sie Kartenillustrationen aus Bildern mithilfe der Feature-Point-Anpassung
Ich habe versucht, die affine Matrix in der Bildausrichtung (Feature-Point-Matching) mithilfe der affinen Transformation zu finden
Geotag-Vorhersage aus Bildern mit DNN
Lassen Sie uns etwas näher auf den Feature-Point-Matching mit OpenCV eingehen
Laden Sie Bilder von der URL mit Pillow in Python 3