OpenCV — Соберите featureDetectors и descriptorDetector в одной программе

Я хотел бы сделать программу, которая позволяет использовать SIFT, SURF, ORB (все функции детектора), дескрипторы различий и сопоставления различий.

Я хотел бы запустить что-то вроде этого: функции («SIFT», «SIFT», «BruteForce») соответственно функции («Детектор», «дескриптор», «совпадение»).

Действительно, я делал программу раньше, но есть много «если». Например, «if (обнаружения =» SIFT «)» «if (matcher ==» BruteForce «)» и т. Д. И поэтому моя программа не является гибкой, если я хочу использовать определенный детектор с дескриптором другого типа.

Итак, я нашел что-то подобное:

 featureDetector = FeatureDetector::create( detectorType );
descriptorExtractor = DescriptorExtractor::create( descriptorType );
descriptorMatcher = DescriptorMatcher::create( matcherType );

Это прекрасно, потому что я могу использовать строку только в одной функции, чтобы определить, какой детектор, дескрипторы и сопоставитель я бы хотел использовать.

Однако, я не могу изменить параметры (я нашел что-то вроде featureDetector.set (), но без документации), и поэтому результат довольно плохой … Требуется время для вычисления только одного изображения, а ключевые точки не являются точными.

Даже SIFT займет меньше времени, чем SURF!

Принимая во внимание, что в моей первой программе, когда я использовал

detector=new SiftFeatureDetector(nfeatureSift,nOctaveLayerSift,contrastThresholdSift,edgeThresholdSift,sigmaSift);

Результат был лучше! (потому что я, вероятно, изменил параметры).

Так как я могу решить это?
Может быть, это лучшее решение, чтобы сделать то, что я делал раньше, но это так тяжело, потому что мне нужно сделать много «если», чтобы узнать, какой детектор я хочу использовать с каким детектором и т. Д.

Что вы думаете об этом ?

Поблагодарить

0

Решение

Для изменения параметров алгоритма используйте set() метод, который вы уже нашли. Параметры, доступные для каждого детектора функций, не документированы, но они перечислены в источнике OpenCV, который вы можете найти Вот, или же несвободный модуль для SURF и SIFT.

Существует грубое соответствие между перечисленными параметрами и параметрами, перечисленными для конструктора детектора признаков.

пример

Учитывая запись для SIFT:

CV_INIT_ALGORITHM(SIFT, "Feature2D.SIFT",
obj.info()->addParam(obj, "nFeatures", obj.nfeatures);
obj.info()->addParam(obj, "nOctaveLayers", obj.nOctaveLayers);
obj.info()->addParam(obj, "contrastThreshold", obj.contrastThreshold);
obj.info()->addParam(obj, "edgeThreshold", obj.edgeThreshold);
obj.info()->addParam(obj, "sigma", obj.sigma))

Имена в кавычках (например, "nFeatures") аргументы, которые вы бы предоставили name параметр set(),

Таким образом, чтобы ограничить количество обнаруженных функций до 500, вы должны написать:

featureDetector = FeatureDetector::create( detectorType );
featureDetector->set("nFeatures", 500);

который создаст детектор с такими же параметрами как запись:

SIFT detector(500);

Замечания: При использовании set() чтобы установить параметры алгоритма, любые поля, которые перечислены в CV_INIT_ALGORITHM блок, который вы не предоставите, будет использовать значение по умолчанию.

2

Другие решения


По вопросам рекламы [email protected]