Я пытаюсь использовать 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?