OpenCV Orbe de ne pas trouver de matches une fois de rotation/échelle invariances sont introduits
Je suis en train de travailler sur un projet à l'aide de l'Orbe de la fonctionnalité du détecteur d'OpenCV 2.3.1 . Je suis de trouver des correspondances entre 8 images différentes, dont 6 sont très similaires (20 cm de différence dans la position de la caméra, le long d'un linéaire curseur jusqu'à il n'y a pas d'échelle ou de rotation de la variance), puis 2 images prises à partir d'environ un angle de 45 degrés de chaque côté. Mon code est de trouver beaucoup de comparaisons entre le très semblable images, mais peu à aucun pour les images prises d'un point de vue différent. J'ai inclus ce que je pense sont les parties de mon code, s'il vous plaît laissez-moi savoir si vous avez besoin de plus d'informations.
//set parameters
int numKeyPoints = 1500;
float distThreshold = 15.0;
//instantiate detector, extractor, matcher
detector = new cv::OrbFeatureDetector(numKeyPoints);
extractor = new cv::OrbDescriptorExtractor;
matcher = new cv::BruteForceMatcher<cv::HammingLUT>;
//Load input image detect keypoints
cv::Mat img1;
std::vector<cv::KeyPoint> img1_keypoints;
cv::Mat img1_descriptors;
cv::Mat img2;
std::vector<cv::KeyPoint> img2_keypoints
cv::Mat img2_descriptors;
img1 = cv::imread(fList[0].string(), CV_LOAD_IMAGE_GRAYSCALE);
img2 = cv::imread(fList[1].string(), CV_LOAD_IMAGE_GRAYSCALE);
detector->detect(img1, img1_keypoints);
detector->detect(img2, img2_keypoints);
extractor->compute(img1, img1_keypoints, img1_descriptors);
extractor->compute(img2, img2_keypoints, img2_descriptors);
//Match keypoints using knnMatch to find the single best match for each keypoint
//Then cull results that fall below given distance threshold
std::vector<std::vector<cv::DMatch> > matches;
matcher->knnMatch(img1_descriptors, img2_descriptors, matches, 1);
int matchCount=0;
for (int n=0; n<matches.size(); ++n) {
if (matches[n].size() > 0){
if (matches[n][0].distance > distThreshold){
matches[n].erase(matches[n].begin());
}else{
++matchCount;
}
}
}
OriginalL'auteur KLowe | 2012-03-02
Vous devez vous connecter pour publier un commentaire.
J'ai fini par avoir assez utile matches en changeant mon processus de filtrage correspond. Ma méthode précédente a été de jeter beaucoup de bons matches uniquement basée sur leur valeur de distance. Cette
RobustMatcher
classe que j'ai trouvé dans le OpenCV2 de la Vision par Ordinateur de Programmation d'Application de livre de cuisine fini génial de travailler. Maintenant que tous mes matchs sont exacts, j'ai été en mesure d'obtenir assez bons résultats en se cognant le nombre de keypoints que l'ORBE détecteur est à la recherche. À l'aide de laRobustMatcher
avec EIPD ou de SURF donne de bien meilleurs résultats, mais je suis de données utilisables avec l'ORBE maintenant.Haha, pas de rapport avec David Lowe 🙂 j'ai trouvé que j'ai eu de bien meilleurs résultats avec le symmetryTest et ransacTest ajouté. Il y avait beaucoup de grandes performances, mais je ne suis pas terriblement sensible aux performances de l'environnement de sorte qu'il n'était pas un problème pour moi.
Comment voulez-vous suggérer de donner un score à la suite? J'aimerais exécuter ce code sur l'ensemble de mon index et de trouver la meilleure correspondance. Dois-je compter le nombre de keypoints après filtrage, les matchs ou ajouter toutes les distances ensemble ou d'obtenir la moyenne des distances? Je ne sais pas ce qui serait un bon critère.
OriginalL'auteur KLowe
J'ai eu un problème similaire avec opencv python et est venu ici via google.
Pour résoudre mon problème, j'ai écrit le code python pour la mise en correspondance de filtrage basé sur @KLowes solution. Je vais partager ici au cas où quelqu'un d'autre a le même problème:
Correspondant à un filtre
filter_matches(matches, matches2, k_scene, k_ftr)
doit être appelée lorsquematches, matches2
représenter les correspondances obtenues par orb-matcher etk_scene, k_ftr
correspondent des keypoints.OriginalL'auteur snalx
Je ne pense pas qu'il y est quelque chose de très mal avec votre code. De mon expérience opencv l'ORBE est sensible aux variations d'échelle.
Vous pouvez probablement confirmer cela avec un petit test, de faire quelques images avec la rotation de seulement et certains avec des variations d'échelle. La rotation de ceux correspondront probablement bien, mais la taille ne va pas (je pense que la diminution de l'échelle est le pire).
Je vous conseillons également d'essayer la version d'opencv à partir du tronc (voir opencv du site, pour compiler des instructions), ORBE a été mis à jour depuis 2.3.1 et effectue un peu mieux, mais toujours a ces problèmes d'échelle.
Que et sift et surf sont beaucoup plus lent que l'orbe. Si j'ai vraiment besoin de l'exactitude des vagues et a la programmation d'un ordinateur de bureau (je suis de programmation pour le mobile), je voudrais essayer de surf GPU version (opencv est une mise en œuvre de surf qui utilise le GPU, également de l'ORB je crois) pour voir si je pouvais le faire assez vite. Il y a aussi le JEÛNE du détecteur, il est rapide mais pas très précis, et la BRÈVE détecteur. BREF, pas la rotation de l'invariant, mais vous pouvez pirater que par la fourniture de plusieurs tourné requête images (je voudrais lire ce site et de son code pour voir brève: cvlab.epfl.ch/software/brief/index.php).
Pour ma part il s'avère que mon principal problème était dans le filtrage. J'ai trouvé un autre débordement de pile réponse que visée à l'ouvrage "OpenCV 2 Vision par Ordinateur de Programmation d'Application de livre de cuisine" Ch9: faire correspondre les images à l'aide de random sample consensus. En gros, plutôt que de simplement l'abattage de tous les matches en dessous d'une certaine distance, ils sont à l'aide de 3 filtres différents sont me laissant avec plus de bons matchs. Auparavant, j'ai enlever tous les matches en dessous de la distance 15.0, ce me laissant avec tous les bons matchs, mais j'ai été abattage des bons matchs dans le processus.
Nice, je vais jeter un oeil à ce. Pouvez-vous partager la correction que vous faites pour le code de sorte que vous répondez à votre propre question? 😉
OriginalL'auteur Rui Marques