Je travaille et compare actuellement les performances de plusieurs détecteurs de fonctionnalités fournis par OpenCV comme base pour la correspondance visuelle des fonctionnalités.
J'utilise des descripteurs SIFT . J'ai réalisé une correspondance satisfaisante (après avoir rejeté les mauvaises correspondances) lors de la détection des fonctionnalités MSER et DoG (SIFT) .
Actuellement, je teste mon code avec GFTT (Good Features to Track - Harris corners) pour obtenir une comparaison, et aussi parce que dans la dernière application, un ensemble de fonctionnalités GFTT sera disponible à partir du processus de suivi des fonctionnalités visuelles.
J'utilise cv::FeatureDetector::detect(...)
ce qui me fournit un ensemble std::vector<cv::KeyPoint>
de fonctionnalités / points clés / régions d'intérêt détectés . La structure cv::KeyPoint
contient des informations de base sur l'emplacement de la fonction, ainsi que des informations sur size
et octave
dans lesquelles le point clé a été détecté.
Mes premiers résultats avec GFTT ont été terribles jusqu'à ce que je compare les paramètres typiques size
et les octave
différents types de fonctionnalités:
- MSER définit la taille (entre 10 et 40 px) et laisse l' octave à 0
- DoG (SIFT) définit à la fois la taille et l' octave (rapport taille / octave entre 20 et 40)
- GFTT les paramètres sont toujours : taille = 3 , octave = 0
Je suppose que c'est parce que l'objectif principal des fonctionnalités GFTT n'était pas d'être utilisé dans la correspondance, mais uniquement dans le suivi. Cela explique la faible qualité des résultats de correspondance, car les descripteurs extraits de ces minuscules fonctionnalités cessent d'être discriminatoires et invariants pour de nombreuses choses , y compris les petits décalages de 1 pixel.
Si je mets manuellement size
de GFTT à 10 - 12 , je reçois de bons résultats, très similaires lors de l' utilisation MSER ou DoG (EIPD) .
Ma question est: y a-t-il une meilleure façon de déterminer combien augmenter le size
(et / ou octave
) que juste aller avec 10 voir si ça marche ? Je veux éviter de coder en dur l' size
augmentation si possible et de la déterminer par programme, mais le codage en dur est correct tant que j'ai des arguments solides pour sauvegarder mes choix du nouvel algorithmesize
/ size
augmentation / size
estimation .
la source
Réponses:
Je ne suis pas sûr qu'il y ait en fait une bonne réponse à votre question précise: la chose d'espace d'échelle de SIFT et SURF a été réellement développée pour estimer automatiquement la "bonne" taille de voisinage pertinente autour d'un point clé en forme de coin (ce qui est de bonnes fonctionnalités à suivre sont).
Maintenant, des réponses plus positives seraient:
construire une base de données de points clés et de bonnes correspondances (par exemple en utilisant des modèles d'étalonnage carrés) et créer une évaluation automatisée des performances sur cette base de données pour trouver la bonne taille. Cette tâche peut réellement être réellement automatisée (voir les travaux de Mikolajczyk et Schmid sur l'évaluation de l'appariement de points)
intégrez vos bonnes fonctionnalités dans une pyramide d'images pour avoir également une sorte d'échelle qui leur est associée. Vous pouvez rechercher des références sur les points d'intérêt FAST et Harris multi-échelles, qui font quelque chose de très similaire à cette procédure.
Pour trouver heuristiquement la taille de bloc maximale, vous pouvez calculer les estimations de vos images avec un flou de boîte (qui est plus ou moins ce que fait l'opérateur blockSize) et voir quand le coin disparaît. Notez cependant que plus de flou éloigne le coin de son emplacement réel.
Si vous cherchez vraiment une solution rapide et sale, essayez des tailles comprises entre 5x5 et 11x11 (tailles typiques utilisées dans la correspondance de blocs stéréo). Si vous recherchez un critère intellectuellement satisfaisant, essayez de maximiser la probabilité d'une bonne correspondance de deux points caractéristiques sous votre niveau de bruit.
la source
Pour vous aider à déterminer les meilleurs paramètres pour les détecteurs, OpenCV a le AjusterAdapter à cet effet. Je ne l'ai jamais utilisé moi-même mais c'est probablement la manière standard de déterminer par programmation les paramètres. Sachez également que bien que les points clés aient plusieurs propriétés, tous n'ont pas de sens pour tous les algorithmes. Parce que la structure Keypoint est utilisée pour différents algorithmes, elle a tous ces champs mais parfois ils ne sont pas utilisés, c'est pourquoi vous obtenez ces octave = 0; OMI.
la source