Adding OpenCV's GPU GFTT/ OpticalFlow and CudaSift support (#1330)

* Adding GFTT and SIFT Cuda support

* Working CudaSift

* Disable cudasift option when not available

* Added check to avoid re-allocating gpu memory everytime parseParameters is called. Added workaround of to detect/ignore invalid descriptors

* Added SIFT/PreciseUpscale and SIFT/Upscale parameters. Adjusted max octave to behave more like opencv

* Refactored how maximum features are thresholded, to be more similar to OpenCV version

* Updated loop closure benchmark scripts

* Cuda optical flow tmp commit

* Added Stereo/Gpu Vis/CorFlowGpu parameters (optical flow gpu integration for F2F odom and stereo correspondences)

* Fixed build without opencv cuda

* Fixed build with Opencv 4.10

* ZED: updated parameters to match zed sdk 4

* MRPT requires C++17

* updated max octave limit CudaSift
This commit is contained in:
matlabbe
2024-09-13 14:22:54 -07:00
committed by GitHub
parent f3ccfcb452
commit 69ac21f811
37 changed files with 2253 additions and 1375 deletions

View File

@@ -100,6 +100,20 @@ AboutDialog::AboutDialog(QWidget * parent) :
_ui->label_fastcv->setText("No");
_ui->label_fastcv_license->setEnabled(false);
#endif
#ifdef RTABMAP_PDAL
_ui->label_pdal->setText("Yes");
_ui->label_pdal_license->setEnabled(true);
#else
_ui->label_pdal->setText("No");
_ui->label_pdal_license->setEnabled(false);
#endif
#ifdef RTABMAP_CUDASIFT
_ui->label_cudasift->setText("Yes");
_ui->label_cudasift_license->setEnabled(true);
#else
_ui->label_cudasift->setText("No");
_ui->label_cudasift_license->setEnabled(false);
#endif
#ifdef RTABMAP_OCTOMAP
_ui->label_octomap->setText("Yes");
_ui->label_octomap_license->setEnabled(true);

View File

@@ -211,7 +211,7 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
cloudView_->setBackgroundColor(Qt::black);
}
timeLabel_->setText(QString("%1 s").arg(odom.info().timeEstimation));
timeLabel_->setText(QString("%1 s").arg(odom.info().timeEstimation));
if(cloudShown_->isChecked() &&
!odom.data().imageRaw().empty() &&
@@ -219,8 +219,8 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
(odom.data().stereoCameraModels().size() || odom.data().cameraModels().size()))
{
UDEBUG("New pose = %s, quality=%d", odom.pose().prettyPrint().c_str(), quality);
if(!odom.data().depthRaw().empty())
if(!odom.data().depthRaw().empty())
{
if(odom.data().imageRaw().cols % decimationSpin_->value() == 0 &&
odom.data().imageRaw().rows % decimationSpin_->value() == 0)
@@ -238,14 +238,14 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
}
}
else
{
validDecimationValue_ = decimationSpin_->value();
{
validDecimationValue_ = decimationSpin_->value();
}
// visualization: buffering the clouds
// Create the new cloud
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud;
pcl::IndicesPtr validIndices(new std::vector<int>);
pcl::IndicesPtr validIndices(new std::vector<int>);
cloud = util3d::cloudRGBFromSensorData(
odom.data(),
validDecimationValue_,
@@ -257,7 +257,7 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
if(voxelSpin_->value())
{
cloud = util3d::voxelize(cloud, validIndices, voxelSpin_->value());
}
}
if(cloud->size())
{
@@ -489,6 +489,7 @@ void OdometryViewer::processData(const rtabmap::OdometryEvent & odom)
imageView_->update();
cloudView_->update();
cloudView_->refreshView();
QApplication::processEvents();
processingData_ = false;
}

View File

@@ -159,10 +159,28 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->checkBox_ORBGpu->setEnabled(false);
_ui->label_orbGpu->setEnabled(false);
_ui->checkBox_GFTT_gpu->setEnabled(false);
_ui->label_GFTT_gpu->setEnabled(false);
// disable BruteForceGPU option
_ui->comboBox_dictionary_strategy->setItemData(4, 0, Qt::UserRole - 1);
_ui->reextract_nn->setItemData(4, 0, Qt::UserRole - 1);
}
#ifndef RTABMAP_CUDASIFT
_ui->sift_checkBox_gpu->setEnabled(false);
_ui->sift_label_gpu->setEnabled(false);
_ui->sift_doubleSpinBox_gaussianDiffThreshold->setEnabled(false);
_ui->sift_label_gaussianThreshold->setEnabled(false);
_ui->sift_checkBox_upscale->setEnabled(false);
_ui->sift_label_upscale->setEnabled(false);
#endif
#ifndef HAVE_OPENCV_CUDAOPTFLOW
_ui->odom_flow_gpu->setEnabled(false);
_ui->label_odom_flow_gpu->setEnabled(false);
_ui->stereo_flow_gpu->setEnabled(false);
_ui->label_stereo_flow_gpu->setEnabled(false);
#endif
#ifndef RTABMAP_OCTOMAP
_ui->groupBox_octomap->setChecked(false);
@@ -242,6 +260,10 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->vis_feature_detector->setItemData(1, 0, Qt::UserRole - 1);
#endif
#endif
#if CV_MAJOR_VERSION < 4 || (CV_MAJOR_VERSION == 4 && CV_MINOR_VERSION < 8)
_ui->sift_checkBox_preciseUpscale->setEnabled(false);
_ui->sift_label_preciseUpscale->setEnabled(false);
#endif
#if CV_MAJOR_VERSION >= 3 && !defined(HAVE_OPENCV_XFEATURES2D)
_ui->comboBox_detector_strategy->setItemData(3, 0, Qt::UserRole - 1);
@@ -401,7 +423,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
}
else if(CameraStereoZed::sdkVersion() < 4)
{
_ui->comboBox_stereoZed_resolution->setItemData(2, 0, Qt::UserRole - 1);
_ui->comboBox_stereoZed_resolution->setItemData(1, 0, Qt::UserRole - 1);
_ui->comboBox_stereoZed_resolution->setItemData(4, 0, Qt::UserRole - 1);
_ui->comboBox_stereoZed_resolution->setItemData(6, 0, Qt::UserRole - 1);
_ui->comboBox_stereoZed_quality->setItemData(3, 0, Qt::UserRole - 1);
@@ -1063,12 +1085,15 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->surf_doubleSpinBox_gpuKeypointsRatio->setObjectName(Parameters::kSURFGpuKeypointsRatio().c_str());
//SIFT detector
_ui->sift_spinBox_nFeatures->setObjectName(Parameters::kSIFTNFeatures().c_str());
_ui->sift_spinBox_nOctaveLayers->setObjectName(Parameters::kSIFTNOctaveLayers().c_str());
_ui->sift_doubleSpinBox_contrastThr->setObjectName(Parameters::kSIFTContrastThreshold().c_str());
_ui->sift_doubleSpinBox_edgeThr->setObjectName(Parameters::kSIFTEdgeThreshold().c_str());
_ui->sift_doubleSpinBox_sigma->setObjectName(Parameters::kSIFTSigma().c_str());
_ui->sift_checkBox_preciseUpscale->setObjectName(Parameters::kSIFTPreciseUpscale().c_str());
_ui->sift_checkBox_rootsift->setObjectName(Parameters::kSIFTRootSIFT().c_str());
_ui->sift_checkBox_gpu->setObjectName(Parameters::kSIFTGpu().c_str());
_ui->sift_doubleSpinBox_gaussianDiffThreshold->setObjectName(Parameters::kSIFTGaussianThreshold().c_str());
_ui->sift_checkBox_upscale->setObjectName(Parameters::kSIFTUpscale().c_str());
//BRIEF descriptor
_ui->briefBytes->setObjectName(Parameters::kBRIEFBytes().c_str());
@@ -1106,6 +1131,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->spinBox_GFTT_blockSize->setObjectName(Parameters::kGFTTBlockSize().c_str());
_ui->checkBox_GFTT_useHarrisDetector->setObjectName(Parameters::kGFTTUseHarrisDetector().c_str());
_ui->doubleSpinBox_GFTT_k->setObjectName(Parameters::kGFTTK().c_str());
_ui->checkBox_GFTT_gpu->setObjectName(Parameters::kGFTTGpu().c_str());
//BRISK
_ui->spinBox_BRISK_thresh->setObjectName(Parameters::kBRISKThresh().c_str());
@@ -1265,10 +1291,11 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->subpix_winSize->setObjectName(Parameters::kVisSubPixWinSize().c_str());
_ui->subpix_iterations->setObjectName(Parameters::kVisSubPixIterations().c_str());
_ui->subpix_eps->setObjectName(Parameters::kVisSubPixEps().c_str());
_ui->odom_flow_winSize_2->setObjectName(Parameters::kVisCorFlowWinSize().c_str());
_ui->odom_flow_maxLevel_2->setObjectName(Parameters::kVisCorFlowMaxLevel().c_str());
_ui->odom_flow_iterations_2->setObjectName(Parameters::kVisCorFlowIterations().c_str());
_ui->odom_flow_eps_2->setObjectName(Parameters::kVisCorFlowEps().c_str());
_ui->odom_flow_winSize->setObjectName(Parameters::kVisCorFlowWinSize().c_str());
_ui->odom_flow_maxLevel->setObjectName(Parameters::kVisCorFlowMaxLevel().c_str());
_ui->odom_flow_iterations->setObjectName(Parameters::kVisCorFlowIterations().c_str());
_ui->odom_flow_eps->setObjectName(Parameters::kVisCorFlowEps().c_str());
_ui->odom_flow_gpu->setObjectName(Parameters::kVisCorFlowGpu().c_str());
_ui->loopClosure_bundle->setObjectName(Parameters::kVisBundleAdjustment().c_str());
//RegistrationIcp
@@ -1585,6 +1612,8 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_ui->stereo_ssd->setObjectName(Parameters::kStereoSSD().c_str());
_ui->stereo_flow_eps->setObjectName(Parameters::kStereoEps().c_str());
_ui->stereo_opticalFlow->setObjectName(Parameters::kStereoOpticalFlow().c_str());
_ui->stereo_flow_gpu->setObjectName(Parameters::kStereoGpu().c_str());
// Odometry Open3D
_ui->odom_open3d_method->setObjectName(Parameters::kOdomOpen3DMethod().c_str());
@@ -2200,7 +2229,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
_ui->spinBox_stereo_right_device->setValue(-1);
_ui->spinBox_stereousbcam_streamWidth->setValue(0);
_ui->spinBox_stereousbcam_streamHeight->setValue(0);
_ui->comboBox_stereoZed_resolution->setCurrentIndex(CameraStereoZed::sdkVersion()<4?3:6);
_ui->comboBox_stereoZed_resolution->setCurrentIndex(0);
_ui->comboBox_stereoZed_quality->setCurrentIndex(1);
_ui->checkbox_stereoZed_selfCalibration->setChecked(true);
_ui->comboBox_stereoZed_sensingMode->setCurrentIndex(0);
@@ -6764,7 +6793,7 @@ Camera * PreferencesDialog::createCamera(
{
camera = new CameraStereoZed(
device.isEmpty()?0:atoi(device.toStdString().c_str()),
_ui->comboBox_stereoZed_resolution->currentIndex(),
_ui->comboBox_stereoZed_resolution->currentIndex()-1,
// depth should be enabled for zed vo to work
_ui->comboBox_stereoZed_quality->currentIndex()==0&&odomOnly?1:_ui->comboBox_stereoZed_quality->currentIndex(),
_ui->comboBox_stereoZed_sensingMode->currentIndex(),

File diff suppressed because it is too large Load Diff

View File

@@ -95,7 +95,7 @@
<enum>QFrame::Raised</enum>
</property>
<property name="currentIndex">
<number>7</number>
<number>24</number>
</property>
<widget class="QWidget" name="page_22">
<layout class="QVBoxLayout" name="verticalLayout_29" stretch="0,0">
@@ -5534,6 +5534,16 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
</item>
<item row="0" column="0">
<widget class="QComboBox" name="comboBox_stereoZed_resolution">
<item>
<property name="text">
<string>AUTO</string>
</property>
</item>
<item>
<property name="text">
<string>HD4K</string>
</property>
</item>
<item>
<property name="text">
<string>HD2K</string>
@@ -5564,11 +5574,6 @@ when using the file type, logs are saved in LogRtabmap.txt (located in the worki
<string>VGA</string>
</property>
</item>
<item>
<property name="text">
<string>AUTO</string>
</property>
</item>
</widget>
</item>
</layout>
@@ -15707,7 +15712,7 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
<item>
<widget class="QStackedWidget" name="stackedWidget_odometryType">
<property name="currentIndex">
<number>5</number>
<number>1</number>
</property>
<widget class="QWidget" name="page_52">
<layout class="QVBoxLayout" name="verticalLayout_77">
@@ -16107,27 +16112,11 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
<property name="title">
<string>[Visual] Correspondences computation: Optical Flow</string>
</property>
<layout class="QGridLayout" name="gridLayout_52" columnstretch="0,0">
<item row="0" column="0">
<widget class="QSpinBox" name="odom_flow_winSize_2">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>999999</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_295">
<layout class="QGridLayout" name="gridLayout_52" columnstretch="0,1">
<item row="0" column="1">
<widget class="QLabel" name="label_201">
<property name="text">
<string>Iterations.</string>
<string>Window size.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -16150,34 +16139,40 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_201">
<property name="text">
<string>Window size.</string>
<item row="1" column="0">
<widget class="QSpinBox" name="odom_flow_iterations">
<property name="minimum">
<number>1</number>
</property>
<property name="wordWrap">
<bool>true</bool>
<property name="maximum">
<number>999999</number>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>30</number>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_296">
<property name="text">
<string>Epsilon.</string>
<item row="0" column="0">
<widget class="QSpinBox" name="odom_flow_winSize">
<property name="minimum">
<number>1</number>
</property>
<property name="wordWrap">
<bool>true</bool>
<property name="maximum">
<number>999999</number>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QDoubleSpinBox" name="odom_flow_eps_2">
<widget class="QDoubleSpinBox" name="odom_flow_eps">
<property name="decimals">
<number>3</number>
</property>
@@ -16195,8 +16190,21 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_295">
<property name="text">
<string>Iterations.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QSpinBox" name="odom_flow_maxLevel_2">
<widget class="QSpinBox" name="odom_flow_maxLevel">
<property name="minimum">
<number>0</number>
</property>
@@ -16211,19 +16219,36 @@ If set to false, classic RTAB-Map loop closure detection is done using only imag
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="odom_flow_iterations_2">
<property name="minimum">
<number>1</number>
<item row="2" column="1">
<widget class="QLabel" name="label_296">
<property name="text">
<string>Epsilon.</string>
</property>
<property name="maximum">
<number>999999</number>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="singleStep">
<number>1</number>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
<property name="value">
<number>30</number>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="label_odom_flow_gpu">
<property name="text">
<string>Use GPU. OpenCV built with CUDA required.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QCheckBox" name="odom_flow_gpu">
<property name="text">
<string/>
</property>
</widget>
</item>
@@ -24313,10 +24338,10 @@ Lower the ratio -&gt; higher the precision.</string>
<string/>
</property>
<layout class="QGridLayout" name="gridLayout_33" columnstretch="0,1">
<item row="2" column="1">
<widget class="QLabel" name="label_284">
<item row="6" column="1">
<widget class="QLabel" name="label_286">
<property name="text">
<string>Window height.</string>
<string>Maximum disparity.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -24326,84 +24351,6 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="label_285">
<property name="text">
<string>Minimum disparity.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="stereo_winWidth">
<property name="minimum">
<number>3</number>
</property>
<property name="maximum">
<number>999999</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_205">
<property name="text">
<string>Window width.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="label_206">
<property name="text">
<string>Maximum iterations.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QCheckBox" name="stereo_ssd">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QSpinBox" name="stereo_winHeight">
<property name="minimum">
<number>3</number>
</property>
<property name="maximum">
<number>999999</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QSpinBox" name="stereo_iterations">
<property name="minimum">
@@ -24420,29 +24367,10 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QDoubleSpinBox" name="stereo_flow_eps">
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>0.000100000000000</double>
</property>
<property name="maximum">
<double>0.100000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QLabel" name="label_207">
<item row="7" column="1">
<widget class="QLabel" name="label_214">
<property name="text">
<string>[OpticalFlow = true] Epsilon stop criterion.</string>
<string>Use optical flow to find stereo correspondences, otherwise a simple block matching approach is used.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -24465,19 +24393,49 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QSpinBox" name="stereo_maxLevel">
<property name="minimum">
<number>0</number>
<item row="9" column="1">
<widget class="QLabel" name="label_207">
<property name="text">
<string>[OpticalFlow = true] Epsilon stop criterion.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QDoubleSpinBox" name="stereo_maxDisparity">
<property name="maximum">
<number>999999</number>
<double>9999.000000000000000</double>
</property>
<property name="singleStep">
<number>1</number>
</widget>
</item>
<item row="4" column="1">
<widget class="QLabel" name="label_206">
<property name="text">
<string>Maximum iterations.</string>
</property>
<property name="value">
<number>3</number>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_205">
<property name="text">
<string>Window width.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
@@ -24494,10 +24452,10 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QLabel" name="label_214">
<item row="5" column="1">
<widget class="QLabel" name="label_285">
<property name="text">
<string>Use optical flow to find stereo correspondences, otherwise a simple block matching approach is used.</string>
<string>Minimum disparity.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -24507,26 +24465,6 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QLabel" name="label_286">
<property name="text">
<string>Maximum disparity.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="stereo_opticalFlow">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QDoubleSpinBox" name="stereo_minDisparity">
<property name="maximum">
@@ -24534,10 +24472,117 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QDoubleSpinBox" name="stereo_maxDisparity">
<item row="9" column="0">
<widget class="QDoubleSpinBox" name="stereo_flow_eps">
<property name="decimals">
<number>4</number>
</property>
<property name="minimum">
<double>0.000100000000000</double>
</property>
<property name="maximum">
<double>9999.000000000000000</double>
<double>0.100000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.010000000000000</double>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QCheckBox" name="stereo_ssd">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QCheckBox" name="stereo_opticalFlow">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="stereo_winWidth">
<property name="minimum">
<number>3</number>
</property>
<property name="maximum">
<number>999999</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QSpinBox" name="stereo_maxLevel">
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>999999</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>3</number>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_284">
<property name="text">
<string>Window height.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QSpinBox" name="stereo_winHeight">
<property name="minimum">
<number>3</number>
</property>
<property name="maximum">
<number>999999</number>
</property>
<property name="singleStep">
<number>1</number>
</property>
<property name="value">
<number>21</number>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QLabel" name="label_stereo_flow_gpu">
<property name="text">
<string>[OpticalFlow = true] Do optical flow on GPU. RTAB-Map should be built with OpenCV CUDA.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QCheckBox" name="stereo_flow_gpu">
<property name="text">
<string/>
</property>
</widget>
</item>
@@ -25515,13 +25560,46 @@ Lower the ratio -&gt; higher the precision.</string>
<string>SIFT</string>
</property>
<layout class="QGridLayout" name="gridLayout_19" columnstretch="0,1">
<item row="4" column="0">
<widget class="QCheckBox" name="sift_checkBox_preciseUpscale">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_30">
<property name="text">
<string>Edge threshold. 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).</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QSpinBox" name="sift_spinBox_nFeatures"/>
<widget class="QSpinBox" name="sift_spinBox_nOctaveLayers"/>
</item>
<item row="4" column="1">
<widget class="QLabel" name="label_129">
<widget class="QLabel" name="sift_label_preciseUpscale">
<property name="text">
<string>Sigma.</string>
<string>Whether to enable precise upscaling in the scale pyramid.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_130">
<property name="text">
<string>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. Not used by CudaSift, the number of octaves is still computed automatically.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
@@ -25529,6 +25607,23 @@ Lower the ratio -&gt; higher the precision.</string>
</widget>
</item>
<item row="2" column="0">
<widget class="QDoubleSpinBox" name="sift_doubleSpinBox_edgeThr">
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="sift_checkBox_rootsift">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="sift_doubleSpinBox_contrastThr">
<property name="decimals">
<number>6</number>
@@ -25547,37 +25642,7 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Contrast threshold.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="label_30">
<property name="text">
<string>Edge threshold.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QDoubleSpinBox" name="sift_doubleSpinBox_edgeThr">
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QDoubleSpinBox" name="sift_doubleSpinBox_sigma">
<property name="singleStep">
<double>0.100000000000000</double>
@@ -25587,31 +25652,53 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="sift_spinBox_nOctaveLayers"/>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_130">
<item row="6" column="1">
<widget class="QLabel" name="sift_label_gpu">
<property name="text">
<string>nOctaveLayers.</string>
<string>CudaSift: Use GPU version of SIFT. This option is enabled only RTAB-Map is built with CudaSift dependency and GPUs are detected.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_131">
<item row="1" column="1">
<widget class="QLabel" name="label_5">
<property name="text">
<string>nFeatures.</string>
<string>Contrast threshold. 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. Not used by CudaSift.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QDoubleSpinBox" name="sift_doubleSpinBox_gaussianDiffThreshold">
<property name="decimals">
<number>2</number>
</property>
<property name="minimum">
<double>0.010000000000000</double>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>4.500000000000000</double>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="label_591">
<widget class="QLabel" name="sift_label_rootsift">
<property name="text">
<string>RootSIFT.</string>
</property>
@@ -25620,8 +25707,51 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="sift_checkBox_rootsift">
<item row="7" column="1">
<widget class="QLabel" name="sift_label_gaussianThreshold">
<property name="text">
<string>CudaSift: Threshold on difference of Gaussians for feature pruning. The higher the threshold, the less features are produced by the detector.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="sift_checkBox_gpu">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="label_129">
<property name="text">
<string>Sigma. 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.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QLabel" name="sift_label_upscale">
<property name="text">
<string>CudaSift: Whether to enable upscaling.</string>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QCheckBox" name="sift_checkBox_upscale">
<property name="text">
<string/>
</property>
@@ -26272,22 +26402,16 @@ Lower the ratio -&gt; higher the precision.</string>
<string>GFTT</string>
</property>
<layout class="QGridLayout" name="gridLayout_21" columnstretch="0,1">
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_GFTT_qualityLevel">
<property name="decimals">
<number>4</number>
<item row="0" column="1">
<widget class="QLabel" name="label_175">
<property name="text">
<string>Quality level. Parameter characterizing the minimal accepted quality of image corners. The parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue (see cornerMinEigenVal() ) or the Harris function response. The corners with the quality measure less than the product are rejected. For example, if the best corner has the quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure less than 15 are rejected.</string>
</property>
<property name="minimum">
<double>0.000100000000000</double>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.010000000000000</double>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
@@ -26311,21 +26435,14 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="label_172">
<property name="text">
<string>Use Harris detector.</string>
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_GFTT_qualityLevel">
<property name="decimals">
<number>4</number>
</property>
<property name="wordWrap">
<bool>true</bool>
<property name="minimum">
<double>0.000100000000000</double>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_GFTT_k">
<property name="maximum">
<double>1.000000000000000</double>
</property>
@@ -26333,7 +26450,7 @@ Lower the ratio -&gt; higher the precision.</string>
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.040000000000000</double>
<double>0.010000000000000</double>
</property>
</widget>
</item>
@@ -26357,10 +26474,23 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_175">
<item row="4" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_GFTT_k">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.040000000000000</double>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_177">
<property name="text">
<string>Quality level. Parameter characterizing the minimal accepted quality of image corners. The parameter value is multiplied by the best corner quality measure, which is the minimal eigenvalue (see cornerMinEigenVal() ) or the Harris function response. The corners with the quality measure less than the product are rejected. For example, if the best corner has the quality measure = 1500, and the qualityLevel=0.01 , then all the corners with the quality measure less than 15 are rejected.</string>
<string>Block size. Size of an average block for computing a derivative covariation matrix over each pixel neighborhood.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -26383,10 +26513,10 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_177">
<item row="3" column="1">
<widget class="QLabel" name="label_172">
<property name="text">
<string>Block size. Size of an average block for computing a derivative covariation matrix over each pixel neighborhood.</string>
<string>Use Harris detector.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@@ -26396,6 +26526,29 @@ Lower the ratio -&gt; higher the precision.</string>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QLabel" name="label_GFTT_gpu">
<property name="text">
<string>GPU-GFTT: Use GPU version of GFTT. This option is available only if OpenCV&gt;=3 is built with CUDA and GPUs are detected.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
<property name="textInteractionFlags">
<set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByMouse</set>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="checkBox_GFTT_gpu">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>