3

参考这个问题的答案:

发生的情况是,您正在考虑在第二张图像中检测到的所有关键点来计算可重复性,实际上应该只使用单应性内的关键点。

我不明白如何获得

具有单应性的关键点

有人可以解释怎么做吗?

编辑:

实际上看evaluation.cpp我认为这个操作已经执行的代码。事实上,看:

float overlapThreshold;
bool ifEvaluateDetectors = thresholdedOverlapMask == 0;
if( ifEvaluateDetectors )
{
    overlapThreshold = 1.f - 0.4f;

    // remove key points from outside of the common image part
    Size sz1 = img1.size(), sz2 = img2.size();
    filterEllipticKeyPointsByImageSize( keypoints1, sz1 );
    filterEllipticKeyPointsByImageSize( keypoints1t, sz2 );
    filterEllipticKeyPointsByImageSize( keypoints2, sz2 );
    filterEllipticKeyPointsByImageSize( keypoints2t, sz1 );
}
else
{
    overlapThreshold = 1.f - 0.5f;

    thresholdedOverlapMask->create( (int)keypoints1.size(), (int)keypoints2t.size(), CV_8UC1 );
    thresholdedOverlapMask->setTo( Scalar::all(0) );
}

默认情况下考虑这一点thresholdedOverlapMask=0。所以里面的部分if丢弃了单应性外面的点。那是对的吗?

4

1 回答 1

2

具有单应性的关键点 这些点被认为是结果单应矩阵的内点。换句话说:

假设您使用 RANSAC 之类的估计技术来获取您的 Homograph 矩阵,您的一些点将用于构建这个 Homograph。其他只是噪音(异常值)。你需要知道你的哪些点不是噪音并且被用来构建这个 Homograph。


如何在 OpenCV 中做到这一点?

cv::findHomography函数具有以下签名:

Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() );

该参数OutputArray mask是您正在寻找的。你可以像这样使用它:

std::vector<uchar> homograph_mask;
auto H= cv::findHomography(set_of_points, other_set_of_points, cv::RANSAC, RANSAC_THRESHOLSD, homograph_mask);
std::vector<std::pair<cv::Point,cv::Point>> points_within_the_homograph;
points_within_the_homograph.reserve(homograph_mask.size());
for(size_t i=0; i < homograph_mask.size();++i){
    if(homograph_mask[i]==static_cast<uchar>(1)){
         points_within_the_homograph.emplace_back(set_of_points[i],other_set_of_points[i]);
    }
}
points_within_the_homograph.shrink_to_fit();

points_within_the_homograph将包含同形异义词(内点)内的一组匹配点对。

于 2016-06-02T09:03:54.280 回答