diff --git a/example/main.cpp b/example/main.cpp index 3ad567c6..599c50bd 100644 --- a/example/main.cpp +++ b/example/main.cpp @@ -69,6 +69,7 @@ int main(int argc, char * argv[]) cv::FeatureDetector * detector = new cv::SIFT(); // cv::FeatureDetector * detector = new cv::StarFeatureDetector(); // cv::FeatureDetector * detector = new cv::SURF(600.0); + // cv::FeatureDetector * detector = new cv::BRISK(); detector->detect(objectImg, objectKeypoints); printf("Object: %d keypoints detected in %d ms\n", (int)objectKeypoints.size(), time.restart()); detector->detect(sceneImg, sceneKeypoints); @@ -82,6 +83,8 @@ int main(int argc, char * argv[]) // cv::DescriptorExtractor * extractor = new cv::ORB(); cv::DescriptorExtractor * extractor = new cv::SIFT(); // cv::DescriptorExtractor * extractor = new cv::SURF(600.0); + // cv::DescriptorExtractor * extractor = new cv::BRISK(); + // cv::DescriptorExtractor * extractor = new cv::FREAK(); extractor->compute(objectImg, objectKeypoints, objectDescriptors); printf("Object: %d descriptors extracted in %d ms\n", objectDescriptors.rows, time.restart()); extractor->compute(sceneImg, sceneKeypoints, sceneDescriptors); @@ -98,8 +101,8 @@ int main(int argc, char * argv[]) // Binary descriptors detected (from ORB or Brief) // Create Flann LSH index - cv::flann::Index flannIndex(sceneDescriptors, cv::flann::LshIndexParams(12, 20, 2)); - printf("Time creating FLANN index = %d ms\n", time.restart()); + cv::flann::Index flannIndex(sceneDescriptors, cv::flann::LshIndexParams(12, 20, 2), cvflann::FLANN_DIST_HAMMING); + printf("Time creating FLANN LSH index = %d ms\n", time.restart()); results = cv::Mat(objectDescriptors.rows, k, CV_32SC1); // Results index dists = cv::Mat(objectDescriptors.rows, k, CV_32FC1); // Distance results are CV_32FC1 ?!?!? NOTE OpenCV doc is not clear about that... @@ -112,8 +115,8 @@ int main(int argc, char * argv[]) // assume it is CV_32F // Create Flann KDTree index - cv::flann::Index flannIndex(sceneDescriptors, cv::flann::KDTreeIndexParams()); - printf("Time creating FLANN index = %d ms\n", time.restart()); + cv::flann::Index flannIndex(sceneDescriptors, cv::flann::KDTreeIndexParams(), cvflann::FLANN_DIST_EUCLIDEAN); + printf("Time creating FLANN KDTree index = %d ms\n", time.restart()); results = cv::Mat(objectDescriptors.rows, k, CV_32SC1); // Results index dists = cv::Mat(objectDescriptors.rows, k, CV_32FC1); // Distance results are CV_32FC1 diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index fa44b0c4..7a120eaa 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -1163,8 +1163,8 @@ void MainWindow::notifyParametersChanged(const QStringList & paramChanged) if(!detectorDescriptorParamsChanged && ( iter->contains(currentDetectorType) || iter->contains(currentDescriptorType) || - iter->compare(Settings::kDetector_Descriptor_1Detector()) == 0 || - iter->compare(Settings::kDetector_Descriptor_2Descriptor()) == 0 )) + iter->compare(Settings::kFeature2D_1Detector()) == 0 || + iter->compare(Settings::kFeature2D_2Descriptor()) == 0 )) { detectorDescriptorParamsChanged = true; } diff --git a/src/ParametersToolBox.cpp b/src/ParametersToolBox.cpp index e0166aaf..2eda263c 100644 --- a/src/ParametersToolBox.cpp +++ b/src/ParametersToolBox.cpp @@ -364,12 +364,15 @@ void ParametersToolBox::changeParameter(const int & value) { bool nnStrategyChanged = false; //verify binary issue with nearest neighbor strategy - if(comboBox->objectName().compare(Settings::kDetector_Descriptor_2Descriptor()) == 0 || + if(comboBox->objectName().compare(Settings::kFeature2D_2Descriptor()) == 0 || comboBox->objectName().compare(Settings::kNearestNeighbor_1Strategy()) == 0) { - QComboBox * descriptorBox = (QComboBox*)this->getParameterWidget(Settings::kDetector_Descriptor_2Descriptor()); + QComboBox * descriptorBox = (QComboBox*)this->getParameterWidget(Settings::kFeature2D_2Descriptor()); QComboBox * nnBox = (QComboBox*)this->getParameterWidget(Settings::kNearestNeighbor_1Strategy()); - bool isBinaryDescriptor = descriptorBox->currentText().compare("ORB") == 0 || descriptorBox->currentText().compare("Brief") == 0; + bool isBinaryDescriptor = descriptorBox->currentText().compare("ORB") == 0 || + descriptorBox->currentText().compare("Brief") == 0 || + descriptorBox->currentText().compare("BRISK") == 0 || + descriptorBox->currentText().compare("FREAK") == 0; if(isBinaryDescriptor && nnBox->currentText().compare("Lsh") != 0) { QMessageBox::warning(this, diff --git a/src/Settings.cpp b/src/Settings.cpp index 67e0a66a..8405cd11 100644 --- a/src/Settings.cpp +++ b/src/Settings.cpp @@ -49,6 +49,17 @@ void Settings::loadSettings(const QString & fileName, QByteArray * windowGeometr QVariant value = ini.value(key, QVariant()); if(value.isValid()) { + QString str = value.toString(); + if(str.contains(";") && str.size() != getParameter(key).toString().size()) + { + // If a string list is modified, update the value + // (assuming that index < 10... one character for index) + QChar index = str.at(0); + str = getParameter(key).toString(); + str[0] = index.toAscii(); + value = QVariant(str); + printf("Updated list of parameter \"%s\"\n", key.toStdString().c_str()); + } setParameter(key, value); } } @@ -107,7 +118,7 @@ void Settings::saveSettings(const QString & fileName, const QByteArray & windowG cv::FeatureDetector * Settings::createFeaturesDetector() { cv::FeatureDetector * detector = 0; - QString str = getDetector_Descriptor_1Detector(); + QString str = getFeature2D_1Detector(); QStringList split = str.split(':'); if(split.size()==2) { @@ -116,7 +127,7 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(ok) { QStringList strategies = split.last().split(';'); - if(strategies.size() == 8 && index>=0 && index<8) + if(strategies.size() == 9 && index>=0 && index<9) { switch(index) { @@ -124,13 +135,13 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("Dense") == 0) { detector = new cv::DenseFeatureDetector( - getDetector_Descriptor_Dense_initFeatureScale(), - getDetector_Descriptor_Dense_featureScaleLevels(), - getDetector_Descriptor_Dense_featureScaleMul(), - getDetector_Descriptor_Dense_initXyStep(), - getDetector_Descriptor_Dense_initImgBound(), - getDetector_Descriptor_Dense_varyXyStepWithScale(), - getDetector_Descriptor_Dense_varyImgBoundWithScale()); + getFeature2D_Dense_initFeatureScale(), + getFeature2D_Dense_featureScaleLevels(), + getFeature2D_Dense_featureScaleMul(), + getFeature2D_Dense_initXyStep(), + getFeature2D_Dense_initImgBound(), + getFeature2D_Dense_varyXyStepWithScale(), + getFeature2D_Dense_varyImgBoundWithScale()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "Dense"); } break; @@ -138,8 +149,8 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("Fast") == 0) { detector = new cv::FastFeatureDetector( - getDetector_Descriptor_Fast_threshold(), - getDetector_Descriptor_Fast_nonmaxSuppression()); + getFeature2D_Fast_threshold(), + getFeature2D_Fast_nonmaxSuppression()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "Fast"); } break; @@ -147,12 +158,12 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("GFTT") == 0) { detector = new cv::GFTTDetector( - getDetector_Descriptor_GFTT_maxCorners(), - getDetector_Descriptor_GFTT_qualityLevel(), - getDetector_Descriptor_GFTT_minDistance(), - getDetector_Descriptor_GFTT_blockSize(), - getDetector_Descriptor_GFTT_useHarrisDetector(), - getDetector_Descriptor_GFTT_k()); + getFeature2D_GFTT_maxCorners(), + getFeature2D_GFTT_qualityLevel(), + getFeature2D_GFTT_minDistance(), + getFeature2D_GFTT_blockSize(), + getFeature2D_GFTT_useHarrisDetector(), + getFeature2D_GFTT_k()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "GFTT"); } break; @@ -160,15 +171,15 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("MSER") == 0) { detector = new cv::MSER( - getDetector_Descriptor_MSER_delta(), - getDetector_Descriptor_MSER_minArea(), - getDetector_Descriptor_MSER_maxArea(), - getDetector_Descriptor_MSER_maxVariation(), - getDetector_Descriptor_MSER_minDiversity(), - getDetector_Descriptor_MSER_maxEvolution(), - getDetector_Descriptor_MSER_areaThreshold(), - getDetector_Descriptor_MSER_minMargin(), - getDetector_Descriptor_MSER_edgeBlurSize()); + getFeature2D_MSER_delta(), + getFeature2D_MSER_minArea(), + getFeature2D_MSER_maxArea(), + getFeature2D_MSER_maxVariation(), + getFeature2D_MSER_minDiversity(), + getFeature2D_MSER_maxEvolution(), + getFeature2D_MSER_areaThreshold(), + getFeature2D_MSER_minMargin(), + getFeature2D_MSER_edgeBlurSize()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "MSER"); } break; @@ -176,14 +187,14 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("ORB") == 0) { detector = new cv::ORB( - getDetector_Descriptor_ORB_nFeatures(), - getDetector_Descriptor_ORB_scaleFactor(), - getDetector_Descriptor_ORB_nLevels(), - getDetector_Descriptor_ORB_edgeThreshold(), - getDetector_Descriptor_ORB_firstLevel(), - getDetector_Descriptor_ORB_WTA_K(), - getDetector_Descriptor_ORB_scoreType(), - getDetector_Descriptor_ORB_patchSize()); + getFeature2D_ORB_nFeatures(), + getFeature2D_ORB_scaleFactor(), + getFeature2D_ORB_nLevels(), + getFeature2D_ORB_edgeThreshold(), + getFeature2D_ORB_firstLevel(), + getFeature2D_ORB_WTA_K(), + getFeature2D_ORB_scoreType(), + getFeature2D_ORB_patchSize()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "ORB"); } break; @@ -191,11 +202,11 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("SIFT") == 0) { detector = new cv::SIFT( - getDetector_Descriptor_SIFT_nfeatures(), - getDetector_Descriptor_SIFT_nOctaveLayers(), - getDetector_Descriptor_SIFT_contrastThreshold(), - getDetector_Descriptor_SIFT_edgeThreshold(), - getDetector_Descriptor_SIFT_sigma()); + getFeature2D_SIFT_nfeatures(), + getFeature2D_SIFT_nOctaveLayers(), + getFeature2D_SIFT_contrastThreshold(), + getFeature2D_SIFT_edgeThreshold(), + getFeature2D_SIFT_sigma()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "SIFT"); } break; @@ -203,11 +214,11 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("Star") == 0) { detector = new cv::StarFeatureDetector( - getDetector_Descriptor_Star_maxSize(), - getDetector_Descriptor_Star_responseThreshold(), - getDetector_Descriptor_Star_lineThresholdProjected(), - getDetector_Descriptor_Star_lineThresholdBinarized(), - getDetector_Descriptor_Star_suppressNonmaxSize()); + getFeature2D_Star_maxSize(), + getFeature2D_Star_responseThreshold(), + getFeature2D_Star_lineThresholdProjected(), + getFeature2D_Star_lineThresholdBinarized(), + getFeature2D_Star_suppressNonmaxSize()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "Star"); } break; @@ -215,14 +226,24 @@ cv::FeatureDetector * Settings::createFeaturesDetector() if(strategies.at(index).compare("SURF") == 0) { detector = new cv::SURF( - getDetector_Descriptor_SURF_hessianThreshold(), - getDetector_Descriptor_SURF_nOctaves(), - getDetector_Descriptor_SURF_nOctaveLayers(), - getDetector_Descriptor_SURF_extended(), - getDetector_Descriptor_SURF_upright()); + getFeature2D_SURF_hessianThreshold(), + getFeature2D_SURF_nOctaves(), + getFeature2D_SURF_nOctaveLayers(), + getFeature2D_SURF_extended(), + getFeature2D_SURF_upright()); if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "SURF"); } break; + case 8: + if(strategies.at(index).compare("BRISK") == 0) + { + detector = new cv::BRISK( + getFeature2D_BRISK_thresh(), + getFeature2D_BRISK_octaves(), + getFeature2D_BRISK_patternScale()); + if(VERBOSE)printf("Settings::createFeaturesDetector() type=%s\n", "BRISK"); + } + break; default: break; } @@ -240,7 +261,7 @@ cv::FeatureDetector * Settings::createFeaturesDetector() cv::DescriptorExtractor * Settings::createDescriptorsExtractor() { cv::DescriptorExtractor * extractor = 0; - QString str = getDetector_Descriptor_2Descriptor(); + QString str = getFeature2D_2Descriptor(); QStringList split = str.split(':'); if(split.size()==2) { @@ -249,7 +270,7 @@ cv::DescriptorExtractor * Settings::createDescriptorsExtractor() if(ok) { QStringList strategies = split.last().split(';'); - if(strategies.size() == 4 && index>=0 && index<4) + if(strategies.size() == 6 && index>=0 && index<6) { switch(index) { @@ -257,7 +278,7 @@ cv::DescriptorExtractor * Settings::createDescriptorsExtractor() if(strategies.at(index).compare("Brief") == 0) { extractor = new cv::BriefDescriptorExtractor( - getDetector_Descriptor_Brief_bytes()); + getFeature2D_Brief_bytes()); if(VERBOSE)printf("Settings::createDescriptorsExtractor() type=%s\n", "Brief"); } break; @@ -265,14 +286,14 @@ cv::DescriptorExtractor * Settings::createDescriptorsExtractor() if(strategies.at(index).compare("ORB") == 0) { extractor = new cv::ORB( - getDetector_Descriptor_ORB_nFeatures(), - getDetector_Descriptor_ORB_scaleFactor(), - getDetector_Descriptor_ORB_nLevels(), - getDetector_Descriptor_ORB_edgeThreshold(), - getDetector_Descriptor_ORB_firstLevel(), - getDetector_Descriptor_ORB_WTA_K(), - getDetector_Descriptor_ORB_scoreType(), - getDetector_Descriptor_ORB_patchSize()); + getFeature2D_ORB_nFeatures(), + getFeature2D_ORB_scaleFactor(), + getFeature2D_ORB_nLevels(), + getFeature2D_ORB_edgeThreshold(), + getFeature2D_ORB_firstLevel(), + getFeature2D_ORB_WTA_K(), + getFeature2D_ORB_scoreType(), + getFeature2D_ORB_patchSize()); if(VERBOSE)printf("Settings::createDescriptorsExtractor() type=%s\n", "ORB"); } break; @@ -280,11 +301,11 @@ cv::DescriptorExtractor * Settings::createDescriptorsExtractor() if(strategies.at(index).compare("SIFT") == 0) { extractor = new cv::SIFT( - getDetector_Descriptor_SIFT_nfeatures(), - getDetector_Descriptor_SIFT_nOctaveLayers(), - getDetector_Descriptor_SIFT_contrastThreshold(), - getDetector_Descriptor_SIFT_edgeThreshold(), - getDetector_Descriptor_SIFT_sigma()); + getFeature2D_SIFT_nfeatures(), + getFeature2D_SIFT_nOctaveLayers(), + getFeature2D_SIFT_contrastThreshold(), + getFeature2D_SIFT_edgeThreshold(), + getFeature2D_SIFT_sigma()); if(VERBOSE)printf("Settings::createDescriptorsExtractor() type=%s\n", "SIFT"); } break; @@ -292,14 +313,35 @@ cv::DescriptorExtractor * Settings::createDescriptorsExtractor() if(strategies.at(index).compare("SURF") == 0) { extractor = new cv::SURF( - getDetector_Descriptor_SURF_hessianThreshold(), - getDetector_Descriptor_SURF_nOctaves(), - getDetector_Descriptor_SURF_nOctaveLayers(), - getDetector_Descriptor_SURF_extended(), - getDetector_Descriptor_SURF_upright()); + getFeature2D_SURF_hessianThreshold(), + getFeature2D_SURF_nOctaves(), + getFeature2D_SURF_nOctaveLayers(), + getFeature2D_SURF_extended(), + getFeature2D_SURF_upright()); if(VERBOSE)printf("Settings::createDescriptorsExtractor() type=%s\n", "SURF"); } break; + case 4: + if(strategies.at(index).compare("BRISK") == 0) + { + extractor = new cv::BRISK( + getFeature2D_BRISK_thresh(), + getFeature2D_BRISK_octaves(), + getFeature2D_BRISK_patternScale()); + if(VERBOSE)printf("Settings::createDescriptorsExtractor() type=%s\n", "BRISK"); + } + break; + case 5: + if(strategies.at(index).compare("FREAK") == 0) + { + extractor = new cv::FREAK( + getFeature2D_FREAK_orientationNormalized(), + getFeature2D_FREAK_scaleNormalized(), + getFeature2D_FREAK_patternScale(), + getFeature2D_FREAK_nOctaves()); + if(VERBOSE)printf("Settings::createDescriptorsExtractor() type=%s\n", "FREAK"); + } + break; default: break; } @@ -316,14 +358,14 @@ cv::DescriptorExtractor * Settings::createDescriptorsExtractor() QString Settings::currentDetectorType() { - int index = getDetector_Descriptor_1Detector().split(':').first().toInt(); - return getDetector_Descriptor_1Detector().split(':').last().split(';').at(index); + int index = getFeature2D_1Detector().split(':').first().toInt(); + return getFeature2D_1Detector().split(':').last().split(';').at(index); } QString Settings::currentDescriptorType() { - int index = getDetector_Descriptor_2Descriptor().split(':').first().toInt(); - return getDetector_Descriptor_2Descriptor().split(':').last().split(';').at(index); + int index = getFeature2D_2Descriptor().split(':').first().toInt(); + return getFeature2D_2Descriptor().split(':').last().split(';').at(index); } QString Settings::currentNearestNeighborType() diff --git a/src/Settings.h b/src/Settings.h index e1a4150d..53a624f1 100644 --- a/src/Settings.h +++ b/src/Settings.h @@ -59,68 +59,77 @@ class Settings PARAMETER(Camera, 5mediaPath, QString, ""); //List format : [Index:item0;item1;item3;...] - PARAMETER(Detector_Descriptor, 1Detector, QString, "7:Dense;Fast;GFTT;MSER;ORB;SIFT;Star;SURF"); - PARAMETER(Detector_Descriptor, 2Descriptor, QString, "3:Brief;ORB;SIFT;SURF"); + PARAMETER(Feature2D, 1Detector, QString, "7:Dense;Fast;GFTT;MSER;ORB;SIFT;Star;SURF;BRISK"); + PARAMETER(Feature2D, 2Descriptor, QString, "3:Brief;ORB;SIFT;SURF;BRISK;FREAK"); - PARAMETER(Detector_Descriptor, Brief_bytes, int, 32); + PARAMETER(Feature2D, Brief_bytes, int, 32); - PARAMETER(Detector_Descriptor, Dense_initFeatureScale, float, 1.f); - PARAMETER(Detector_Descriptor, Dense_featureScaleLevels, int, 1); - PARAMETER(Detector_Descriptor, Dense_featureScaleMul, float, 0.1f); - PARAMETER(Detector_Descriptor, Dense_initXyStep, int, 6); - PARAMETER(Detector_Descriptor, Dense_initImgBound, int, 0); - PARAMETER(Detector_Descriptor, Dense_varyXyStepWithScale, bool, true); - PARAMETER(Detector_Descriptor, Dense_varyImgBoundWithScale, bool, false); + PARAMETER(Feature2D, Dense_initFeatureScale, float, 1.f); + PARAMETER(Feature2D, Dense_featureScaleLevels, int, 1); + PARAMETER(Feature2D, Dense_featureScaleMul, float, 0.1f); + PARAMETER(Feature2D, Dense_initXyStep, int, 6); + PARAMETER(Feature2D, Dense_initImgBound, int, 0); + PARAMETER(Feature2D, Dense_varyXyStepWithScale, bool, true); + PARAMETER(Feature2D, Dense_varyImgBoundWithScale, bool, false); - PARAMETER(Detector_Descriptor, Fast_threshold, int, 10); - PARAMETER(Detector_Descriptor, Fast_nonmaxSuppression, bool, true); + PARAMETER(Feature2D, Fast_threshold, int, 10); + PARAMETER(Feature2D, Fast_nonmaxSuppression, bool, true); - PARAMETER(Detector_Descriptor, GFTT_maxCorners, int, 1000); - PARAMETER(Detector_Descriptor, GFTT_qualityLevel, double, 0.01); - PARAMETER(Detector_Descriptor, GFTT_minDistance, double, 1); - PARAMETER(Detector_Descriptor, GFTT_blockSize, int, 3); - PARAMETER(Detector_Descriptor, GFTT_useHarrisDetector, bool, false); - PARAMETER(Detector_Descriptor, GFTT_k, double, 0.04); + PARAMETER(Feature2D, GFTT_maxCorners, int, 1000); + PARAMETER(Feature2D, GFTT_qualityLevel, double, 0.01); + PARAMETER(Feature2D, GFTT_minDistance, double, 1); + PARAMETER(Feature2D, GFTT_blockSize, int, 3); + PARAMETER(Feature2D, GFTT_useHarrisDetector, bool, false); + PARAMETER(Feature2D, GFTT_k, double, 0.04); - PARAMETER(Detector_Descriptor, ORB_nFeatures, int, 500); - PARAMETER(Detector_Descriptor, ORB_scaleFactor, float, 1.2f); - PARAMETER(Detector_Descriptor, ORB_nLevels, int, 8); - PARAMETER(Detector_Descriptor, ORB_edgeThreshold, int, 31); - PARAMETER(Detector_Descriptor, ORB_firstLevel, int, 0); - PARAMETER(Detector_Descriptor, ORB_WTA_K, int, 2); - PARAMETER(Detector_Descriptor, ORB_scoreType, int, 0); - PARAMETER(Detector_Descriptor, ORB_patchSize, int, 31); + PARAMETER(Feature2D, ORB_nFeatures, int, 500); + PARAMETER(Feature2D, ORB_scaleFactor, float, 1.2f); + PARAMETER(Feature2D, ORB_nLevels, int, 8); + PARAMETER(Feature2D, ORB_edgeThreshold, int, 31); + PARAMETER(Feature2D, ORB_firstLevel, int, 0); + PARAMETER(Feature2D, ORB_WTA_K, int, 2); + PARAMETER(Feature2D, ORB_scoreType, int, 0); + PARAMETER(Feature2D, ORB_patchSize, int, 31); - PARAMETER(Detector_Descriptor, MSER_delta, int, 5); - PARAMETER(Detector_Descriptor, MSER_minArea, int, 60); - PARAMETER(Detector_Descriptor, MSER_maxArea, int, 14400); - PARAMETER(Detector_Descriptor, MSER_maxVariation, double, 0.25); - PARAMETER(Detector_Descriptor, MSER_minDiversity, double, 0.2); - PARAMETER(Detector_Descriptor, MSER_maxEvolution, int, 200); - PARAMETER(Detector_Descriptor, MSER_areaThreshold, double, 1.01); - PARAMETER(Detector_Descriptor, MSER_minMargin, double, 0.003); - PARAMETER(Detector_Descriptor, MSER_edgeBlurSize, int, 5); + PARAMETER(Feature2D, MSER_delta, int, 5); + PARAMETER(Feature2D, MSER_minArea, int, 60); + PARAMETER(Feature2D, MSER_maxArea, int, 14400); + PARAMETER(Feature2D, MSER_maxVariation, double, 0.25); + PARAMETER(Feature2D, MSER_minDiversity, double, 0.2); + PARAMETER(Feature2D, MSER_maxEvolution, int, 200); + PARAMETER(Feature2D, MSER_areaThreshold, double, 1.01); + PARAMETER(Feature2D, MSER_minMargin, double, 0.003); + PARAMETER(Feature2D, MSER_edgeBlurSize, int, 5); - PARAMETER(Detector_Descriptor, SIFT_nfeatures, int, 0); - PARAMETER(Detector_Descriptor, SIFT_nOctaveLayers, int, 3); - PARAMETER(Detector_Descriptor, SIFT_contrastThreshold, double, 0.04); - PARAMETER(Detector_Descriptor, SIFT_edgeThreshold, double, 10); - PARAMETER(Detector_Descriptor, SIFT_sigma, double, 1.6); + PARAMETER(Feature2D, SIFT_nfeatures, int, 0); + PARAMETER(Feature2D, SIFT_nOctaveLayers, int, 3); + PARAMETER(Feature2D, SIFT_contrastThreshold, double, 0.04); + PARAMETER(Feature2D, SIFT_edgeThreshold, double, 10); + PARAMETER(Feature2D, SIFT_sigma, double, 1.6); - PARAMETER(Detector_Descriptor, Star_maxSize, int, 45); - PARAMETER(Detector_Descriptor, Star_responseThreshold, int, 30); - PARAMETER(Detector_Descriptor, Star_lineThresholdProjected, int, 10); - PARAMETER(Detector_Descriptor, Star_lineThresholdBinarized, int, 8); - PARAMETER(Detector_Descriptor, Star_suppressNonmaxSize, int, 5); + PARAMETER(Feature2D, Star_maxSize, int, 45); + PARAMETER(Feature2D, Star_responseThreshold, int, 30); + PARAMETER(Feature2D, Star_lineThresholdProjected, int, 10); + PARAMETER(Feature2D, Star_lineThresholdBinarized, int, 8); + PARAMETER(Feature2D, Star_suppressNonmaxSize, int, 5); - PARAMETER(Detector_Descriptor, SURF_hessianThreshold, double, 600.0); - PARAMETER(Detector_Descriptor, SURF_nOctaves, int, 4); - PARAMETER(Detector_Descriptor, SURF_nOctaveLayers, int, 2); - PARAMETER(Detector_Descriptor, SURF_extended, bool, true); - PARAMETER(Detector_Descriptor, SURF_upright, bool, false); + PARAMETER(Feature2D, SURF_hessianThreshold, double, 600.0); + PARAMETER(Feature2D, SURF_nOctaves, int, 4); + PARAMETER(Feature2D, SURF_nOctaveLayers, int, 2); + PARAMETER(Feature2D, SURF_extended, bool, true); + PARAMETER(Feature2D, SURF_upright, bool, false); + + PARAMETER(Feature2D, BRISK_thresh, int, 30); + PARAMETER(Feature2D, BRISK_octaves, int, 3); + PARAMETER(Feature2D, BRISK_patternScale, float, 1.0f); + + PARAMETER(Feature2D, FREAK_orientationNormalized, bool, true); + PARAMETER(Feature2D, FREAK_scaleNormalized, bool, true); + PARAMETER(Feature2D, FREAK_patternScale, float, 22.0f); + PARAMETER(Feature2D, FREAK_nOctaves, int, 4); PARAMETER(NearestNeighbor, 1Strategy, QString, "1:Linear;KDTree;KMeans;Composite;Autotuned;Lsh"); - PARAMETER(NearestNeighbor, 2Distance_type, QString, "0:EUCLIDEAN_L2;MANHATTAN_L1;MINKOWSKI;MAX;HIST_INTERSECT;HELLINGER;CHI_SQUARE_CS;KULLBACK_LEIBLER_KL"); + PARAMETER(NearestNeighbor, 2Distance_type, QString, "0:EUCLIDEAN_L2;MANHATTAN_L1;MINKOWSKI;MAX;HIST_INTERSECT;HELLINGER;CHI_SQUARE_CS;KULLBACK_LEIBLER_KL;HAMMING"); PARAMETER(NearestNeighbor, 3nndrRatioUsed, bool, true); PARAMETER(NearestNeighbor, 4nndrRatio, float, 0.8f); PARAMETER(NearestNeighbor, 5minDistanceUsed, bool, false);