我想评估一些探测器
#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 );
}
...
答案 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=953
,size1=2667
和size2=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,我想这是人们使用的。