J'utilise OpenCV2.2 dans Windows 7. Ce que je suis en train à faire est de détecter un objet défini dans une autre image en utilisant ce code:FlannBased matcher a échoué Erreur
// Read the two image files
Mat image1 = imread(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
Mat image2 = imread(argv[2], CV_LOAD_IMAGE_GRAYSCALE);
Mat finalImage = imread(argv[2]);
if(!image1.data || !image2.data) {
std::cout << " --(!) Error reading images " << std::endl;
return -10;
}
//Construct the SURF Detector
int minHessian = 400;
SurfFeatureDetector detector(minHessian);
//Extract the keypoints for each image
std::vector<KeyPoint> keypoints1, keypoints2;
detector.detect(image1,keypoints1);
detector.detect(image2,keypoints2);
//Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(image1,keypoints1,descriptors1);
extractor.compute(image2,keypoints2,descriptors2);
//Define the Matcher
FlannBasedMatcher matcher;
std::cout << "matcher constructed!" << std::endl;
std::vector<vector<DMatch >> matches;
matcher.knnMatch(descriptors1, descriptors2, matches, 2);
std::cout << "matches: " << matches.size() << std::endl;
std::vector<DMatch > good_matches;
//THIS LOOP IS SENSITIVE TO SEGFAULTS
for (int i = 0; i < min(descriptors2.rows-1,(int) matches.size()); i++)
{
if((matches[i][0].distance < 0.8*(matches[i][1].distance)) && ((int) matches[i].size()<=2 && (int) matches[i].size()>0))
{
good_matches.push_back(matches[i][0]);
}
}
std::cout << "good_matches: " << good_matches.size() << std::endl;
VS2010 construit et compile le code sans erreur. Mon problème est que dans certains (et pas tous), lorsque l'exécution va à la ligne
matcher.knnMatch(descriptors1, descriptors2, matches, 2);
les arrêts cmd et renvoie un message comme: « Échec de l'assertion (dataset.Type() == CvType(T)::type()
) en fonction inconnue, etc., etc. Ceci se produit lorsqu'il n'y a pas de similarité entre les images (et pas dans tous les cas), bien que les descripteurs (nécessaires pour l'appariement) soient extraits correctement des deux images. Le code fonctionne bien si j'utilise le matcher BruteForce.
J'ai aussi essayé le code de OpenCV:
http://opencv.itseez.com/doc/tutorials/features2d/feature_homography/feature_homography.html
et avait la même question. L'exécution échoue même si j'utilise le simple matcher comme dans l'exemple Opencv.
std::vector<DMatch> matches;
matcher.match(descriptors_object, descriptors_scene, matches);
J'ai cherché une solution (une question similaire trouvé à OpenCV flann.h assertion Error mais malheureusement pas de réponse), mais je ne trouve pas quelque chose d'utile. Y at-il quelqu'un qui sait comment s'attaquer à ce problème?
Je ne sais pas si cela va résoudre votre problème, mais que faire si vous essayez de convertir des descripteurs en type CV_32F. – andriy
recherche des descripteurs vides. if (! descriptors.empty()) {// fait du flan bébé} – madLokesh
change aussi les descripteurs au format CV_32F – madLokesh