Ошибка ФЛАННА в OpenCV 3

я запускаю Ubuntu 14.04. Я пытаюсь запустить FLANN с openCV 3, но я получаю ошибку.

все ниже было попробовано с помощью AKAZE и ORB, но код, если от моей попытки использовать ORB.

Я использую ORB для поиска дескрипторов и ключевых точек.

  Ptr<ORB> detector = ORB::create();

  std::vector<KeyPoint> 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 );

после использования ORB я использую следующий код для поиска совпадений:

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

код строится нормально и все такое. Когда я запускаю код, я получаю эту ошибку:

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)

Can кто - нибудь скажет мне почему? Это что-то с OpenCV 3, находящимся в бета-состоянии? Есть ли альтернатива FLANN (кроме BFMatcher)

3 ответов


Так что я сказал:

чтобы использовать FlannBasedMatcher вам нужно преобразовать дескрипторы в 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);
}

вы можете взглянуть на этот же вопрос:


ответ Рафаэля Руиса Муньоса неверен.

преобразования дескрипторов CV_32F elimilated ошибка утверждения. Но, matcher будет поведение в неправильном направлении.

ORB-дескриптор Хэмминга. По умолчанию FlannBasedMatcher создает L2 euclid KDTreeIndexParams ().

попробуйте init matcher в проточном пути,

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

Unsupported format or combination of formats также выбрасывается, если дескрипторы не могут быть вычислены.

вы можете проверить, если это так, используя empty() после detectAndCompute, таким образом:

  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__);
  }