Я использую opencv 3.2.0 и пытаюсь использовать функции обнаружения, вычисления дескрипторов и сопоставления дескрипторов с FAST, BRISK, BruteForce соответственно. Я использую C ++ с Visual Studio 2017.
std::vector<KeyPoint> keypoints1, keypoints2;
cv::Mat descriptors1, descriptors2;
m_image_A = imread("a.bmp", IMREAD_GRAYSCALE);
m_image_B = imread("b.bmp", IMREAD_GRAYSCALE);
cv::Ptr<cv::FeatureDetector> a = cv::FastFeatureDetector::create();
a->detect(m_image_A, keypoints1);
a->detect(m_image_B, keypoints2);
cv::Ptr<cv::DescriptorExtractor> ex = cv::BRISK::create();
ex->compute(m_image_A, keypoints1, descriptors1);
ex->compute(m_image_B, keypoints2, descriptors2);
cv::Ptr<cv::DescriptorMatcher> matcher;
std::vector<vector<DMatch>> matches;
matcher = cv::BFMatcher::create();
matcher->knnMatch(descriptors1, descriptors2, matches, 2);
Вот мой простой код для этого, и он не работает должным образом.
Я прочитал много кодов и советов, но не могу найти правильного решения для своей проблемы.
Есть кто-нибудь, кто может мне помочь? Как я могу заставить его работать должным образом?
Если этот метод не работает, используйте фланговый метод, следующий за методом гомографии. Это даст вам точный результат расстояния между ключевыми точками, а также того, сколько точек действительно совпадает под любым углом.
Конструктор BFMatcher имеет аргумент normType.
BFMatcher::create(NORM_HAMMING, false);
Для SIFT и SURF может применяться стандартная норма L1, но в документации сказано, что для BRISK NORM_HAMMING следует использовать (https://docs.opencv.org/3.4.0/d3/da1/classcv_1_1BFMatcher.html) Возможно, это решает проблему. Но вы должны четко указать, что означает, что ваше решение «не работает должным образом».
Еще одна проблема, с которой я столкнулся при попытке использования различных комбинаций дескрипторов и методов сопоставления, заключалась в том, что некоторые дескрипторы сохраняются в двоичном формате и, следовательно, не могут быть легко подвергнуты последующей обработке стандартными методами сопоставления.