Я использую openCV, чтобы сделать некоторые плотные функции извлечения. Например, код
DenseFeatureDetector detector(12.f, 1, 0.1f, 10);
Я не очень понимаю параметры в приведенном выше конструкторе. Что это значит ? Чтение opencv документация об этом тоже мало что поможет. В документации приводятся следующие аргументы:
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 и т. д.? Как вы знаете сетку или интервал сетки и т. Д. Для плотной выборки.
Я тоже использую opencv с плотным детектором и думаю, что могу вам чем-то помочь. Я не уверен в том, что я собираюсь сказать, но опыт научил меня этому.
Когда я использую плотный детектор, я передаю изображение в оттенках серого. Детектор создает некоторые пороговые фильтры, в которых opencv использует серое минимальное значение, которое используется для преобразования изображения. Пиксели, у которых уровень серого больше, чем порог, будут выполнены как черные точки, а остальные — как белые. Это действие повторяется в цикле, где порог будет все больше и больше. Таким образом, параметр initFeatureScale определяет первый порог, который вы задали для этого цикла, параметр featureScaleLevels указывает, насколько этот порог больше между одной итерацией цикла и следующей, а featureScaleMul является множителем для вычисления следующего порога.
В любом случае, если вы ищете оптимальные параметры для использования детектора плотности для обнаружения каких-либо конкретных точек, вы предложите программу, которую я сделал для этого. Это освобождено в github. Это программа, в которой вы можете протестировать некоторые детекторы (одним из них является детектор Dense) и проверить, как он работает, если вы изменяете их параметры, благодаря пользовательскому интерфейсу, который позволяет вам изменять параметры детекторов в течение всего времени выполнения программы. Вы увидите, как будут изменяться обнаруженные точки. Чтобы попробовать это просто нажмите на ссылка на сайт, и скачать файлы. Вам может понадобиться почти все файлы для запуска программы.
Заранее извиняюсь, я преимущественно использую Python, поэтому я буду избегать смущения, ссылаясь на C ++.
DenseFeatureDetector заполняет вектор KeyPoints для передачи в вычисление дескрипторов объектов. Эти ключевые точки имеют вектор точек и их масштаб. В документации масштаб — это радиус пикселя ключевой точки.
Ключевые точки равномерно распределены по ширине и высоте матрицы изображения, передаваемой в DenseFeatureVector.
Теперь к аргументам:
initFeatureScale
Установите начальный радиус объекта KeyPoint в пикселях (насколько я знаю, это не имеет никакого эффекта)
featureScaleLevels
Количество шкал, по которым мы хотим сделать ключевые точки
featureScaleMuliplier
Регулировка масштаба для initFeatureScale поверх featureScaleLevels, эта настройка масштаба также может применяться к границе (initImgBound) и размеру шага (initxystep). Поэтому, когда мы устанавливаем featureScaleLevels> 1, этот множитель будет применен к последовательным масштабам, чтобы отрегулировать масштаб объекта, шаг и границу вокруг изображения.
initXyStep
перемещение столбца и шага строки в пикселях. Надеюсь, это понятно.
initImgBound
Ограничивающая область строки / столбца, которую нужно игнорировать вокруг изображения (в пикселях). Таким образом, изображение 100×100 с initImgBound 10 будет создавать ключевые точки в центральной части изображения 80×80.
varyXyStepWithScale
Булево, если у нас есть несколько featureScaleLevels, мы хотим отрегулировать размер шага с помощью featureScaleMultiplier.
varyImgBoundWithScale
Логическое значение, как varXyStepWithScale, но применяется к границе.
Вот исходный код 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 (не уверен, при каком выпуске он был удален).