L'ORBE n'est pas la détection des keyPoints dans opencv 2.4.9
Je suis en train d'essayer de détecter les keypoints avec l'ORBE tout est bien jusqu'à ce que je suis passé à Opencv 2.4.9.
Premières, il semble que le nombre de clés decresed, et pour certains d'images, pas de keypoints sont détectés :
C'est mon code compilé avec deux version : (2.3.1 et 2.4.9)
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
int main(int argc, char **argv){
Mat img = imread(argv[1]);
std::vector<KeyPoint> kp;
OrbFeatureDetector detector;
detector.detect(img, kp);
std::cout << "Found " << kp.size() << " Keypoints " << std::endl;
Mat out;
drawKeypoints(img, kp, out, Scalar::all(255));
imshow("Kpts", out);
waitKey(0);
return 0;
}
Résultat :
2.3.1 :
Trouvé 152 Keypoints
2.4.9 :
Trouvé 0 Keypoints
J'ai aussi testé avec un autre ORBE Constructeur, mais j'obtiens le même résultat, pas de KPts.
La même constuctor valeurs que dans 2.3.1 par défaut du constructeur :
2.4.9 personnalisé fabr :
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
using namespace cv;
int main(int argc, char **argv){
Mat img = imread(argv[1]);
std::vector<KeyPoint> kp;
//default in 2.4.9 is : ORB(700, 1.2f, 3, 31, 0);
OrbFeatureDetector detector(500, 1.2f, 8, 31, 0); //default values of 2.3.1
detector.detect(img, kp);
std::cout << "Found " << kp.size() << " Keypoints " << std::endl;
Mat out;
drawKeypoints(img, kp, out, Scalar::all(255));
imshow("Kpts", out);
waitKey(0);
return 0;
}
Avez-vous une idée de ce qui se passe ? Et comment puis-je résoudre ce problème ?
Merci.
Avez-vous des solutions?
Sur d'autres images que vous avez trouvé 0 keypoints trop ? Ou tout simplement de moins en moins de keypoints qu'avec openCV 2.3.1 ?
Sur d'autres images que vous avez trouvé 0 keypoints trop ? Ou tout simplement de moins en moins de keypoints qu'avec openCV 2.3.1 ?
OriginalL'auteur rednaks | 2014-05-03
Vous devez vous connecter pour publier un commentaire.
La mise en œuvre de l'ORB dans OpenCV a changé de façon très significative entre la version 2.3.1 et 2.4.9. Il est difficile de pin-point que l'on peut expliquer le comportement que vous avez observé.
Cependant, en modifiant la valeur du seuil du contour, vous pouvez augmenter le nombre de détection de caractéristiques de nouveau.
Ci-dessous est une version adaptée de votre code pour afficher ce que je veux dire (attention, je n'ai pu tester avec OpenCV 3.0.0, mais je suppose que vous obtenez le point).
OriginalL'auteur nils
Dans OpenCV 3.1, au moins, le
edgeThreshold
paramètre est en fait la "taille de la frontière, où les fonctions ne sont pas détectés." Un moyen de détecter des fonctionnalités supplémentaires est de diminuer lafastThreshold
paramètre. C'est un nom trompeur, car ce seuil une incidence sur le nombre de coins détecté, même lors de l'utilisation deORB::HARRIS_SCORE
, c'est-à Harris keypoints, non seulement RAPIDE keypoints que vous pourriez le penser basé sur le nom d'argument. C'est aussi un peu trompeuse, caredgeThreshold
lui-même sonne comme un seuil sur Harris coin de détection, pas sur la partie de l'image utilisée pour la détection de points.Voir: http://docs.opencv.org/trunk/db/d95/classcv_1_1ORB.html#gsc.tab=0.
En outre, l'augmentation du nombre de niveaux de la pyramide
nlevels
pourrait vous donner plus de keypoints, même si la taille de vos images sont identiques, la seule différence est que votre version d'OpenCV, il est peu probable pour aider ici.J'ai rencontré le même problème et voici le code qui a travaillé:
std::vector<KeyPoint> kpts1;
Mat desc1;
Ptr<ORB> orb = ORB::create(100, 2, 8, 31, 0, 2, ORB::HARRIS_SCORE, 31, 20);
orb->detectAndCompute(input_image, Mat(), kpts1, desc1);
Le dernier argument (20 ci-dessus) est la
fastThreshold
à la baisse pour obtenir de nouveaux keypoints.OriginalL'auteur chloelle