2012-06-19 15 views
5

estoy usando OpenCV2.2 en Windows 7. Lo que estoy tratando de hacer es detectar un objeto definido en otra imagen utilizando este código:FlannBased Matcher aserción error

// 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 construye y compila el código sin error. Mi problema es que en algunos (y no todos) de los casos, cuando la ejecución pasa a la línea

matcher.knnMatch(descriptors1, descriptors2, matches, 2);

las paradas cmd y devuelve un mensaje como: "Error de aserción (dataset.Type() == CvType(T)::type()) en función desconocida, etc., etc. terminando en la línea flann.hpp 105 "

Esto ocurre cuando no hay similitud entre las imágenes (y no para todos los casos), aunque los descriptores (necesarios para emparejar) se extraen correctamente de ambas imágenes. El código funciona bien si uso el matcher BruteForce.

También he probado el código de OpenCV:

http://opencv.itseez.com/doc/tutorials/features2d/feature_homography/feature_homography.html

y tenía el mismo problema. La ejecución falla incluso si uso el marcador simple como en el ejemplo de Opencv.

std::vector<DMatch> matches;

matcher.match(descriptors_object, descriptors_scene, matches);

Busqué la solución (una pregunta similar que se encuentra en OpenCV flann.h assertion Error, pero por desgracia no hay respuesta), pero no encontré nada útil. ¿Hay alguien que sepa cómo abordar este problema?

+0

No estoy seguro si esto resolverá su problema, pero ¿qué ocurre si intenta convertir los descriptores al tipo CV_32F? – andriy

+0

verifique si los descriptores están vacíos. if (! descriptors.empty()) {// hacer un flann baby} – madLokesh

+0

también cambian las descripciones al formato CV_32F – madLokesh

Respuesta

0

eso es extraño, que las costuras del mismo código en this tutorial page ...

Tal vez usted puede tratar de utilizar la interfaz de CV :: DescriptorMatcher (docs here).

El uso es:

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

Y luego se puede utilizar directamente con su código sin ningún cambio.

Cuestiones relacionadas