4 votes

Opencv FindCornerSubPix précision

Je dois détecter des coins sur des images en niveaux de gris avec la plus grande précision possible. Actuellement, j'utilise la fonction OpenCV : cvFindCornerSubPix().

J'ai préparé un test simple : j'ai obtenu une image avec un coin de bords noirs/blancs :

sample image with detected corner

et ensuite une série du même objet, déplacé de 1/16pixel chacun. J'ai vérifié les valeurs des pixels manuellement, les images de test sont très bien.

Les résultats de la détection ont été décevants : Bien que dans TermCrit la condition soit fixée à 100 itérations ou à un seuil de 0,005, l'erreur de détection peut atteindre 0,08 pixel.

Le graphique montre l'erreur en fonction de la position dans un pixel. Cela ne semble pas du tout aléatoire. Autre chose à noter : pour d'autres positions anulaires du coin (lorsque les bords ne sont pas horizontaux/verticaux) les résultats sont meilleurs, mais toujours pas parfaits.

Une idée, comment faire fonctionner cette fonction correctement, pourquoi elle ne fonctionne pas, ou quoi utiliser à la place ?

J'apprécierais grandement tout conseil

Error graph

0voto

sansuiso Points 3719

Moins de 10 % d'un pixel, ce n'est pas une mauvaise performance du tout. À titre de référence, un détecteur de pics de corrélation adapté à la production de modèles 3D à partir d'images satellite aura le même ordre de grandeur d'erreur.

Comme indiqué dans les commentaires, le modèle d'erreur exact dépendra de la méthode d'interpolation que vous utilisez pour générer le modèle de sous-pixels. Afin d'éviter la non-monotonie introduite par les méthodes d'interpolation d'ordre supérieur (au-delà de l'ordre 2), je suggère le protocole suivant :

  • Génère votre image d'entrée en haute résolution, 16 fois plus grande ;
  • Déplacez votre cible d'un pixel à la fois dans cette image HR ;
  • Produisez vos images de test par sous-échantillonnage (attention : appliquez une fonction de flou appropriée comme un PSF d'abord si vous optez pour un sous-échantillonnage brutal afin d'éviter crénelage ) à la taille correcte.

Enfin, il n'est souvent pas souhaitable de passer à une magnitude d'erreur plus faible. Le détecteur de coins sous-pixel a été conçu pour être utilisé dans des images où de nombreux points (généralement entre 20 et 100) sont détectés. Ces points sont ensuite utilisés dans un processus d'estimation robuste qui doit éliminer les points aberrants et faire une moyenne de l'erreur sur les ensembles de points valides.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X