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?
No estoy seguro si esto resolverá su problema, pero ¿qué ocurre si intenta convertir los descriptores al tipo CV_32F? – andriy
verifique si los descriptores están vacíos. if (! descriptors.empty()) {// hacer un flann baby} – madLokesh
también cambian las descripciones al formato CV_32F – madLokesh