mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-03 01:50:24 +08:00
Parameters: added SIFT/RootSIFT parameter.
This commit is contained in:
@@ -276,6 +276,7 @@ private:
|
|||||||
double contrastThreshold_;
|
double contrastThreshold_;
|
||||||
double edgeThreshold_;
|
double edgeThreshold_;
|
||||||
double sigma_;
|
double sigma_;
|
||||||
|
bool rootSIFT_;
|
||||||
|
|
||||||
cv::Ptr<CV_SIFT> _sift;
|
cv::Ptr<CV_SIFT> _sift;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -281,6 +281,7 @@ class RTABMAP_EXP Parameters
|
|||||||
RTABMAP_PARAM(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.");
|
RTABMAP_PARAM(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.");
|
||||||
RTABMAP_PARAM(SIFT, EdgeThreshold, double, 10, "The threshold used to filter out edge-like features. Note that the its meaning is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are filtered out (more features are retained).");
|
RTABMAP_PARAM(SIFT, EdgeThreshold, double, 10, "The threshold used to filter out edge-like features. Note that the its meaning is different from the contrastThreshold, i.e. the larger the edgeThreshold, the less features are filtered out (more features are retained).");
|
||||||
RTABMAP_PARAM(SIFT, Sigma, double, 1.6, "The sigma of the Gaussian applied to the input image at the octave #0. If your image is captured with a weak camera with soft lenses, you might want to reduce the number.");
|
RTABMAP_PARAM(SIFT, Sigma, double, 1.6, "The sigma of the Gaussian applied to the input image at the octave #0. If your image is captured with a weak camera with soft lenses, you might want to reduce the number.");
|
||||||
|
RTABMAP_PARAM(SIFT, RootSIFT, bool, false, "Apply RootSIFT normalization of the descriptors.");
|
||||||
|
|
||||||
RTABMAP_PARAM(BRIEF, Bytes, int, 32, "Bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.");
|
RTABMAP_PARAM(BRIEF, Bytes, int, 32, "Bytes is a length of descriptor in bytes. It can be equal 16, 32 or 64 bytes.");
|
||||||
|
|
||||||
|
|||||||
@@ -842,22 +842,22 @@ long DBDriverSqlite3::getFeaturesMemoryUsedQuery() const
|
|||||||
std::string query;
|
std::string query;
|
||||||
if(uStrNumCmp(_version, "0.13.0") >= 0)
|
if(uStrNumCmp(_version, "0.13.0") >= 0)
|
||||||
{
|
{
|
||||||
query = "SELECT sum(length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(octave) + length(depth_x) + length(depth_y) + length(depth_z) + length(descriptor_size) + length(descriptor)) "
|
query = "SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(octave) + length(depth_x) + length(depth_y) + length(depth_z) + length(descriptor_size) + length(descriptor)) "
|
||||||
"FROM Feature";
|
"FROM Feature";
|
||||||
}
|
}
|
||||||
else if(uStrNumCmp(_version, "0.12.0") >= 0)
|
else if(uStrNumCmp(_version, "0.12.0") >= 0)
|
||||||
{
|
{
|
||||||
query = "SELECT sum(length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(octave) + length(depth_x) + length(depth_y) + length(depth_z) + length(descriptor_size) + length(descriptor)) "
|
query = "SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(octave) + length(depth_x) + length(depth_y) + length(depth_z) + length(descriptor_size) + length(descriptor)) "
|
||||||
"FROM Map_Node_Word";
|
"FROM Map_Node_Word";
|
||||||
}
|
}
|
||||||
else if(uStrNumCmp(_version, "0.11.2") >= 0)
|
else if(uStrNumCmp(_version, "0.11.2") >= 0)
|
||||||
{
|
{
|
||||||
query = "SELECT sum(length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(depth_x) + length(depth_y) + length(depth_z) + length(descriptor_size) + length(descriptor)) "
|
query = "SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(depth_x) + length(depth_y) + length(depth_z) + length(descriptor_size) + length(descriptor)) "
|
||||||
"FROM Map_Node_Word";
|
"FROM Map_Node_Word";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
query = "SELECT sum(length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(depth_x) + length(depth_y) + length(depth_z)) "
|
query = "SELECT sum(length(node_id) + length(word_id) + length(pos_x) + length(pos_y) + length(size) + length(dir) + length(response) + length(depth_x) + length(depth_y) + length(depth_z)) "
|
||||||
"FROM Map_Node_Word";
|
"FROM Map_Node_Word";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -905,7 +905,8 @@ SIFT::SIFT(const ParametersMap & parameters) :
|
|||||||
nOctaveLayers_(Parameters::defaultSIFTNOctaveLayers()),
|
nOctaveLayers_(Parameters::defaultSIFTNOctaveLayers()),
|
||||||
contrastThreshold_(Parameters::defaultSIFTContrastThreshold()),
|
contrastThreshold_(Parameters::defaultSIFTContrastThreshold()),
|
||||||
edgeThreshold_(Parameters::defaultSIFTEdgeThreshold()),
|
edgeThreshold_(Parameters::defaultSIFTEdgeThreshold()),
|
||||||
sigma_(Parameters::defaultSIFTSigma())
|
sigma_(Parameters::defaultSIFTSigma()),
|
||||||
|
rootSIFT_(Parameters::defaultSIFTRootSIFT())
|
||||||
{
|
{
|
||||||
parseParameters(parameters);
|
parseParameters(parameters);
|
||||||
}
|
}
|
||||||
@@ -922,6 +923,7 @@ void SIFT::parseParameters(const ParametersMap & parameters)
|
|||||||
Parameters::parse(parameters, Parameters::kSIFTEdgeThreshold(), edgeThreshold_);
|
Parameters::parse(parameters, Parameters::kSIFTEdgeThreshold(), edgeThreshold_);
|
||||||
Parameters::parse(parameters, Parameters::kSIFTNOctaveLayers(), nOctaveLayers_);
|
Parameters::parse(parameters, Parameters::kSIFTNOctaveLayers(), nOctaveLayers_);
|
||||||
Parameters::parse(parameters, Parameters::kSIFTSigma(), sigma_);
|
Parameters::parse(parameters, Parameters::kSIFTSigma(), sigma_);
|
||||||
|
Parameters::parse(parameters, Parameters::kSIFTRootSIFT(), rootSIFT_);
|
||||||
|
|
||||||
#if CV_MAJOR_VERSION < 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION < 3)
|
#if CV_MAJOR_VERSION < 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION < 3)
|
||||||
#ifdef RTABMAP_NONFREE
|
#ifdef RTABMAP_NONFREE
|
||||||
@@ -962,6 +964,23 @@ cv::Mat SIFT::generateDescriptorsImpl(const cv::Mat & image, std::vector<cv::Key
|
|||||||
cv::Mat descriptors;
|
cv::Mat descriptors;
|
||||||
#if defined(RTABMAP_NONFREE) || CV_MAJOR_VERSION > 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION >= 3)
|
#if defined(RTABMAP_NONFREE) || CV_MAJOR_VERSION > 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION >= 3)
|
||||||
_sift->compute(image, keypoints, descriptors);
|
_sift->compute(image, keypoints, descriptors);
|
||||||
|
|
||||||
|
if( rootSIFT_ && !descriptors.empty())
|
||||||
|
{
|
||||||
|
UDEBUG("Performing RootSIFT...");
|
||||||
|
// see http://www.pyimagesearch.com/2015/04/13/implementing-rootsift-in-python-and-opencv/
|
||||||
|
// apply the Hellinger kernel by first L1-normalizing and taking the
|
||||||
|
// square-root
|
||||||
|
for(int i=0; i<descriptors.rows; ++i)
|
||||||
|
{
|
||||||
|
// By taking the L1 norm, followed by the square-root, we have
|
||||||
|
// already L2 normalized the feature vector and further normalization
|
||||||
|
// is not needed.
|
||||||
|
descriptors.row(i) = descriptors.row(i) / cv::sum(descriptors.row(i))[0];
|
||||||
|
cv::sqrt(descriptors.row(i), descriptors.row(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
UWARN("RTAB-Map is not built with OpenCV nonfree module so SIFT cannot be used!");
|
UWARN("RTAB-Map is not built with OpenCV nonfree module so SIFT cannot be used!");
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -905,6 +905,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
|
|||||||
_ui->sift_doubleSpinBox_contrastThr->setObjectName(Parameters::kSIFTContrastThreshold().c_str());
|
_ui->sift_doubleSpinBox_contrastThr->setObjectName(Parameters::kSIFTContrastThreshold().c_str());
|
||||||
_ui->sift_doubleSpinBox_edgeThr->setObjectName(Parameters::kSIFTEdgeThreshold().c_str());
|
_ui->sift_doubleSpinBox_edgeThr->setObjectName(Parameters::kSIFTEdgeThreshold().c_str());
|
||||||
_ui->sift_doubleSpinBox_sigma->setObjectName(Parameters::kSIFTSigma().c_str());
|
_ui->sift_doubleSpinBox_sigma->setObjectName(Parameters::kSIFTSigma().c_str());
|
||||||
|
_ui->sift_checkBox_rootsift->setObjectName(Parameters::kSIFTRootSIFT().c_str());
|
||||||
|
|
||||||
//BRIEF descriptor
|
//BRIEF descriptor
|
||||||
_ui->briefBytes->setObjectName(Parameters::kBRIEFBytes().c_str());
|
_ui->briefBytes->setObjectName(Parameters::kBRIEFBytes().c_str());
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-279</y>
|
<y>0</y>
|
||||||
<width>680</width>
|
<width>680</width>
|
||||||
<height>3270</height>
|
<height>2107</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_16">
|
<layout class="QVBoxLayout" name="verticalLayout_16">
|
||||||
@@ -95,7 +95,7 @@
|
|||||||
<enum>QFrame::Raised</enum>
|
<enum>QFrame::Raised</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="currentIndex">
|
<property name="currentIndex">
|
||||||
<number>21</number>
|
<number>28</number>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="page_22">
|
<widget class="QWidget" name="page_22">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,1">
|
||||||
@@ -20492,6 +20492,23 @@ Lower the ratio -> higher the precision.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLabel" name="label_591">
|
||||||
|
<property name="text">
|
||||||
|
<string>RootSIFT.</string>
|
||||||
|
</property>
|
||||||
|
<property name="textInteractionFlags">
|
||||||
|
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QCheckBox" name="sift_checkBox_rootsift">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -94,6 +94,11 @@ int main(int argc, char * argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string databasePath = uReplaceChar(argv[argc-1], '~', UDirectory::homeDir());
|
std::string databasePath = uReplaceChar(argv[argc-1], '~', UDirectory::homeDir());
|
||||||
|
if(!UFile::exists(databasePath))
|
||||||
|
{
|
||||||
|
printf("Database \"%s\" doesn't exist!\n", databasePath.c_str());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
DBDriver * driver = DBDriver::create();
|
DBDriver * driver = DBDriver::create();
|
||||||
if(!driver->openConnection(databasePath))
|
if(!driver->openConnection(databasePath))
|
||||||
@@ -110,6 +115,14 @@ int main(int argc, char * argv[])
|
|||||||
if(!otherDatabasePath.empty())
|
if(!otherDatabasePath.empty())
|
||||||
{
|
{
|
||||||
driver->closeConnection(false);
|
driver->closeConnection(false);
|
||||||
|
|
||||||
|
if(!UFile::exists(otherDatabasePath))
|
||||||
|
{
|
||||||
|
printf("Database \"%s\" doesn't exist!\n", otherDatabasePath.c_str());
|
||||||
|
delete driver;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if(!driver->openConnection(otherDatabasePath))
|
if(!driver->openConnection(otherDatabasePath))
|
||||||
{
|
{
|
||||||
printf("Cannot open database \"%s\".\n", otherDatabasePath.c_str());
|
printf("Cannot open database \"%s\".\n", otherDatabasePath.c_str());
|
||||||
|
|||||||
Reference in New Issue
Block a user