Ошибка FLANN в 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)

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

8

Решение

Итак, что я сказал:

для того, чтобы использовать 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);
}

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

11

Другие решения

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

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

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

Попробуй инициировать совпадение по течению,

cv::FlannBasedMatcher matcher(new cv::flann::LshIndexParams(20, 10, 2));
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__);
}
1
По вопросам рекламы [email protected]