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

Correspondance des fonctionnalités avec OpenCV

La correspondance des caractéristiques est la correspondance des caractéristiques extraites de différentes images.

C'est une technologie qui apparaît dans.

Les bibliothèques suivantes sont fournies dans OpenCV.

Cette fois, en utilisant OpenCV 3 + Python 3, je vais essayer de faire correspondre les caractéristiques de l'image pivotée et agrandie comme indiqué ci-dessous.

match_thumbnail.jpg ** Dessiner le résultat correspondant **

Qu'est-ce qu'OpenCV?

OpenCV (Open Source Computer Vision Library) est une collection de bibliothèques de traitement vidéo / image sous licence BSD. Il existe de nombreux algorithmes tels que le filtrage d'image, la correspondance de modèles, la reconnaissance d'objets, l'analyse vidéo et l'apprentissage automatique.

■ Exemple de suivi de mouvement avec OpenCV (OpenCV Google Summer of Code 2015) https://www.youtube.com/watch?v=OUbUFn71S4s

■ Cliquez ici pour une installation et une utilisation facile Installer OpenCV 3 (core + contrib) dans l'environnement Python 3 & Différence entre OpenCV 2 et OpenCV 3 & Easy operation check

■ Cliquez ici pour le traitement des images fixes Essayez la détection des bords avec OpenCV Effectuer divers filtres avec OpenCV (Gradient, Highpass, Laplacian, Gaussian) Extraire des points caractéristiques avec OpenCV (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob) Reconnaissance faciale à l'aide d'OpenCV (classificateur de caractéristiques de type Haar) Estimer qui est le visage en utilisant OpenCV (Eigenface, Fisherface, LBPH) Reconnaître le contour et la direction d'un objet façonné avec OpenCV (analyse des composants principaux: PCA, vecteur propre)

■ Cliquez ici pour le traitement vidéo Essayez de convertir des vidéos en temps réel avec OpenCV Essayez de convertir des vidéos de caméra Web / caméra vidéo en temps réel avec OpenCV Dessinez un flux optique en temps réel avec OpenCV (méthode Shi-Tomasi, méthode Lucas-Kanade) Suivi d'objets à l'aide d'OpenCV (suivi des points caractéristiques spécifiés par la souris par la méthode Lucas-Kanade Analyse de modèles de mouvement à l'aide d'OpenCV (reconnaissance des objets et de leurs directions de déplacement en temps réel)

A-KAZE

KNN、Brute-Force、FLANN KNN (algorithme K-Nearest Neighbor) est un algorithme qui sélectionne K étiquettes de voisin le plus proche de l'espace de recherche et attribue des étiquettes de classe à la majorité. L'apprentissage stocke simplement les données d'entraînement telles quelles. Il fonctionne à grande vitesse car le coût d'apprentissage est nul. C'est un acteur représentatif de l'algorithme d'apprentissage paresseux. OpenCV prend en charge la méthode round-robin (Brute-Force) et la méthode de recherche rapide de voisinage approximatif (FLANN) comme méthode de recherche de K étiquettes voisines les plus proches à partir de l'espace de recherche.

● Remarques (Python3 et FLANN)

Plus tôt, j'ai écrit qu'il existe un tutoriel qui ne fonctionne pas avec OpenCV 3 (lien), mais la correspondance des points de fonctionnalités de FLANN est mon environnement (OpenCV). Cela ne fonctionnait pas sur 3.1.0 + Python 3.5.2 + Windows 10).

    > matches = flann.knnMatch(des1,des2,k=2)
    > 

\ # L'erreur suivante se produit # error: C:\dev\opencv-3.1.0\modules\python\src2\cv2.cpp:163: error: (-215) The data should normally be NULL! in function NumpyAllocator::allocate

FLANN fonctionne très bien avec C ++ et OpenCV2, donc si vous souhaitez utiliser FLANN, exécutez-le dans un environnement C ++ ou OpenCV2. Lors de l'exécution avec une combinaison d'OpenCV 3 et de Python 3, actuellement "Brute-Force" est utilisé.

programme

knn.py


# -*- coding: utf-8 -*-
import cv2

#Image 1
img1 = cv2.imread("img1.jpg ")
#Image 2
img2 = cv2.imread("img2.jpg ")

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

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

# Brute-Génération 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.5
good = []
for m, n in matches:
    if m.distance < ratio * n.distance:
        good.append([m])

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

#Affichage de l'image
cv2.imshow('img', img3)

#Appuyez sur la touche pour terminer
cv2.waitKey(0)
cv2.destroyAllWindows()

Résultat correspondant

Dans le test de rapport proposé par D.Lowe, les résultats correspondants sont éclaircis et affichés.

lowe.py


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

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

Cette méthode vous donne une idée visuelle de l'état de correspondance de l'image entière. Il ne semble y avoir aucun faux positif dans ce test.

match_result.png

Modifions une partie du code afin que seuls ceux qui présentent un bon état de correspondance entre les quantités de caractéristiques soient affichés.

knn_good.py


#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[:30], None, flags=2)

match_good.png

Une quantité de caractéristiques différente a été dessinée. Cette fois, puisque la quantité de caractéristiques est dispersée, elle correspond dans son ensemble, mais dans le cas d'une image où les points caractéristiques sont partiellement biaisés, ceux avec un bon état de correspondance y seront concentrés. ..

KeyPoint (objet de point caractéristique)

attribut Contenu
pt Point (x, y)
size Diamètre du point caractéristique
angle [0, 360)Gamme d'angles. L'axe des y est orienté vers le bas et dans le sens des aiguilles d'une montre. S'il ne peut pas être calculé-1。
response Force du point caractéristique
octave Couche pyramidale qui a détecté des points caractéristiques
class_id ID de la classe à laquelle appartient le point caractéristique

DMatch (objet de résultat correspondant)

Les éléments suivants sont stockés dans DMatch suite à la correspondance entre les quantités d'objets.

attribut Contenu
distance Distance entre les quantités de caractéristiques. Plus la distance est proche, meilleur est le match.
trainIdx Index des fonctionnalités de formation
queryIdx Index des fonctionnalités de requête
imgIdx Index des images de formation

Recommended Posts

Correspondance des fonctionnalités avec OpenCV 3 et Python 3 (A-KAZE, KNN)
Briller la vie avec Python et OpenCV
Réseau neuronal avec OpenCV 3 et Python 3
Binarisation avec OpenCV / Python
Installez OpenCV 4.0 et Python 3.7 sur Windows 10 avec Anaconda
Extraire des points caractéristiques avec OpenCV3 et Python3 (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob, SIFT)
[Python] Taille d'image de la caméra Web et paramètres FPS avec OpenCV
Chargement / affichage et accélération de gif avec python [OpenCV]
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
"Traitement Apple" avec OpenCV3 + Python3
Python et matériel - Utilisation de RS232C avec Python -
Édition d'image avec python OpenCV
Capture de caméra avec Python + OpenCV
[Python] Utilisation d'OpenCV avec Python (basique)
Détection de visage avec Python + OpenCV
python avec pyenv et venv
Utiliser OpenCV avec Python @Mac
Fonctionne avec Python et R
Convertir une vidéo en noir et blanc avec ffmpeg + python + opencv
Communiquez avec FX-5204PS avec Python et PyUSB
Construction d'environnement de python et opencv
Robot fonctionnant avec Arduino et python
Installez Python 2.7.9 et Python 3.4.x avec pip.
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
[Python] Utilisation d'OpenCV avec Python (transformation d'image)
Grattage avec Python, Selenium et Chromedriver
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Grattage avec Python et belle soupe
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
Lire et écrire NetCDF avec Python
Essayez la reconnaissance faciale avec python + OpenCV
Découpez le visage avec Python + OpenCV
Reconnaissance faciale avec caméra avec opencv3 + python2.7
Détection des fonctionnalités OpenCV avec Google Colaboratory
Charger une image gif avec Python + OpenCV
Lire et écrire du CSV avec Python
Trouver la similitude d'image avec Python + OpenCV
Utiliser OpenCV avec Python 3 dans Window
Intégration multiple avec Python et Sympy
Dessinez une illustration avec Python + OpenCV
Coexistence de Python2 et 3 avec CircleCI (1.0)
Suivre les balles de baseball avec Python + OpenCV
Segmentation basée sur un graphique avec Python + OpenCV
Dessinez des figures avec OpenCV et PIL
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
Dessinez une flèche (vecteur) avec opencv / python
Etude de base d'OpenCV avec Python
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
Créez une illusion rayée avec correction gamma pour Python3 et openCV3
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Créez un simple OMR (lecteur de feuille de marque) avec Python et OpenCV
Dessinez une illusion d'aquarelle avec détection des contours en Python3 et openCV3
Extraction d'objets dans l'image par correspondance de modèles en utilisant OpenCV avec Python
Faites en sorte que les vidéos floues ressemblent à des caméras à point fixe avec Python et OpenCV
[Python] Essayez de reconnaître les caractères des images avec OpenCV et pyocr