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.
** Dessiner le résultat correspondant **
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.
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é.
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()
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.
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)
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. ..
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 |
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 |