OpenCV SURFDetector Диапазон minHessian

Я использую OpenCV SURFDetector для поиска ключевых точек на изображении. В моей программе я хочу дать пользователю возможность установить значение minHessian с помощью трекбара, но это означает, что мне нужно знать диапазон значений гессиана.

Я знаю, что чем выше я устанавливаю этот порог, тем меньше ключевых точек я получаю, и наоборот.

Есть ли способ вычислить диапазон значений гессиана, чтобы я мог установить 0 (что было бы очень высоким порогом minHessian) на моей панели управления для «без ключевых точек» и 100 (что, вероятно, minHessian = 1 или 0) для «всех возможные ключевые моменты»?

Я уже рассмотрел этот вопрос, но это мне здесь не поможет: Что означает minHessian (Surffeaturedetector)

Изменить: я нашел работающий способ для своего приложения, но меня это решение не устраивает. Вот что я делаю сейчас: я постоянно повышаю свой minHessian и проверяю, нахожу ли я все еще ключевые точки, но этот вариант не является ни быстрым, ни действительно точным, потому что мне нужно делать большие шаги (в моем случае i+=100), чтобы получить результаты быстрее. Я почти уверен, что есть другое решение. Как насчет бинарного поиска или чего-то подобного? Неужели нельзя вычислить значение maxHessian?

Вот мой код:

С#-сторона:

private int getMaxHessianValue()
{
   int maxHessian = 0;
   for (int i = 0; i < 100000; i+=100)
   {
       int numberOfKeypoints = GetNumberOfKeypoints(pathToImage, i);

       if (numberOfKeypoints == 0) // no keypoints found? -> maxHessian
       {
            maxHessian = i;
            break;
       }
   }
   return maxHessian;
}

C++-сторона:

int GetNumberOfKeypoints(char* path, int minHessian)
{
    /// Load image
    Mat templ;
    templ = imread( path, CV_LOAD_IMAGE_GRAYSCALE );


    // Detect the keypoints using SURF Detector

    SurfFeatureDetector detector( minHessian );
    std::vector<KeyPoint> keypoints;
    detector.detect( templ, keypoints );

        // return number of keypoints
    return keypoints.size(); 
}

person Mickey    schedule 25.02.2014    source источник


Ответы (1)


У меня тот же вопрос относительно верхней границы [определителя] Гессе, и я не нашел ответа с теоретической точки зрения.

Однако для вашей конкретной цели я бы порекомендовал вам перейти к исходному коду детектора SURF, в частности, найти часть для SURFFindInvoker::findMaximaInLayer, и вы увидите, что обнаружение ключевых точек принимается/отклоняется через это условие: if( val0 > hessianThreshold ). Итак, я думаю, вы могли бы вставить пару строк кода непосредственно перед оператором IF, чтобы сохранить максимум val0, и это сообщит вам максимум гессиана для этого конкретного изображения. Обратите внимание, что вы должны убедиться, что максимум сохранен во всех слоях и октавах, иначе вы найдете только локальный максимум.

Конечно, вы можете придумать что-то гораздо более элегантное, но в основном именно здесь вы найдете максимум непосредственно. То, что вы реализовали, - это косвенный способ узнать значение.

Надеюсь, это полезно, Lood Guck!

person AlfonsoRD    schedule 07.03.2014