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,

Другие вопросы по тегам