2012-06-19 4 views
5
Assertion

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?

+0

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

+0

recherche des descripteurs vides. if (! descriptors.empty()) {// fait du flan bébé} – madLokesh

+0

change aussi les descripteurs au format CV_32F – madLokesh

Répondre

0

C'est étrange, il coutures le même code dans this tutorial page ...

Peut-être que vous pouvez essayer d'utiliser l'interface cv :: DescriptorMatcher (docs here).

L'utilisation est:

cv::DescriptorMatcher matcher = cv::DescriptorMatcher::create("FlannBased"); 

Et puis vous pouvez l'utiliser directement avec votre code sans aucun changement.

Questions connexes