web-dev-qa-db-fra.com

Classification des détecteurs, extracteurs et appariements

Je suis nouveau sur opencv et j'essaie d'implémenter une correspondance d'images entre deux images. À cette fin, j'essaie de comprendre la différence entre les descripteurs de fonctionnalités, les extracteurs de descripteurs et les correspondants de descripteurs. J'ai rencontré beaucoup de termes et j'ai essayé de les lire sur le site Web de documentation d'opencv, mais je n'arrive pas à me concentrer sur les concepts. J'ai compris la différence fondamentale ici. Différence entre la détection de fonctionnalités et l'extraction de descripteurs

Mais je suis tombé sur les termes suivants en étudiant sur le sujet:

RAPIDE, GFTT, SIFT, SURF, MSER, STAR, ORB, BRISK, FREAK, BREF

Je comprends comment FAST, SIFT, SURF fonctionnent, mais je n'arrive pas à comprendre lesquels de ceux-ci ne sont que des détecteurs et lesquels sont des extracteurs.

Ensuite, il y a les matchers.

FlannBased, BruteForce, knnMatch et probablement quelques autres.

Après quelques lectures, je me suis dit que certains matchers ne peuvent être utilisés qu'avec certains extracteurs comme expliqué ici. Comment fonctionne OpenCV ORB Feature Detector? La classification donnée est assez claire mais ce n'est que pour quelques extracteurs et je ne comprends pas la différence entre float et uchar.

Donc, fondamentalement, quelqu'un peut-il

  1. classer les types de détecteurs, d'extracteurs et d'apparieurs en fonction du flotteur et de l'uchar, comme mentionné, ou d'un autre type de classification?
  2. expliquer la différence entre la classification float et uchar ou la classification utilisée?
  3. mentionner comment initialiser (coder) différents types de détecteurs, extracteurs et appariements?

Je sais que c'est beaucoup demander mais je vous en serai très reconnaissant. Je vous remercie.

58
hriddle

Je comprends comment FAST, SIFT, SURF fonctionnent, mais je n'arrive pas à comprendre lesquels de ceux-ci ne sont que des détecteurs et lesquels sont des extracteurs.

Fondamentalement, à partir de cette liste de détecteurs/extracteurs de fonctionnalités (lien vers les articles: RAPIDE , GFTT , TAMISER , SURFER , MSER , ÉTOILE , ORBE , - RAPIDE , MONSTRE , BREF ), certains d'entre eux ne sont que des détecteurs de fonctionnalités ( FAST, GFTT) d'autres sont à la fois des détecteurs de fonctionnalités et des extracteurs de descripteurs ( SIFT, SURF, ORB, FREAK).

Si je me souviens bien, [~ # ~] bref [~ # ~] n'est qu'un extracteur de descripteurs, il a donc besoin de fonctionnalités détectées par un autre algorithme comme FAST ou ORB.

Pour être sûr de ce qui est lequel, vous devez parcourir l'article relatif à l'algorithme ou parcourir la documentation opencv pour voir lequel a été implémenté pour la classe FeatureDetector ou qui était pour la classe DescriptorExtractor.

Q1: classer les types de détecteurs, d'extracteurs et d'apparieurs en fonction du flotteur et de l'uchar, comme mentionné, ou d'un autre type de classification?

Q2: expliquer la différence entre la classification float et uchar ou quelle classification est utilisée?

En ce qui concerne questions 1 et 2, pour les classer comme float et uchar, le lien que vous avez déjà posté est la meilleure référence que je connaisse, peut-être que quelqu'un pourra le compléter .

Q3: mentionnez comment initialiser (coder) différents types de détecteurs, extracteurs et appariements?

Répondant question 3, OpenCV a fait le code pour utiliser les différents types de la même manière - principalement vous devez choisir un détecteur de fonctionnalité. La plupart de la différence réside dans le choix du type de matcher et vous avez déjà mentionné les 3 que OpenCV possède. Votre meilleur pari ici est de lire la documentation, exemples de code , et les questions relatives au débordement de pile. De plus, certains articles de blog sont une excellente source d'informations, comme ceux-ci série de repères de détection de fonctionnalités par Ievgen Khvedchenia (Le blog n'est plus disponible, j'ai donc dû créer une copie de texte brut à partir de son cache Google) .

Matchers sont utilisés pour trouver si un descripteur est similaire à un autre descripteur d'une liste. Vous pouvez comparer votre descripteur de requête avec tous les autres descripteurs de la liste ( BruteForce) ou vous utilisez une meilleure heuristique ( FlannBased, knnMatch). Le problème est que les heuristiques ne fonctionnent pas pour tous les types de descripteurs. Par exemple, l'implémentation FlannBased fonctionnait uniquement avec les descripteurs float mais pas avec les uchar (mais depuis la version 2.4.0, FlannBased avec index LSH peut être appliqué aux descripteurs uchar).

Citant cet article de blog App-Solut sur les types DescriptorMatcher:

Le DescriptorMatcher est disponible dans les variétés "FlannBased", "BruteForceMatcher", "BruteForce-L1" et "BruteForce-HammingLUT". Le matcher "FlannBased" utilise la bibliothèque flann (bibliothèque rapide pour les voisins les plus proches approximatifs) sous le capot pour effectuer une correspondance plus rapide mais approximative. Les versions "BruteForce- *" recherchent de manière exhaustive le dictionnaire pour trouver la correspondance la plus proche d'une fonction d'image avec un mot dans le dictionnaire.

Certaines des combinaisons les plus populaires sont:

Types de détecteurs/extracteurs de décryptage/types de matchers

  • (RAPIDE, SURF)/SURF/FlannBased

  • (RAPIDE, SIFT)/SIFT/FlannBased

  • (RAPIDE, ORB)/ORB/Bruteforce

  • (RAPIDE, ORBE)/BREF/Bruteforce

  • (RAPIDE, SURF)/FREAK/Bruteforce

Vous avez peut-être également remarqué qu'il existe quelques adaptateurs (Dynamic, Pyramid, Grid) aux détecteurs de fonctionnalités. Le billet de blog App-Solut résume très bien leur utilisation:

(...) et il y a aussi quelques adaptateurs que l'on peut utiliser pour changer le comportement des détecteurs de points clés. Par exemple, l'adaptateur Dynamic qui ajuste un seuil de détection spécifique au type de détecteur jusqu'à ce que suffisamment de points clés soient trouvés dans une image ou l'adaptateur Pyramid qui construit une pyramide gaussienne pour détecter des points à plusieurs échelles. L'adaptateur Pyramid est utile pour les descripteurs de fonctionnalités qui ne sont pas invariables à l'échelle.

Pour en savoir plus:

78
Rui Marques