[PYTHON] Rechercher des illustrations de cartes à partir d'images à l'aide de la correspondance des points caractéristiques

Objectif

Ceci est un mémorandum pour trouver des illustrations de cartes à partir d'images en utilisant la correspondance des points caractéristiques.

Préparation

    1. Illustration de la carte
  1. Image avec illustration de la carte
    1. Code pour trouver l'illustration de la carte à partir de l'image contenant l'illustration de la carte

(Exemple 1. Illustration de la carte test2.png Source: [[All of Blue Eyes White Dragon] Trajectoire du dragon légendaire avec le titre le plus fort de Yugioh](https://yu-gi-oh.xyz/ Blue Eyes White Dragon / post- 49725 /) blueeyes2.jpg

(Exemple) 2. Image avec illustration de la carte test1.png Source: Adere blueeyes1.jpg

3. 3. Code pour trouver l'illustration de la carte à partir de l'image contenant l'illustration de la carte

Code qui calcule les points caractéristiques et extrait les illustrations de cartes à partir d'images Référence: Détecter Mickey par correspondance de points caractéristiques

Le point caractéristique utilise 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)

tester

Résultat d'exécution

$ 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

Calculer et faire correspondre les points caractéristiques

out-match.png

Détecter le cadre

result.png

Pour les images de caméra Web (1 carte)

Il semble qu'une feuille puisse être détectée.

out-match.png result.png

L'écart de trame doit être ajusté (valeur actuellement fixe)

Pour les images de caméra Web (plusieurs cartes)

Les feuilles multiples sont strictes.

out-match.png result.png

Tâche

Il peut être utilisé pour le duel à distance de Yugioh.

Mesures d'erreur de codage

rien de spécial

référence

[[Tout sur Blue Eyes White Dragon] Le lieu du dragon légendaire avec le titre le plus fort de Yugioh](https://yu-gi-oh.xyz/ Blue Eyes White Dragon / post-49725 /) Adere Détecter Mickey par correspondance de points caractéristiques AKAZE

Recommended Posts

Rechercher des illustrations de cartes à partir d'images à l'aide de la correspondance des points caractéristiques
J'ai essayé de trouver la matrice affine dans l'alignement de l'image (correspondance des points caractéristiques) en utilisant la transformation affine
Prédiction géolocalisée à partir d'images à l'aide de DNN
Examinons un peu plus la correspondance des points caractéristiques à l'aide d'OpenCV
Charger des images à partir d'une URL à l'aide de Pillow dans Python 3