Extraire des points caractéristiques avec OpenCV3 et Python3 (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob, SIFT)

introduction

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 filtrer les images fixes Essayez la détection des bords avec OpenCV Effectuer divers filtres avec OpenCV (Gradient, Highpass, Laplacian, Gaussian)

● Cliquez ici pour traiter les fichiers 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

Cette fois, j'essaierai d'extraire des points caractéristiques en utilisant OpenCV. Les points caractéristiques sont utilisés comme données de base lors de la création d'une image panoramique en connectant plusieurs images ou en créant un flux optique d'un objet en mouvement avec une vidéo.

ORB (Oriented FAST and Rotated BRIEF)、AKAZE (Accelerated KAZE)

ORB est un algorithme qui extrait les points de caractéristiques et les quantités de caractéristiques, et offre une robustesse dans tous les mouvements, rotation et zoom. À l'origine, un algorithme appelé SIFT gagnait en robustesse contre le zoom en plus du mouvement et de la rotation. Cependant, SIFT nécessite beaucoup de calcul et est lent, donc un algorithme appelé SURF avec une vitesse améliorée est sorti. Cependant, SIFT et SURF sont tous deux brevetés, vous devrez donc payer une taxe de brevet pour les utiliser. Par conséquent, en 2011, un algorithme appelé ORB a été développé qui a une robustesse pour le mouvement, la rotation et le zoom, a une vitesse de calcul élevée et peut être utilisé librement.

De plus, à partir d'OpenCV 3.0, un algorithme appelé AKAZE développé en 2013 est pris en charge. Bien que l'AKAZE nécessite un peu plus de calcul que l'ORB, il a une meilleure précision d'extraction dans la région basse fréquence et la région haute fréquence que l'ORB, et on dit qu'il est efficace pour suivre les caméras à grande vitesse. Cliquez ici pour une vidéo de comparaison d'AKAZE et d'ORB (youtube).

Les algorithmes appropriés varient en fonction de l'objet et de la tâche, il est donc nécessaire de les appliquer et de comparer celui qui est le plus approprié. Il est nécessaire de faire un large éventail d'études pour savoir si les points caractéristiques et les quantités caractéristiques peuvent être détectés, s'ils se trouvent dans le temps d'échantillonnage requis et si les performances du matériel sont appropriées.

programme

Maintenant, extrayons les points caractéristiques à l'aide de l'algorithme ORB et affichons les points caractéristiques extraits sur l'image. Le flux est le suivant.

  1. Charger le fichier image
  2. Extraire les points caractéristiques et les quantités caractéristiques avec ORB
  3. Ecrivez des points caractéristiques sur l'image
  4. Affichez l'image de résultat

FeatureDetection.py


import cv2

#Chargement des fichiers image
img = cv2.imread('img.jpg')

# ORB (Oriented FAST and Rotated BRIEF)
detector = cv2.ORB_create()

#Détection des fonctionnalités
keypoints = detector.detect(img)

#Écriture de points caractéristiques sur l'image
out = cv2.drawKeypoints(img, keypoints, None)

#afficher
cv2.imshow("keypoints", out)

Résultat d'exécution

Lorsque les points caractéristiques sont extraits par ORB et que les points caractéristiques sont superposés à l'image, le résultat est le suivant. Pour l'œil humain, la personne debout sur la route au premier plan semble être un point caractéristique, mais aux yeux de l'ordinateur, la personne debout sur la route ne semble pas si caractéristique.

orb.png                   ORB

Lorsque les points caractéristiques ont été extraits avec AKAZE et que les points caractéristiques ont été superposés à l'image, il est devenu comme suit. Cela reconnaît la personne debout sur la route devant comme un point caractéristique.

akaze.png                   AKAZE

À propos, une fois organisé par ordre décroissant du nombre de points caractéristiques, c'était comme suit. Cependant, les différentes options sont exécutées avec les valeurs par défaut, et à la suite de cela se produit dans cette image, il n'y a pas de signification profonde dans le nombre.

SimpleBlobDetector < ORB < MSER < GFTT < AKAZE < KAZE < BRISK < FAST < AgastFeature

Algorithme d'extraction de fonctionnalités pris en charge par OpenCV 3

OpenCV prend également en charge des algorithmes autres que ORB. Vous pouvez changer l'algorithme simplement en commutant le détecteur du programme.

# AgastFeatureDetector detector = cv2.AgastFeatureDetector_create()

# FAST detector = cv2.FastFeatureDetector_create()

# MSER detector = cv2.MSER_create()

# AKAZE detector = cv2.AKAZE_create()

# BRISK detector = cv2.BRISK_create()

# KAZE detector = cv2.KAZE_create()

# ORB (Oriented FAST and Rotated BRIEF) detector = cv2.ORB_create()

# SimpleBlobDetector detector = cv2.SimpleBlobDetector_create()

# SIFT detector = cv2.xfeatures2d.SIFT_create()

GFTT (version simplifiée de la méthode Harris) a sa propre méthode wrapper.

corners = cv2.goodFeaturesToTrack(image, maxCorners, qualityLevel, minDistance[, corners[, mask[, blockSize[, useHarrisDetector[, k]]]]])

Si vous souhaitez compter le nombre de points caractéristiques, vous pouvez compter par points clés len ().

print(len(keypoints))

ORB, GFTT, AKAZE, KAZE, BRISK, SIFT calculent non seulement les points caractéristiques, mais également les quantités caractéristiques.

Objet KeyPoint 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

C'est le code d'accès.

\ # Spécifiez la position du tableau i = 5 \ # Prenez une quantité de fonctionnalités keypoint = keypoints[i] \ # Accéder à chaque attribut keypoint.pt keypoint.size keypoint.angle keypoint.response keypoint.octave keypoint.class_id

Certains algorithmes semblent n'utiliser qu'une partie de KeyPoint. Par exemple, lorsque j'ai analysé l'exemple d'image lena.jpg avec AKAZE, les valeurs ont été définies en pt, taille, réponse, octave, id_classe et l'angle n'a pas été utilisé.

Recommended Posts

Extraire des points caractéristiques avec OpenCV3 et Python3 (AgastFeature, FAST, GFTT, MSER, AKAZE, BRISK, KAZE, ORB, SimpleBlob, SIFT)
Correspondance des fonctionnalités avec OpenCV 3 et Python 3 (A-KAZE, KNN)
Interpolation automatique des images avec OpenCV et Python (méthode de marche rapide, Navier-Stokes)
Briller la vie avec Python et OpenCV
Réseau neuronal avec OpenCV 3 et Python 3