CV :: evaluateFeatureDetector不起作用?

时间:2016-06-02 15:44:45

标签: c++ opencv image-processing descriptor

我想评估一些探测器

#include <opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(void)
{
    //===================VARIABLES==========================
    //input images
        Mat img_1 = imread("data/graf1.png", IMREAD_GRAYSCALE);
        Mat img_2 = imread("data/graf3.png", IMREAD_GRAYSCALE);
    //homography matrix
    Mat H1to2;
    FileStorage fs("data/H1to3p.xml", FileStorage::READ);
    fs.getFirstTopLevelNode() >> H1to2;
    //keypoints vector
        vector<KeyPoint> keypoints_1, keypoints_2;
    //decripotrs matrices
    Mat desc1, desc2;
    //SIFT detector
    Ptr<xfeatures2d::SIFT> sift = xfeatures2d::SIFT::create();
    //Descriptor evaluation
    float repeatability;
    int correspCount;
    evaluateFeatureDetector(img_1,img_2,H1to2,&keypoints_1,&keypoints_2,repeatability,correspCount,sift);
    cout<<"repeatability="<<repeatability<<" correspCount="<<correspCount<<" Keypoint 1st="<<keypoints_1.size()<<" Keypoint 2st="<<keypoints_2.size()<<endl;
    return 0;
}

这是输出:

repeatability=0.484741 correspCount=953 Keypoint 1st=2667 Keypoint 2st=3498

但由于repeatability=correspCount/min(Keypoint 1st,Keypoint 2st)上面的值不正确。

this answer中解释了一个可能的原因,但看看evaluation.cpp(尤其是evaluateFeatureDetector)中calculateRepeatability的实施方式,似乎已经删除了这些非常见的关键点:

...

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 );
}
...

2 个答案:

答案 0 :(得分:0)

evaluation.cpp第429行:

size_t size1 = keypoints1.size(), size2 = keypoints2t.size();
size_t minCount = MIN( size1, size2 );

其中keypoints1是第一张图像中的实际关键点,keypoints2t是第一张图像上第二张图像中关键点的投影。换句话说,keypoints2t=proj(keypoints2,H^-1)。因此,公式中的分母可能来自size(keypoints1)size(projection of keypoints2)

在您提供的输出行中,我假设correspCount=953size1=2667size2=1966

答案 1 :(得分:0)

EvaluateFeatureDetector()的代码似乎完全按照中所述的测量方式实现 ķ。 Mikolajczyk,T。Tuytelaars,C。Schmid,A。Zisserman,J。Matas,F。Schaffalitzky,T。Kadir和L. Van Gool。仿射区域探测器的比较。 IJCV,1(65):43-72,2005。

他们写&#34;我们只考虑位于两个图像中场景部分的区域。&#34; 此外,将要素的大小标准化为通用比例30,并接受小于40%的重叠误差作为要素的重复。

K中也提到了相同的标准。 Mikolajczyk和C. Schmid,“Scale&amp; amp;仿射不变的兴趣点探测器,“Int。 J. Comput。 Vis。,vol。 60,不。 1,pp.63-86,2004。但是他们也有这样的标准,即要素的中心距离必须相距1.5像素。我在他们的实施中找不到,但论文也比较老,也许他们对这个标准进行了重复。

如果你仍然感兴趣,你也可以查看this网站,这将引导你进入原始的matlab iplementation,我想这是人们使用的。