Changed Detector_descriptor group name to Feature2D group name

Added BRISK and FREAK features

git-svn-id: http://find-object.googlecode.com/svn/trunk/find_object@179 620bd6b2-0a58-f614-fd9a-1bd335dccda9
This commit is contained in:
matlabbe 2012-10-29 20:00:44 +00:00
parent c9e52fdbae
commit 72bdae12b0
5 changed files with 191 additions and 134 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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,

View File

@ -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()

View File

@ -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);