Я использую SIFT для обнаружения, описания точек функции на двух изображениях следующим образом.Почему RANSAC не удаляет все отклонения в матчах SIFT?
void FeaturePointMatching::SIFTFeatureMatchers(cv::Mat imgs[2], std::vector<cv::Point2f> fp[2])
{
cv::SiftFeatureDetector dec;
std::vector<cv::KeyPoint>kp1, kp2;
dec.detect(imgs[0], kp1);
dec.detect(imgs[1], kp2);
cv::SiftDescriptorExtractor ext;
cv::Mat desp1, desp2;
ext.compute(imgs[0], kp1, desp1);
ext.compute(imgs[1], kp2, desp2);
cv::BruteForceMatcher<cv::L2<float> > matcher;
std::vector<cv::DMatch> matches;
matcher.match(desp1, desp2, matches);
std::vector<cv::DMatch>::iterator iter;
fp[0].clear();
fp[1].clear();
for (iter = matches.begin(); iter != matches.end(); ++iter)
{
//if (iter->distance > 1000)
// continue;
fp[0].push_back(kp1.at(iter->queryIdx).pt);
fp[1].push_back(kp2.at(iter->trainIdx).pt);
}
// remove outliers
std::vector<uchar> mask;
cv::findFundamentalMat(fp[0], fp[1], cv::FM_RANSAC, 3, 1, mask);
std::vector<cv::Point2f> fp_refined[2];
for (size_t i = 0; i < mask.size(); ++i)
{
if (mask[i] != 0)
{
fp_refined[0].push_back(fp[0][i]);
fp_refined[1].push_back(fp[1][i]);
}
}
std::swap(fp_refined[0], fp[0]);
std::swap(fp_refined[1], fp[1]);
}
В приведенном выше коде, я использую findFundamentalMat()
для удаления выбросов, но в результате img1 и img2 Есть еще некоторые плохие матчи. На изображениях каждая зеленая линия соединяет пару сопряженных точек. И, пожалуйста, игнорируйте красные знаки. Я не могу найти ничего плохого, может ли кто-нибудь дать мне какие-то намеки? Заранее спасибо.
Спасибо за подробное объяснение. Не 'cv :: findFundamentalMat (fp [0], fp [1], cv :: FM_RANSAC, 3, 1, mask);' выполните полный шаг RANSAC, как вы сказали? – Anonymous
Ах да. Глядя на документы opencv, похоже, это так. У меня есть ощущение, что эти параметры не могут быть оптимизированы. Поэтому первое, что я хотел бы попробовать, - уменьшить Param1 от 3 до более низких значений и посмотреть, что я получаю. Я бы также установил Param2 примерно на 0.99, так как это может уменьшить количество итераций и время вычисления. Очевидность 1 кажется слишком большой. – Luca
Спасибо. Я попробую. – Anonymous