Ошибка SIFT Assertion Failed

Я пытаюсь использовать SIFT для сопоставления двух изображений, и я использую приведенный ниже код:

cv::initModule_nonfree(); 

cv::Mat matFrame(frame);
cv::Mat matFrameAnt(frameAnterior);

cv::SiftFeatureDetector detector(400);            //I've tried different values here
cv::SiftDescriptorExtractor extractor(400);       //but i get always the same error

std::vector<cv::KeyPoint> keypoints1;
std::vector<cv::KeyPoint> keypoints2;

detector.detect( matFrame, keypoints1 );
detector.detect( matFrameAnt, keypoints2 );

cv::Mat feat1;
cv::Mat feat2;
cv::Mat descriptor1;
cv::Mat descriptor2;

extractor.compute( matFrame, keypoints1, descriptor1 );
extractor.compute( matFrameAnt, keypoints2, descriptor2 );

    std::vector<cv::DMatch> matches;

cv::BFMatcher matcher(cv::NORM_L2, false); 

matcher.match(descriptor1,descriptor2, matches);

cv::Mat result;
cv::drawMatches( matFrame, keypoints1, matFrameAnt, keypoints2, matches, result );

cv::namedWindow("SIFT", CV_WINDOW_AUTOSIZE );
cv::imshow("SIFT", result);

Я получаю эту ошибку при запуске кода (он отлично компилируется).

«Ошибка OpenCV: утверждение не удалось (firstOctave> = -1 && actualNlayers‹ = nOctaveLayers) в неизвестной функции, файл ...... \ src \ opencv \ modules \ nonfree \ src \ sift.cpp, строка 755 ».

Я понимаю, что эта функция получает неположительное значение, поэтому я распечатал все возможные значения из своего кода и обнаружил, что размер двух моих векторов ключевых точек равен -616431 и -616422. Два изображения, которые я использую, являются черно-белыми, с черным черным фоном и моей рукой (белой) посередине.

Что творится? Я использую недействительные изображения? Я неправильно использую функции cv :: SiftFeatureDetector и cv :: SiftDescriptorExtractor?


person Miguel Cantó Bataller    schedule 04.06.2013    source источник
comment
Ладно, я понял. cv :: SiftFeatureDetector детектор (50); cv :: SiftDescriptorExtractor экстрактор; Он работал с этими параметрами.   -  person Miguel Cantó Bataller    schedule 04.06.2013


Ответы (1)


Похоже, ты понятия не имеешь, что делаешь. Эта функция практически не документирована, поэтому попробуйте покопаться в источнике или позвольте мне рассказать вам, что вы сделали.

cv::SiftFeatureDetector detector(50)

Это означает, что вы получите не более 50 матчей.

cv::SiftDescriptorExtractor extractor(400);

Это означает, что ваше увеличение для экструдирования составляет 400x. Для нормальных результатов этот параметр должен быть в порядке «1».

Остальная документация находится здесь: http://docs.opencv.org/2.3/modules/features2d/doc/common_interfaces_of_feature_detectors.html#SiftFeatureDetector.

person TimZaman    schedule 31.01.2014