Extraction d'objets dans l'image par correspondance de modèles en utilisant OpenCV avec Python

introduction

Il y a eu une consultation, "N'est-il pas possible de trouver automatiquement le même objet dans l'image et de le découper en fonction de l'angle et de la position?"

La condition est que ce que vous voulez découvrir soit un objet et qu'un seul objet soit montré dans l'image.

J'ai eu un peu de mal à m'en rendre compte, je vais donc l'enregistrer. De plus, il semble qu'un réglage soit nécessaire en fonction de l'image (^ _ ^;)

Environnement d'exploitation

article Contenu
Machine MacBook Air (13-inch, Early 2015)
Processeur 2.2 GHz Intel Core i7
Mémoire 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

Procédure de construction de l'environnement

Veuillez vous référer à l'URL suivante pour le miso avant habituel.

Photo utilisée

Première feuille (IMG_4754.JPG)

IMG_4754.jpg

Deuxième pièce (IMG_4777.JPG)

IMG_4777.jpg

Ici, la première pièce est traitée et éditée manuellement comme suit. (IMG_4754s.JPG)

IMG_4754s.jpg

Utilisez ceci comme image de modèle.

Lecture de la bibliothèque

python


import cv2
import math

De plus, déclarez la fonction suivante pour l'affichage de l'image.

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))

Lecture d'image et extraction de caractéristiques

J'ai évoqué l'article suivant.

Correspondance de la quantité de fonctionnalités avec OpenCV 3 et Python 3 (A-KAZE, KNN)

python


#Lecture d'image
img1 = cv2.imread("IMG_4777.JPG")
img2 = cv2.imread("IMG_4754s.JPG")

# A-Génération de détecteur KAZE
detector = cv2.AKAZE_create()

#Détection d'entités et calcul de vecteurs d'entités
kp1, des1 = detector.detectAndCompute(img1, None)
kp2, des2 = detector.detectAndCompute(img2, None)

# Brute-Générer Force Matcher
bf = cv2.BFMatcher()

#Vecteurs de quantité de caractéristiques brutes-Correspondance avec Force et KNN
matches = bf.knnMatch(des1, des2, k=2)

#Affiner les données
ratio = 0.2
good = []
for m, n in matches:
    if m.distance < ratio * n.distance:
        good.append([m])

#Trier les fonctionnalités en fonction du statut correspondant
good = sorted(matches, key = lambda x : x[1].distance)

#Dessiner les points caractéristiques correspondants
img3 = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good[:2], None, flags=2)

display_cv_image(img3, '.png')

L'image suivante s'affiche et vous pouvez voir que les points caractéristiques correspondent correctement.

Unknown1.png

Découpez en ajustant l'angle, la position et la taille

python


#Obtenir des données sur les fonctionnalités

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])

#Calculer l'angle et la distance entre les points caractéristiques de l'image à traiter
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)

#Calculer l'angle et la distance entre les points caractéristiques à partir de l'image modèle
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)

#Calcul de la position de coupure
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)

#Taille de l'image
x, y, c = img1.shape
size = (x, y)

#Position centrale de rotation
center = (q_x1, q_y1)

#angle de rotation
angle = q_deg - t_deg

#Rapport de taille
scale = 1.0

#Calcul de la matrice de conversion de rotation
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)

#Conversion d'affine
img_rot = cv2.warpAffine(img1, rotation_matrix, size, flags=cv2.INTER_CUBIC)

#Découpez l'image
img_rot = img_rot[y1:y2, x1:x2]

#Réglage de l'échelle
x, y, c = img2.shape
img_rot = cv2.resize(img_rot, (y, x))

#Affichage des résultats
display_cv_image(img_rot, '.png')

Lors de l'exécution, l'image suivante était affichée.

Unknown.png

l'a fait!

Tâches futures

Il peut être utilisé pour des choses prises à une position fixe, comme une caméra à point fixe, mais si elle est inclinée, un autre processus est nécessaire.

Puisque nous faisons le même calcul à plusieurs reprises, il peut être préférable d'en faire une fonction et de le rendre plus facile à réutiliser ... Plutôt que cela.

... je vais retrouver le temps et y réfléchir (^ - ^)

20/08/2017 post-scriptum J'ai fait un petit test différent. Veuillez également voir. Essayez la conversion projective d'images en utilisant OpenCV avec Python

Recommended Posts

Extraction d'objets dans l'image par correspondance de modèles en utilisant OpenCV avec Python
[Python] Utilisation d'OpenCV avec Python (basique)
Essayez de projeter la conversion d'image en utilisant OpenCV avec Python
Utiliser OpenCV avec Python @Mac
Reconnaissance des nombres dans les images avec Python
[Python] Utilisation d'OpenCV avec Python (filtrage d'image)
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Utiliser OpenCV avec Python 3 dans Window
Reconnaissance d'objets avec openCV par traincascade
Travailler avec des images DICOM en Python
Appliquer diverses formes de mosaïques aux images (Python, OpenCV)
Enregistrer la vidéo image par image avec Python OpenCV
Capturer des images avec Pupil, python et OpenCV
[Python] Lire des images avec OpenCV (pour les débutants)
Lire des caractères dans des images avec Python OCR
Extraction de bords avec python + OpenCV (filtre Sobel, filtre laplacien)
J'ai essayé la détection d'objets en utilisant Python et OpenCV
Charger des images à partir d'une URL à l'aide de Pillow dans Python 3
Correspondance des fonctionnalités avec OpenCV 3 et Python 3 (A-KAZE, KNN)
Comment tracer plusieurs images ajustées côte à côte en utilisant Python
Motif singleton en Python
Binarisation avec OpenCV / Python
Suivi d'objets à l'aide d'OpenCV3 et de Python3 (suivi des points caractéristiques spécifiés par la souris à l'aide de la méthode Lucas-Kanade)
Modèle de visiteur en Python
Afficher des images dans OpenCV à partir de Python à l'aide d'une caméra USB externe sur votre MacBook
Orienté objet en python
Génération d'images JPEG en spécifiant la qualité avec Python + OpenCV
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
Cloud Functions pour redimensionner les images à l'aide d'OpenCV avec le déclencheur Cloud Storage
Gonfler des données textuelles par retranslation à l'aide de Google Traduction en Python
Précautions lors de l'utilisation de Python avec AtCoder
Choses à garder à l'esprit lors de l'utilisation de cgi avec python.
Analyse morphologique avec Igo + mecab-ipadic-neologd en Python (avec bonus Ruby)
Découpez une image d'une vidéo toutes les secondes avec Python + OpenCV
Correspondance de modèle par OpenCV (CUDA)
Enregistrer des images à l'aide de requêtes python3
Images en bordure avec python Partie 1
Encodage base64 des images en Python 3
Grattage au sélénium en Python
"Traitement Apple" avec OpenCV3 + Python3
[S3] CRUD avec S3 utilisant Python [Python]
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Méthodes d'objet chaîne en Python
Utilisation de Quaternion avec Python ~ numpy-quaternion ~
Édition d'image avec python OpenCV
Capture de caméra avec Python + OpenCV
Débogage avec pdb en Python
Grattage avec du sélénium en Python
Grattage avec Tor en Python
Extraction de mots-clés par MeCab (python)
Tweet avec image en Python
Combiné avec ordinal en Python
Rendre Opencv disponible en Python
Détection de visage avec Python + OpenCV
Traduit à l'aide de googletrans en Python
Utilisation du mode Python dans le traitement
Trier par date en python
Envoyer en utilisant Python avec Gmail
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3