CV::valuFeatureDetector не работает?
Я хочу оценить какой-то детектор
#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)
указанное выше значение не является правильным.
В этом ответе объясняется возможная причина, но смотря как evaluateFeatureDetector
реализуется в evaluation.cpp
(особенно 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 ответа
Код EvaluateFeatureDetector()
похоже, что в точности реализуют измерения, как описано у К. Миколайчика, Т. Туйтелаара, С. Шмида, А. Циссермана, Дж. Матаса, Ф. Шаффалицкого, Т. Кадира и Л. Ван Гула. Сравнение детекторов аффинных областей. IJCV, 1 (65): 43–72, 2005.
Они пишут: "Мы учитываем только области, расположенные в той части сцены, которая присутствует на обоих изображениях". Также нормализуйте размер объектов до общей шкалы 30 и примите ошибку перекрытия менее 40 % в качестве повторения объекта.
Тот же критерий упоминается также в работе К. Миколайчика и К. Шмида, "Масштабные и аффинно-инвариантные детекторы точек интереса", Int. J. Comput. Vis., Vol. 60, нет 1, pp. 63–86, 2004. Но там у них также есть критерий того, что центры объектов не должны находиться дальше друг от друга, чем 1,5 пикселя. То, что я не смог найти в их реализации, но статья также старше, и, возможно, они переделали об этом критерии.
В случае, если вы все еще заинтересованы, вы также можете посетить этот веб-сайт, который также приведет вас к оригинальной реализации Matlab, которую, я думаю, используют люди.
В 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
,