Извиняюсь заранее, я использую 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 (неуверенный, при котором релиз был удален).
Посмотрите на мой ответ на тот же вопрос здесь: http://stackoverflow.com/questions/29970191/opencv-python-dense-sift-settings/32246964#32246964 –