gpt4 book ai didi

opencv - 为什么RANSAC不删除SIFT比赛中的所有异常值?

转载 作者:行者123 更新时间:2023-12-02 17:45:37 25 4
gpt4 key购买 nike

我使用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()删除异常值,但是在结果 img1img2中仍然存在一些错误匹配项。在图像中,每条绿线连接匹配的特征点对。并且请忽略红色标记。我找不到任何错误,有人可以给我一些提示吗?提前致谢。

最佳答案

RANSAC只是可靠的估计器之一。原则上,可以使用多种方法,但是RANSAC被证明可以很好地工作,只要您的输入数据不受异常值的支配即可。您可以检查RANSAC上的其他变体,例如MSAC,MLESAC,MAPSAC等,它们也具有其他一些有趣的属性。您可能会发现此CVPR演示很有趣(http://www.imgfsr.com/CVPR2011/Tutorial6/RANSAC_CVPR2011.pdf)

根据输入数据的质量,您可以估算出最佳RANSAC迭代次数,如此处所述(https://en.wikipedia.org/wiki/RANSAC#Parameters)

再次,它是鲁棒的估计器方法之一。您可以采用其他统计方法,例如使用重尾分布,修剪最小二乘法等对数据建模。

在您的代码中,您缺少RANSAC步骤。 RANSAC基本上有2个步骤:

generate hypothesis (do a random selection of data points necessary to fit your mode: training data).
model evaluation (evaluate your model on the rest of the points: testing data)
iterate and choose the model that gives the lowest testing error.

关于opencv - 为什么RANSAC不删除SIFT比赛中的所有异常值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36028301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com