Я использую 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();
}