OpenCV: Comment obtenir la fenêtre des points à l'aide findHomography()/findFundamental() et RANSAC
OpenCV ne fournit pas de RANSAC fonction en soi, ou au moins sous une forme telle que vous pouvez simplement appeler et être fait avec elle (par exemple,cv::ransac(...)
). Toutes les fonctions/méthodes qui sont en mesure d'utiliser RANSAC avoir un drapeau qui lui permet. Cependant, ce n'est pas toujours utile si vous voulez vraiment faire quelque chose d'autre avec le inliers RANSAC calcule après avoir estimé une homographie/matrice fondamentale par exemple créer une belle parcelle de terrain dans une Octave ou d'un logiciel similaire/bibliothèque de la points, appliquer des algorithmes supplémentaires sur la série de filtré les matchs etc.
Après la mise en correspondance de deux images, on obtient un vecteur de rencontres. Avec qui nous ont bien sûr, 2 ensembles de keypoints (un pour chaque image) qui ont été utilisés dans le processus d'appariement. À l'aide des allumettes et des keypoints, nous devons créer deux vecteurs de points (par exemple,cv::Point2f points
) et de les transmettre à l' findHomography()
. De cette et cette postes, j'ai découvert exactement comment l'inliers sont marqués à l'aide d'un masque, que l'on passe à cette fonction. Chaque ligne à l'intérieur du masque se rapporte à une fenêtre/de valeurs aberrantes. Cependant, je suis incapable de comprendre comment utiliser la ligne-informations d'index de mes deux ensembles de points. En regardant OpenCV du code source n'est pas trop loin. Dans findFundamental()
(similaire à findHomography()
quand il s'agit de sa signature et le masque de partie) qu'ils utilisent compressPoints()
, qui semble d'une certaine manière de combiner les deux jeux que nous avons en entrée (source et destination) en un seul. Lors des tests afin de déterminer la nature du masque, j'ai essayé 2 ensembles de points appariés (converti cv::Keypoints
à cv::Point2f
- une procédure standard). Chaque ensemble contient 300 points au total, nous avons 600 points. Le retour de masque contient de 300 lignes (les valeurs ne sont pas importants pour ce sujet à la main).
EDIT: en écrivant cet article, j'ai découvert la réponse (voir ci-dessous), mais a décidé de poster cette question de toute façon dans le cas où quelqu'un a besoin de cette information dès que possible et sous forme compacte. Notez que nous avons encore besoin l'un de OpenCV la fonction de soutien de RANSAC. Donc, si vous avez un ensemble de points, mais pas l'intention de calcul de l'homographie ou de la matrice fondamentale, ce n'est évidemment pas le chemin et j'ose dire que j'ai été incapable de trouver quelque chose d'utile dans OpenCV de l'API qui peuvent aider à éviter cet obstacle, par conséquent, vous devez utiliser une bibliothèque externe.
OriginalL'auteur rbaleksandar | 2014-06-27
Vous devez vous connecter pour publier un commentaire.
La solution est en fait tout à fait banale. Comme nous le savons, chaque ligne dans notre masque donne des informations si nous avons une fenêtre ou une valeur aberrante. Cependant, nous avons 2 ensembles de points en entrée alors, comment fonctionne exactement une ligne contenant une valeur unique représentent deux points? La nature de ce type d'indexation est apparu dans mon esprit tout en pensant que ces deux ensembles de points apparaissent dans findHomography() (dans mon cas, j'ai été le calcul de l'homographie entre deux images). Les deux ensembles ont le même nombre de points, car le simple fait qu'elles sont extraites de l'correspondances entre notre paire d'images. Cela signifie qu'une ligne dans notre masque est l'indice réel des points dans les deux ensembles et aussi l'index du vecteur de matches pour les deux images. J'ai réussi à manuellement, reportez-vous à un petit sous-ensemble de points appariés sur cette base et les résultats sont comme prévu. Il est important que vous n'avez pas à modifier l'ordre de vos matchs et la 2D de points que vous avez extraite à l'aide de la keypoints référencé dans chaque
cv::DMatch
. Ci-dessous vous pouvez voir un exemple simple pour une seule paire de inliers.Dans l'exemple ci-dessus, si nous avons l'impression que certains inlier
et puis à nouveau, mais cette fois à l'aide de notre keypoints (peut aussi être fait avec l'extrait 2D points)
nous obtenons le même résultat:
D'obtenir le véritable fenêtre, nous avons simplement pour vérifier si la ligne en cours dans le masque contient en fait un 0 ou une valeur non nulle:
Oui, c'est exact et c'est ce que je voulais dire, mais maintenant que j'ai relu cette phrase, je vois comment ça peut être mal interprété. Je vais le changer.
Mais la ligne représente le statut de fenêtre ou aberrantes, mais il n'y a pas de point clé sur chaque fenêtre ou aberrantes état. keypoints sont stockés dans le vecteur. alors, comment pouvons-nous obtenir de la touche correspondante-point de la fenêtre dans le masque?
Je prends vraiment du mal à comprendre ce que vous demandez. Peut-être vous pouvez simplement poster une nouvelle question (si vous le souhaitez, vous pouvez faire un lien vers le mien pour aider le public à obtenir une meilleure image de votre cas)?
OriginalL'auteur rbaleksandar
Sur une note différente. Il peut ne pas être possible pour RANSAC pour exister en tant que fonctionner par lui-même dans OpenCV parce que RANSAC est un résumé technique de rejeter les valeurs aberrantes. RANSAC s'appuie sur un modèle de base pour la réalisation de la valeur aberrante rejet. Maintenant, le modèle de base est très générique. Il pourrait être n'importe quoi (pas nécessairement les points qui ont un certain rapport entre eux). Cela pourrait être la raison pourquoi RANSAC n'existe que comme une fonction dans une autre fonction que d'effectuer certaines tâches bien définies qui ont une certaine étendue définie comme
findHomography
,findFundamentalMat
, etc.OriginalL'auteur Arun Kumar