2015-06-04 3 views
0

Я использую openCV, чтобы выполнить извлечение некоторой плотной функции. Например, КодOpenCV Dense признак функции

DenseFeatureDetector detector(12.f, 1, 0.1f, 10); 

Я действительно не понимаю параметры в указанном выше конструкторе. Что это значит ? Чтение opencv documentation об этом тоже не очень помогает. В документации приведены следующие аргументы:

DenseFeatureDetector(float initFeatureScale=1.f, int featureScaleLevels=1, 
          float featureScaleMul=0.1f, 
          int initXyStep=6, int initImgBound=0, 
          bool varyXyStepWithScale=true, 
          bool varyImgBoundWithScale=false); 

Что они должны делать? то есть значение масштаба, initFeatureScale, featureScaleLevels и т. д.? Как узнать расстояние между сеткой или сеткой и т. Д. Для плотной выборки.

+0

Посмотрите на мой ответ на тот же вопрос здесь: http://stackoverflow.com/questions/29970191/opencv-python-dense-sift-settings/32246964#32246964 –

ответ

0

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

Когда я использую плотный детектор, я пропускаю там изображение с серой шкалой. Детектор создает некоторые пороговые фильтры, в которых opencv использует минимальное значение серого, которое используется для преобразования изображения. Пиксели, где уровень серого выше порога, будут сделаны как черные точки, а остальные - белые. Это действие повторяется в цикле, где порог будет больше и больше. Таким образом, параметр initFeatureScale определяет первый порог, который вы поставили для этого цикла, параметр featureScaleLevels указывает, насколько этот порог больше между одной итерацией цикла и следующей, а featureScaleMul является множителем для вычисления следующего порога.

В любом случае, если вы ищете оптимальные параметры для использования Детектор плотности для обнаружения каких-либо конкретных точек, вы предложили бы программу, которую я сделал для этого. Он освобожден в github. Это программа, в которой вы можете протестировать некоторые извещатели (один из них - детектор плотности) и проверить, как это работает, если вы измените свои параметры благодаря пользовательскому интерфейсу, который позволяет изменять параметры детекторов, пока вы выполняете программу. Вы увидите, как будут обнаружены обнаруженные точки. Для этого просто нажмите на link и загрузите файлы. Для выполнения программы вам может потребоваться почти все файлы.

+0

Большое спасибо за ваше время в объяснении параметры. Однако я больше не занимаюсь проектом и в настоящее время работаю в другой области. Спасибо за ваше время :) – tarmizi

0

Извиняюсь заранее, я использую Python, поэтому я избегу раскрытия себя, ссылаясь на C++.

DenseFeatureDetector заполняет вектор с помощью KeyPoints для передачи дескрипторов функций. Эти ключевые точки имеют точечный вектор и их масштаб. В документации масштаб - это радиус пикселя ключевой точки.

KeyPoints равномерно распределены по ширине и высоте матрицы изображений, переданной в DenseFeatureVector.

Теперь аргументы:

initFeatureScale Установить начальный радиус особенность KeyPoint в пикселях (насколько я знаю, это не имеет никакого эффекта)

featureScaleLevels Количество шкал overwhich мы желающих сделать ключевые точки

featureScaleMuliplier Scale adj для настройки initFeatureScale над featureScaleLevels эта настройка масштаба также может применяться к границе (initImgBound) и размеру шага (initxystep). Поэтому, когда мы устанавливаем featureScaleLevels> 1, этот множитель будет применен к последовательным шкалам, чтобы настроить масштаб объекта, шаг и границу вокруг изображения.

initXyStep перемещаемый столбец и ряд шагов в пикселях. Надеюсь, я надеюсь.

initImgBound строки/COL, ограничивающей область, чтобы игнорировать вокруг изображения (пиксели), так что изображение 100x100, с initImgBound 10, будет создавать ключевые точки в центральной 80x80 части изображения.

varyXyStepWithScale Boolean, если у нас есть несколько featureScaleLevels мы хотим, чтобы настроить размер шага, используя featureScaleMultiplier.

varyImgBoundWithScale Boolean как varyXyStepWithScale, но применительно к границе.


Вот исходный код DenseFeatureDetector из detectors.cpp в источнике OpenCV 2.4.3, который, вероятно, лучше объяснить, чем мои слова:

DenseFeatureDetector::DenseFeatureDetector(float _initFeatureScale, int _featureScaleLevels, 
             float _featureScaleMul, int _initXyStep, 
             int _initImgBound, bool _varyXyStepWithScale, 
             bool _varyImgBoundWithScale) : 
    initFeatureScale(_initFeatureScale), featureScaleLevels(_featureScaleLevels), 
    featureScaleMul(_featureScaleMul), initXyStep(_initXyStep), initImgBound(_initImgBound), 
    varyXyStepWithScale(_varyXyStepWithScale), varyImgBoundWithScale(_varyImgBoundWithScale) 
{} 


void DenseFeatureDetector::detectImpl(const Mat& image, vector<KeyPoint>& keypoints, const Mat& mask) const 
{ 
    float curScale = static_cast<float>(initFeatureScale); 
    int curStep = initXyStep; 
    int curBound = initImgBound; 
    for(int curLevel = 0; curLevel < featureScaleLevels; curLevel++) 
    { 
     for(int x = curBound; x < image.cols - curBound; x += curStep) 
     { 
      for(int y = curBound; y < image.rows - curBound; y += curStep) 
      { 
       keypoints.push_back(KeyPoint(static_cast<float>(x), static_cast<float>(y), curScale)); 
      } 
     } 

     curScale = static_cast<float>(curScale * featureScaleMul); 
     if(varyXyStepWithScale) curStep = static_cast<int>(curStep * featureScaleMul + 0.5f); 
     if(varyImgBoundWithScale) curBound = static_cast<int>(curBound * featureScaleMul + 0.5f); 
    } 

    KeyPointsFilter::runByPixelsMask(keypoints, mask); 
} 

Вы могли бы ожидать вызова вычисление будет вычислять дополнительные характеристики KeyPoint с использованием соответствующего алгоритма обнаружения ключевых точек (например, угла) на основе KeyPoints, сгенерированных DenseFeatureDetector. К сожалению, это не относится к SIFT под Python - я не смотрел на другие детекторы функций и не смотрел на поведение на C++.

Также обратите внимание, что DenseFeatureDetector не находится в OpenCV 3.2 (неуверенный, при котором релиз был удален).

Смежные вопросы