Added Version.h.in. When NONFREE module is not detected, disable SIFT/SURF instead of hiding them.

git-svn-id: http://find-object.googlecode.com/svn/trunk/find_object@413 620bd6b2-0a58-f614-fd9a-1bd335dccda9
This commit is contained in:
matlabbe 2014-11-28 21:47:02 +00:00
parent 4d3b9e88b2
commit 807c8b5b43
7 changed files with 184 additions and 32 deletions

View File

@ -85,8 +85,11 @@ FIND_PACKAGE(Qt4 COMPONENTS QtCore QtGui QtNetwork REQUIRED) # tested on Qt4.8
ADD_DEFINITIONS(-DQT_NO_KEYWORDS) # To avoid conflicts with boost signals used in ROS ADD_DEFINITIONS(-DQT_NO_KEYWORDS) # To avoid conflicts with boost signals used in ROS
IF(OPENCV_NONFREE_FOUND) IF(OPENCV_NONFREE_FOUND)
ADD_DEFINITIONS(-DWITH_NONFREE) SET(NONFREE 1)
ENDIF(OPENCV_NONFREE_FOUND) ELSE()
SET(NONFREE 0)
ENDIF()
CONFIGURE_FILE(Version.h.in ${PROJECT_SOURCE_DIR}/include/${PROJECT_PREFIX}/Version.h)
####### OSX BUNDLE CMAKE_INSTALL_PREFIX ####### ####### OSX BUNDLE CMAKE_INSTALL_PREFIX #######
IF(APPLE) IF(APPLE)

43
Version.h.in Normal file
View File

@ -0,0 +1,43 @@
/*
Copyright (c) 2010-2014, Mathieu Labbe - IntRoLab - Universite de Sherbrooke
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the Universite de Sherbrooke nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef VERSION_H_
#define VERSION_H_
// This is auto-generated!
#define FINDOBJECT_VERSION "@PROJECT_VERSION@"
#define FINDOBJECT_VERSION_MAJOR @PROJECT_VERSION_MAJOR@
#define FINDOBJECT_VERSION_MINOR @PROJECT_VERSION_MINOR@
#define FINDOBJECT_VERSION_PATCH @PROJECT_VERSION_PATCH@
#define FINDOBJECT_VERSION_COMPARE(major, minor, patch) (major>=@PROJECT_VERSION_MAJOR@ || (major==@PROJECT_VERSION_MAJOR@ && minor>=@PROJECT_VERSION_MINOR@) || (major==@PROJECT_VERSION_MAJOR@ && minor==@PROJECT_VERSION_MINOR@ && patch >=@PROJECT_VERSION_PATCH@))
#define FINDOBJECT_NONFREE @NONFREE@
#endif /* VERSION_H_ */

View File

@ -29,6 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define SETTINGS_H_ #define SETTINGS_H_
#include "find_object/FindObjectExp.h" // DLL export/import defines #include "find_object/FindObjectExp.h" // DLL export/import defines
#include "find_object/Version.h" // DLL export/import defines
#include <QtCore/QMap> #include <QtCore/QMap>
#include <QtCore/QVariant> #include <QtCore/QVariant>
@ -80,6 +81,25 @@ typedef unsigned int uint;
descriptions_.insert(#PREFIX "/" #NAME, DESCRIPTION);} \ descriptions_.insert(#PREFIX "/" #NAME, DESCRIPTION);} \
}; \ }; \
Dummy##PREFIX##_##NAME dummy##PREFIX##_##NAME; Dummy##PREFIX##_##NAME dummy##PREFIX##_##NAME;
#define PARAMETER_COND(PREFIX, NAME, TYPE, COND, DEFAULT_VALUE1, DEFAULT_VALUE2, DESCRIPTION) \
public: \
static QString k##PREFIX##_##NAME() {return QString(#PREFIX "/" #NAME);} \
static TYPE default##PREFIX##_##NAME() {return COND?DEFAULT_VALUE1:DEFAULT_VALUE2;} \
static QString type##PREFIX##_##NAME() {return QString(#TYPE);} \
static QString description##PREFIX##_##NAME() {return QString(DESCRIPTION);} \
PARAMETER_GETTER_##TYPE(PREFIX, NAME) \
static void set##PREFIX##_##NAME(const TYPE & value) {parameters_[#PREFIX "/" #NAME] = value;} \
private: \
class Dummy##PREFIX##_##NAME { \
public: \
Dummy##PREFIX##_##NAME() { \
defaultParameters_.insert(#PREFIX "/" #NAME, QVariant(COND?DEFAULT_VALUE1:DEFAULT_VALUE2)); \
parameters_.insert(#PREFIX "/" #NAME, COND?DEFAULT_VALUE1:DEFAULT_VALUE2); \
parametersType_.insert(#PREFIX "/" #NAME, #TYPE); \
descriptions_.insert(#PREFIX "/" #NAME, DESCRIPTION);} \
}; \
Dummy##PREFIX##_##NAME dummy##PREFIX##_##NAME;
// MACRO END // MACRO END
class FINDOBJECT_EXP Settings class FINDOBJECT_EXP Settings
@ -94,13 +114,9 @@ class FINDOBJECT_EXP Settings
PARAMETER(Camera, 9queueSize, int, 1, "Maximum images buffered from TCP. If 0, all images are buffered."); PARAMETER(Camera, 9queueSize, int, 1, "Maximum images buffered from TCP. If 0, all images are buffered.");
//List format : [Index:item0;item1;item3;...] //List format : [Index:item0;item1;item3;...]
#ifdef WITH_NONFREE
PARAMETER(Feature2D, 1Detector, QString, "7:Dense;Fast;GFTT;MSER;ORB;SIFT;Star;SURF;BRISK" , "Keypoint detector."); PARAMETER_COND(Feature2D, 1Detector, QString, FINDOBJECT_NONFREE, "7:Dense;Fast;GFTT;MSER;ORB;SIFT;Star;SURF;BRISK" , "1:Dense;Fast;GFTT;MSER;ORB;SIFT;Star;SURF;BRISK", "Keypoint detector.");
PARAMETER(Feature2D, 2Descriptor, QString, "3:Brief;ORB;SIFT;SURF;BRISK;FREAK", "Keypoint descriptor."); PARAMETER_COND(Feature2D, 2Descriptor, QString, FINDOBJECT_NONFREE, "3:Brief;ORB;SIFT;SURF;BRISK;FREAK", "0:Brief;ORB;SIFT;SURF;BRISK;FREAK", "Keypoint descriptor.");
#else
PARAMETER(Feature2D, 1Detector, QString, "1:Dense;Fast;GFTT;MSER;ORB;Star;BRISK" , "Keypoint detector.");
PARAMETER(Feature2D, 2Descriptor, QString, "0:Brief;ORB;BRISK;FREAK", "Keypoint descriptor.");
#endif
PARAMETER(Feature2D, 3MaxFeatures, int, 0, "Maximum features per image. If the number of features extracted is over this threshold, only X features with the highest response are kept. 0 means all features are kept."); PARAMETER(Feature2D, 3MaxFeatures, int, 0, "Maximum features per image. If the number of features extracted is over this threshold, only X features with the highest response are kept. 0 means all features are kept.");
PARAMETER(Feature2D, 4Affine, bool, false, "(ASIFT) Extract features on multiple affine transformations of the image."); PARAMETER(Feature2D, 4Affine, bool, false, "(ASIFT) Extract features on multiple affine transformations of the image.");
PARAMETER(Feature2D, 5AffineCount, int, 6, "(ASIFT) Higher the value, more affine transformations will be done."); PARAMETER(Feature2D, 5AffineCount, int, 6, "(ASIFT) Higher the value, more affine transformations will be done.");
@ -147,7 +163,7 @@ class FINDOBJECT_EXP Settings
PARAMETER(Feature2D, MSER_minMargin, double, 0.003, ""); PARAMETER(Feature2D, MSER_minMargin, double, 0.003, "");
PARAMETER(Feature2D, MSER_edgeBlurSize, int, 5, ""); PARAMETER(Feature2D, MSER_edgeBlurSize, int, 5, "");
#ifdef WITH_NONFREE #if FINDOBJECT_NONFREE == 1
PARAMETER(Feature2D, SIFT_nfeatures, int, 0, "The number of best features to retain. The features are ranked by their scores (measured in SIFT algorithm as the local contrast)."); PARAMETER(Feature2D, SIFT_nfeatures, int, 0, "The number of best features to retain. The features are ranked by their scores (measured in SIFT algorithm as the local contrast).");
PARAMETER(Feature2D, SIFT_nOctaveLayers, int, 3, "The number of layers in each octave. 3 is the value used in D. Lowe paper. The number of octaves is computed automatically from the image resolution."); PARAMETER(Feature2D, SIFT_nOctaveLayers, int, 3, "The number of layers in each octave. 3 is the value used in D. Lowe paper. The number of octaves is computed automatically from the image resolution.");
PARAMETER(Feature2D, SIFT_contrastThreshold, double, 0.04, "The contrast threshold used to filter out weak features in semi-uniform (low-contrast) regions. The larger the threshold, the less features are produced by the detector."); PARAMETER(Feature2D, SIFT_contrastThreshold, double, 0.04, "The contrast threshold used to filter out weak features in semi-uniform (low-contrast) regions. The larger the threshold, the less features are produced by the detector.");
@ -178,13 +194,8 @@ class FINDOBJECT_EXP Settings
PARAMETER(Feature2D, FREAK_patternScale, float, 22.0f, "Scaling of the description pattern."); PARAMETER(Feature2D, FREAK_patternScale, float, 22.0f, "Scaling of the description pattern.");
PARAMETER(Feature2D, FREAK_nOctaves, int, 4, "Number of octaves covered by the detected keypoints."); PARAMETER(Feature2D, FREAK_nOctaves, int, 4, "Number of octaves covered by the detected keypoints.");
#ifdef WITH_NONFREE PARAMETER_COND(NearestNeighbor, 1Strategy, QString, FINDOBJECT_NONFREE, "1:Linear;KDTree;KMeans;Composite;Autotuned;Lsh;BruteForce", "6:Linear;KDTree;KMeans;Composite;Autotuned;Lsh;BruteForce", "Nearest neighbor strategy.");
PARAMETER(NearestNeighbor, 1Strategy, QString, "1:Linear;KDTree;KMeans;Composite;Autotuned;Lsh;BruteForce", "Nearest neighbor strategy."); PARAMETER_COND(NearestNeighbor, 2Distance_type, QString, FINDOBJECT_NONFREE, "0:EUCLIDEAN_L2;MANHATTAN_L1;MINKOWSKI;MAX;HIST_INTERSECT;HELLINGER;CHI_SQUARE_CS;KULLBACK_LEIBLER_KL;HAMMING", "1:EUCLIDEAN_L2;MANHATTAN_L1;MINKOWSKI;MAX;HIST_INTERSECT;HELLINGER;CHI_SQUARE_CS;KULLBACK_LEIBLER_KL;HAMMING", "Distance type.");
PARAMETER(NearestNeighbor, 2Distance_type, QString, "0:EUCLIDEAN_L2;MANHATTAN_L1;MINKOWSKI;MAX;HIST_INTERSECT;HELLINGER;CHI_SQUARE_CS;KULLBACK_LEIBLER_KL;HAMMING", "Distance type.");
#else
PARAMETER(NearestNeighbor, 1Strategy, QString, "6:Linear;KDTree;KMeans;Composite;Autotuned;Lsh;BruteForce", "Nearest neighbor strategy.");
PARAMETER(NearestNeighbor, 2Distance_type, QString, "1:EUCLIDEAN_L2;MANHATTAN_L1;MINKOWSKI;MAX;HIST_INTERSECT;HELLINGER;CHI_SQUARE_CS;KULLBACK_LEIBLER_KL;HAMMING", "Distance type.");
#endif
PARAMETER(NearestNeighbor, 3nndrRatioUsed, bool, true, "Nearest neighbor distance ratio approach to accept the best match."); PARAMETER(NearestNeighbor, 3nndrRatioUsed, bool, true, "Nearest neighbor distance ratio approach to accept the best match.");
PARAMETER(NearestNeighbor, 4nndrRatio, float, 0.8f, "Nearest neighbor distance ratio."); PARAMETER(NearestNeighbor, 4nndrRatio, float, 0.8f, "Nearest neighbor distance ratio.");
PARAMETER(NearestNeighbor, 5minDistanceUsed, bool, false, "Minimum distance with the nearest descriptor to accept a match."); PARAMETER(NearestNeighbor, 5minDistanceUsed, bool, false, "Minimum distance with the nearest descriptor to accept a match.");

View File

@ -28,6 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "AboutDialog.h" #include "AboutDialog.h"
#include "ui_aboutDialog.h" #include "ui_aboutDialog.h"
#include <opencv2/core/version.hpp> #include <opencv2/core/version.hpp>
#include "find_object/Version.h"
namespace find_object { namespace find_object {
@ -37,7 +38,15 @@ AboutDialog::AboutDialog(QWidget * parent) :
ui_ = new Ui_aboutDialog(); ui_ = new Ui_aboutDialog();
ui_->setupUi(this); ui_->setupUi(this);
ui_->label_version->setText(PROJECT_VERSION); ui_->label_version->setText(PROJECT_VERSION);
ui_->label_version_opencv->setText(CV_VERSION);
QString cv_version = CV_VERSION;
#if RTABMAP_NONFREE == 1
cv_version.append(" [With nonfree]");
#else
cv_version.append(" [Without nonfree]");
#endif
ui_->label_version_opencv->setText(cv_version);
} }
AboutDialog::~AboutDialog() AboutDialog::~AboutDialog()

View File

@ -135,7 +135,7 @@ MainWindow::MainWindow(FindObject * findObject, Camera * camera, QWidget * paren
if(cv::gpu::getCudaEnabledDeviceCount() == 0) if(cv::gpu::getCudaEnabledDeviceCount() == 0)
{ {
#ifdef WITH_NONFREE #if FINDOBJECT_NONFREE == 1
ui_->toolBox->updateParameter(Settings::kFeature2D_SURF_gpu()); ui_->toolBox->updateParameter(Settings::kFeature2D_SURF_gpu());
ui_->toolBox->getParameterWidget(Settings::kFeature2D_SURF_gpu())->setEnabled(false); ui_->toolBox->getParameterWidget(Settings::kFeature2D_SURF_gpu())->setEnabled(false);
ui_->toolBox->getParameterWidget(Settings::kFeature2D_SURF_keypointsRatio())->setEnabled(false); ui_->toolBox->getParameterWidget(Settings::kFeature2D_SURF_keypointsRatio())->setEnabled(false);

View File

@ -37,6 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <QtGui/QVBoxLayout> #include <QtGui/QVBoxLayout>
#include <QtGui/QMessageBox> #include <QtGui/QMessageBox>
#include <stdio.h> #include <stdio.h>
#include "find_object/utilite/ULogger.h"
namespace find_object { namespace find_object {
@ -336,6 +337,27 @@ void ParametersToolBox::addParameter(QVBoxLayout * layout,
widget->setObjectName(key); widget->setObjectName(key);
QStringList splitted = value.split(':'); QStringList splitted = value.split(':');
widget->addItems(splitted.last().split(';')); widget->addItems(splitted.last().split(';'));
#if FINDOBJECT_NONFREE == 0
if(key.compare(Settings::kFeature2D_1Detector()) == 0)
{
widget->setItemData(5, 0, Qt::UserRole - 1); // disable SIFT
widget->setItemData(7, 0, Qt::UserRole - 1); // disable SURF
}
if(key.compare(Settings::kFeature2D_2Descriptor()) == 0)
{
widget->setItemData(2, 0, Qt::UserRole - 1); // disable SIFT
widget->setItemData(3, 0, Qt::UserRole - 1); // disable SURF
}
if(key.compare(Settings::kNearestNeighbor_1Strategy()) == 0)
{
// disable FLANN approaches (cannot be used with binary descriptors)
widget->setItemData(0, 0, Qt::UserRole - 1);
widget->setItemData(1, 0, Qt::UserRole - 1);
widget->setItemData(2, 0, Qt::UserRole - 1);
widget->setItemData(3, 0, Qt::UserRole - 1);
widget->setItemData(4, 0, Qt::UserRole - 1);
}
#endif
widget->setCurrentIndex(splitted.first().toInt()); widget->setCurrentIndex(splitted.first().toInt());
connect(widget, SIGNAL(currentIndexChanged(int)), this, SLOT(changeParameter(int))); connect(widget, SIGNAL(currentIndexChanged(int)), this, SLOT(changeParameter(int)));
addParameter(layout, key, widget); addParameter(layout, key, widget);

View File

@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <QtCore/QDir> #include <QtCore/QDir>
#include <stdio.h> #include <stdio.h>
#include <opencv2/calib3d/calib3d.hpp> #include <opencv2/calib3d/calib3d.hpp>
#ifdef WITH_NONFREE #if FINDOBJECT_NONFREE == 1
#include <opencv2/nonfree/features2d.hpp> #include <opencv2/nonfree/features2d.hpp>
#include <opencv2/nonfree/gpu.hpp> #include <opencv2/nonfree/gpu.hpp>
#endif #endif
@ -109,6 +109,49 @@ void Settings::loadSettings(const QString & fileName)
value = QVariant(str); value = QVariant(str);
UINFO("Updated list of parameter \"%s\"", key.toStdString().c_str()); UINFO("Updated list of parameter \"%s\"", key.toStdString().c_str());
} }
#if FINDOBJECT_NONFREE == 0
QChar index = str.at(0);
if(key.compare(Settings::kFeature2D_1Detector()) == 0)
{
if(index == '5' || index == '7')
{
index = Settings::defaultFeature2D_1Detector().at(0);
int indexInt = Settings::defaultFeature2D_1Detector().split(':').first().toInt();
UWARN("Trying to set \"%s\" to SIFT/SURF but Find-Object isn't built "
"with the nonfree module from OpenCV. Keeping default combo value: %s.",
Settings::kFeature2D_1Detector().toStdString().c_str(),
Settings::defaultFeature2D_1Detector().split(':').last().split(";").at(indexInt).toStdString().c_str());
}
}
if(key.compare(Settings::kFeature2D_2Descriptor()) == 0)
{
if(index == '2' || index == '3')
{
index = Settings::defaultFeature2D_2Descriptor().at(0);
int indexInt = Settings::defaultFeature2D_2Descriptor().split(':').first().toInt();
UWARN("Trying to set \"%s\" to SIFT/SURF but Find-Object isn't built "
"with the nonfree module from OpenCV. Keeping default combo value: %s.",
Settings::kFeature2D_2Descriptor().toStdString().c_str(),
Settings::defaultFeature2D_2Descriptor().split(':').last().split(";").at(indexInt).toStdString().c_str());
}
}
if(key.compare(Settings::kNearestNeighbor_1Strategy()) == 0)
{
if(index <= '4')
{
index = Settings::defaultNearestNeighbor_1Strategy().at(0);
int indexInt = Settings::defaultNearestNeighbor_1Strategy().split(':').first().toInt();
UWARN("Trying to set \"%s\" to one FLANN approach but Find-Object isn't built "
"with the nonfree module from OpenCV and FLANN cannot be used "
"with binary descriptors. Keeping default combo value: %s.",
Settings::kNearestNeighbor_1Strategy().toStdString().c_str(),
Settings::defaultNearestNeighbor_1Strategy().split(':').last().split(";").at(indexInt).toStdString().c_str());
}
}
str = getParameter(key).toString();
str[0] = index.toAscii();
value = QVariant(str);
#endif
setParameter(key, value); setParameter(key, value);
} }
} }
@ -122,7 +165,7 @@ void Settings::loadSettings(const QString & fileName)
if(cv::gpu::getCudaEnabledDeviceCount() == 0) if(cv::gpu::getCudaEnabledDeviceCount() == 0)
{ {
#ifdef WITH_NONFREE #if FINDOBJECT_NONFREE == 1
Settings::setFeature2D_SURF_gpu(false); Settings::setFeature2D_SURF_gpu(false);
#endif #endif
Settings::setFeature2D_Fast_gpu(false); Settings::setFeature2D_Fast_gpu(false);
@ -222,7 +265,7 @@ public:
cv::Mat & descriptors) = 0; cv::Mat & descriptors) = 0;
}; };
#ifdef WITH_NONFREE #if FINDOBJECT_NONFREE == 1
class GPUSURF : public GPUFeature2D class GPUSURF : public GPUFeature2D
{ {
public: public:
@ -423,12 +466,23 @@ KeypointDetector * Settings::createKeypointDetector()
if(ok) if(ok)
{ {
QStringList strategies = split.last().split(';'); QStringList strategies = split.last().split(';');
#ifdef WITH_NONFREE
if(strategies.size() == 9 && index>=0 && index<9) if(strategies.size() == 9 && index>=0 && index<9)
#else
if(strategies.size() == 7 && index>=0 && index<7)
#endif
{ {
#if FINDOBJECT_NONFREE == 0
//check for nonfree stuff
if(strategies.at(index).compare("SIFT") == 0 ||
strategies.at(index).compare("SURF") == 0)
{
index = Settings::defaultFeature2D_1Detector().split(':').first().toInt();
UERROR("Find-Object is not built with OpenCV nonfree module so "
"SIFT/SURF cannot be used! Using default \"%s\" instead.",
strategies.at(index).toStdString().c_str());
}
#endif
if(strategies.at(index).compare("Dense") == 0) if(strategies.at(index).compare("Dense") == 0)
{ {
detector = new cv::DenseFeatureDetector( detector = new cv::DenseFeatureDetector(
@ -532,7 +586,7 @@ KeypointDetector * Settings::createKeypointDetector()
getFeature2D_BRISK_patternScale()); getFeature2D_BRISK_patternScale());
UDEBUG("type=%s", strategies.at(index).toStdString().c_str()); UDEBUG("type=%s", strategies.at(index).toStdString().c_str());
} }
#ifdef WITH_NONFREE #if FINDOBJECT_NONFREE == 1
else if(strategies.at(index).compare("SIFT") == 0) else if(strategies.at(index).compare("SIFT") == 0)
{ {
detector = new cv::SIFT( detector = new cv::SIFT(
@ -596,12 +650,22 @@ DescriptorExtractor * Settings::createDescriptorExtractor()
if(ok) if(ok)
{ {
QStringList strategies = split.last().split(';'); QStringList strategies = split.last().split(';');
#ifdef WITH_NONFREE
if(strategies.size() == 6 && index>=0 && index<6) if(strategies.size() == 6 && index>=0 && index<6)
#else
if(strategies.size() == 4 && index>=0 && index<4)
#endif
{ {
#if FINDOBJECT_NONFREE == 0
//check for nonfree stuff
if(strategies.at(index).compare("SIFT") == 0 ||
strategies.at(index).compare("SURF") == 0)
{
index = Settings::defaultFeature2D_2Descriptor().split(':').first().toInt();
UERROR("Find-Object is not built with OpenCV nonfree module so "
"SIFT/SURF cannot be used! Using default \"%s\" instead.",
strategies.at(index).toStdString().c_str());
}
#endif
if(strategies.at(index).compare("Brief") == 0) if(strategies.at(index).compare("Brief") == 0)
{ {
extractor = new cv::BriefDescriptorExtractor( extractor = new cv::BriefDescriptorExtractor(
@ -656,7 +720,7 @@ DescriptorExtractor * Settings::createDescriptorExtractor()
getFeature2D_FREAK_nOctaves()); getFeature2D_FREAK_nOctaves());
UDEBUG("type=%s", strategies.at(index).toStdString().c_str()); UDEBUG("type=%s", strategies.at(index).toStdString().c_str());
} }
#ifdef WITH_NONFREE #if FINDOBJECT_NONFREE == 1
else if(strategies.at(index).compare("SIFT") == 0) else if(strategies.at(index).compare("SIFT") == 0)
{ {
extractor = new cv::SIFT( extractor = new cv::SIFT(