Я хотел бы сделать программу, которая позволяет использовать 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);
Результат был лучше! (потому что я, вероятно, изменил параметры).
Так как я могу решить это?
Может быть, это лучшее решение, чтобы сделать то, что я делал раньше, но это так тяжело, потому что мне нужно сделать много «если», чтобы узнать, какой детектор я хочу использовать с каким детектором и т. Д.
Что вы думаете об этом ?
Поблагодарить
Для изменения параметров алгоритма используйте 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
блок, который вы не предоставите, будет использовать значение по умолчанию.