Error de FLANN en OpenCV 3

Estoy ejecutando Ubuntu 14.04. Estoy intentando ejecutar FLANN con openCV 3 pero me sale un error.

Todo lo que sigue fue intentado usando AKAZE y ORB, pero el código es de mi bash de usar ORB.

Utilizo ORB para encontrar los descriptores y los puntos clave.

Ptr detector = ORB::create(); std::vector keypoints_1, keypoints_2; Mat descriptors_1, descriptors_2; detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 ); detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 ); 

Después de usar ORB, uso el siguiente código para encontrar coincidencias:

  FlannBasedMatcher matcher; std::vector matches; matcher.match(descriptors_1, descriptors_2, matches); 

El código construye bien y todo. Cuando ejecuto el código me sale este error:

 OpenCV Error: Unsupported format or combination of formats (type=0 ) in buildIndex_, file /home/jim/opencv/modules/flann/src/miniflann.cpp, line 315 terminate called after throwing an instance of 'cv::Exception' what(): /home/jim/opencv/modules/flann/src/miniflann.cpp:315: error: (-210) type=0 in function buildIndex_ Aborted (core dumped) 

¿Puede alguien decirme por qué? ¿Es algo con OpenCV 3 en estado BETA? ¿Hay una alternativa a FLANN (excepto BFMatcher)

Así que lo que dije:

Para utilizar FlannBasedMatcher , necesita convertir sus descriptores a CV_32F :

 if(descriptors_1.type()!=CV_32F) { descriptors_1.convertTo(descriptors_1, CV_32F); } if(descriptors_2.type()!=CV_32F) { descriptors_2.convertTo(descriptors_2, CV_32F); } 

Puedes echar un vistazo a esta pregunta similar :

La respuesta de Rafael Ruiz Muñoz es errónea.

Convertir los descriptores a CV_32F eliminó el error de aserción. Pero, el emparejador se comportará de manera incorrecta.

ORB es descriptor de Hamming. De forma predeterminada, el FlannBasedMatcher crea KDTreeIndexParams () Euclid L2.

Trate de iniciar el emparejador en la forma fluida,

 cv::FlannBasedMatcher matcher(new cv::flann::LshIndexParams(20, 10, 2)); 

También se lanza un Unsupported format or combination of formats si no se pueden calcular los descriptores.

Puede verificar si ese es el caso usando empty() después de detectAndCompute , por lo tanto:

  detector->detectAndCompute( img_1, noArray(), keypoints_1, descriptors_1 ); detector->detectAndCompute( img_2, noArray(), keypoints_2, descriptors_2 ); if ( descriptors_1.empty() ) { cvError(0,"MatchFinder","descriptors_1 descriptor empty",__FILE__,__LINE__); } if ( descriptors_2.empty() ) { cvError(0,"MatchFinder","descriptors_2 empty",__FILE__,__LINE__); }