Refactoring of Export/View actions:

Added ExportCloudsDialog class for convenience when Viewing or Exporting clouds/meshes
Added Export grid map action
Clouds shown in the 3D Map view can be directly saved without cloud regeneration.

git-svn-id: http://rtabmap.googlecode.com/svn/trunk/rtabmap@1621 f169173b-cf89-36c8-b27e-44dbe73f0c83
This commit is contained in:
matlabbe
2014-07-29 00:52:35 +00:00
parent 0a385ed75f
commit 51b5a91c6a
11 changed files with 937 additions and 858 deletions

View File

@@ -149,10 +149,9 @@ private slots:
void setAspectRatio480p();
void setAspectRatio720p();
void setAspectRatio1080p();
void savePointClouds();
void saveMeshes();
void viewPointClouds();
void viewMeshes();
void exportGridMap();
void exportPointClouds();
void viewClouds();
void resetOdometry();
void triggerNewMap();
void dataRecorder();
@@ -184,7 +183,13 @@ private:
void updateSelectSourceDatabase(bool used);
void updateSelectSourceRGBDMenu(bool used, PreferencesDialog::Src src);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr createAssembledCloud(const std::map<int, Transform> & poses) const;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr getAssembledCloud(
const std::map<int, Transform> & poses,
float assembledVoxelSize,
bool regenerateClouds,
int regenerateDecimation,
float regenerateVoxelSize,
float regenerateMaxDepth) const;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr createCloud(
int id,
const cv::Mat & rgb,
@@ -198,10 +203,15 @@ private:
float voxelSize,
int decimation,
float maxDepth) const;
std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr > createPointClouds(const std::map<int, Transform> & poses, bool applyMLS) const;
std::map<int, pcl::PolygonMesh::Ptr> createMeshes(const std::map<int, Transform> & poses, bool applyMLS) const;
std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr > getClouds(
const std::map<int, Transform> & poses,
bool regenerateClouds,
int regenerateDecimation,
float regenerateVoxelSize,
float regenerateMaxDepth) const;
void savePointClouds(const std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> & clouds);
bool getExportedClouds(std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> & clouds, std::map<int, pcl::PolygonMesh::Ptr> & meshes, bool toSave);
void saveClouds(const std::map<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr> & clouds);
void saveMeshes(const std::map<int, pcl::PolygonMesh::Ptr> & meshes);
private:
@@ -233,6 +243,7 @@ private:
QMap<int, float> _depthCysMap;
QMap<int, Transform> _localTransformsMap;
std::map<int, Transform> _currentPosesMap;
QMap<int, pcl::PointCloud<pcl::PointXYZRGB>::Ptr > _createdClouds;
Transform _odometryCorrection;
Transform _lastOdomPose;
bool _lastOdometryProcessed;

View File

@@ -113,22 +113,22 @@ public:
int getKeypointsOpacity() const;
int getOdomQualityWarnThr() const;
bool isCloudMeshing(int index) const; // 0=map
bool isCloudsShown(int index) const; // 0=map, 1=odom, 2=save
double getCloudVoxelSize(int index) const; // 0=map, 1=odom, 2=save
int getCloudDecimation(int index) const; // 0=map, 1=odom, 2=save
double getCloudMaxDepth(int index) const; // 0=map, 1=odom, 2=save
bool isCloudMeshing() const;
bool isCloudsShown(int index) const; // 0=map, 1=odom
double getCloudVoxelSize(int index) const; // 0=map, 1=odom
int getCloudDecimation(int index) const; // 0=map, 1=odom
double getCloudMaxDepth(int index) const; // 0=map, 1=odom
double getCloudOpacity(int index) const; // 0=map, 1=odom
int getCloudPointSize(int index) const; // 0=map, 1=odom
bool isScansShown(int index) const; // 0=map, 1=odom, 2=save
bool isScansShown(int index) const; // 0=map, 1=odom
double getScanOpacity(int index) const; // 0=map, 1=odom
int getScanPointSize(int index) const; // 0=map, 1=odom
int getMeshNormalKSearch(int index) const; // 0=map, 1=save
double getMeshGP3Radius(int index) const; // 0=map, 1=save
bool getMeshSmoothing(int index) const; // 0=map, 1=save
double getMeshSmoothingRadius(int index) const; // 0=map, 1=save
int getMeshNormalKSearch() const;
double getMeshGP3Radius() const;
bool getMeshSmoothing() const;
double getMeshSmoothingRadius() const;
bool isCloudFiltering() const;
double getCloudFilteringRadius() const;
@@ -284,11 +284,6 @@ private:
QVector<QCheckBox*> _3dRenderingShowScans;
QVector<QDoubleSpinBox*> _3dRenderingOpacityScan;
QVector<QSpinBox*> _3dRenderingPtSizeScan;
QVector<QCheckBox*> _3dRenderingMeshing;
QVector<QSpinBox*> _3dRenderingNormalKSearch;
QVector<QDoubleSpinBox*> _3dRenderingGP3Radius;
QVector<QCheckBox*> _3dRenderingSmoothing;
QVector<QDoubleSpinBox*> _3dRenderingSmoothingRadius;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(PreferencesDialog::PANEL_FLAGS)

View File

@@ -19,6 +19,7 @@ SET(headers_ui
../include/${PROJECT_PREFIX}/gui/DataRecorder.h
../include/${PROJECT_PREFIX}/gui/CalibrationDialog.h
./ExportDialog.h
./ExportCloudsDialog.h
./MapVisibilityWidget.h
)
@@ -30,6 +31,7 @@ SET(uis
./ui/DatabaseViewer.ui
./ui/loopClosureViewer.ui
./ui/exportDialog.ui
./ui/exportCloudsDialog.ui
./ui/calibrationDialog.ui
)
@@ -68,6 +70,7 @@ SET(SRC_FILES
./DataRecorder.cpp
./CalibrationDialog.cpp
./ExportDialog.cpp
./ExportCloudsDialog.cpp
./MapVisibilityWidget.cpp
./GraphViewer.cpp
${moc_srcs}

View File

@@ -0,0 +1,99 @@
/*
* Copyright (C) 2010-2011, Mathieu Labbe and IntRoLab - Universite de Sherbrooke
*
* This file is part of RTAB-Map.
*
* RTAB-Map is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* RTAB-Map is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with RTAB-Map. If not, see <http://www.gnu.org/licenses/>.
*/
#include "ExportCloudsDialog.h"
#include "ui_exportCloudsDialog.h"
#include <QtGui/QFileDialog>
namespace rtabmap {
ExportCloudsDialog::ExportCloudsDialog(QWidget *parent, bool toSave) :
QDialog(parent)
{
_ui = new Ui_ExportCloudsDialog();
_ui->setupUi(this);
if(toSave)
{
_ui->buttonBox->setStandardButtons(QDialogButtonBox::Cancel|QDialogButtonBox::Save);
}
}
ExportCloudsDialog::~ExportCloudsDialog()
{
delete _ui;
}
bool ExportCloudsDialog::getAssemble() const
{
return _ui->groupBox_assemble->isChecked();
}
double ExportCloudsDialog::getAssembleVoxel() const
{
return _ui->doubleSpinBox_voxelSize_assembled->value();
}
bool ExportCloudsDialog::getGenerate() const
{
return _ui->groupBox_regenerate->isChecked();
}
int ExportCloudsDialog::getGenerateDecimation() const
{
return _ui->spinBox_decimation->value();
}
double ExportCloudsDialog::getGenerateVoxel() const
{
return _ui->doubleSpinBox_voxelSize->value();
}
double ExportCloudsDialog::getGenerateMaxDepth() const
{
return _ui->doubleSpinBox_maxDepth->value();
}
bool ExportCloudsDialog::getMLS() const
{
return _ui->groupBox_mls->isChecked();
}
double ExportCloudsDialog::getMLSRadius() const
{
return _ui->doubleSpinBox_mlsRadius->value();
}
bool ExportCloudsDialog::getMesh() const
{
return _ui->groupBox_gp3->isChecked();
}
int ExportCloudsDialog::getMeshNormalKSearch() const
{
return _ui->spinBox_normalKSearch->value();
}
double ExportCloudsDialog::getMeshGp3Radius() const
{
return _ui->doubleSpinBox_gp3Radius->value();
}
}

View File

@@ -0,0 +1,56 @@
/*
* Copyright (C) 2010-2011, Mathieu Labbe and IntRoLab - Universite de Sherbrooke
*
* This file is part of RTAB-Map.
*
* RTAB-Map is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* RTAB-Map is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with RTAB-Map. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef EXPORTCLOUDSDIALOG_H_
#define EXPORTCLOUDSDIALOG_H_
#include <QtGui/QDialog>
class Ui_ExportCloudsDialog;
namespace rtabmap {
class ExportCloudsDialog : public QDialog
{
Q_OBJECT
public:
ExportCloudsDialog(QWidget *parent = 0, bool toSave = false);
virtual ~ExportCloudsDialog();
bool getAssemble() const;
double getAssembleVoxel() const;
bool getGenerate() const;
int getGenerateDecimation() const;
double getGenerateVoxel() const;
double getGenerateMaxDepth() const;
bool getMLS() const;
double getMLSRadius() const;
bool getMesh() const;
int getMeshNormalKSearch() const;
double getMeshGp3Radius() const;
private:
Ui_ExportCloudsDialog * _ui;
};
}
#endif /* EXPORTCLOUDSDIALOG_H_ */

View File

@@ -51,4 +51,4 @@ private:
}
#endif /* ABOUTDIALOG_H_ */
#endif /* EXPORTDIALOG_H_ */

File diff suppressed because it is too large Load Diff

View File

@@ -121,25 +121,21 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
connect(_ui->horizontalSlider_keypointsOpacity, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteGeneralPanel()));
// Cloud rendering panel
_3dRenderingShowClouds.resize(3);
_3dRenderingShowClouds.resize(2);
_3dRenderingShowClouds[0] = _ui->checkBox_showClouds;
_3dRenderingShowClouds[1] = _ui->checkBox_showOdomClouds;
_3dRenderingShowClouds[2] = _ui->checkBox_showSaveClouds;
_3dRenderingVoxelSize.resize(3);
_3dRenderingVoxelSize.resize(2);
_3dRenderingVoxelSize[0] = _ui->doubleSpinBox_voxelSize;
_3dRenderingVoxelSize[1] = _ui->doubleSpinBox_voxelSize_odom;
_3dRenderingVoxelSize[2] = _ui->doubleSpinBox_voxelSize_save;
_3dRenderingDecimation.resize(3);
_3dRenderingDecimation.resize(2);
_3dRenderingDecimation[0] = _ui->spinBox_decimation;
_3dRenderingDecimation[1] = _ui->spinBox_decimation_odom;
_3dRenderingDecimation[2] = _ui->spinBox_decimation_save;
_3dRenderingMaxDepth.resize(3);
_3dRenderingMaxDepth.resize(2);
_3dRenderingMaxDepth[0] = _ui->doubleSpinBox_maxDepth;
_3dRenderingMaxDepth[1] = _ui->doubleSpinBox_maxDepth_odom;
_3dRenderingMaxDepth[2] = _ui->doubleSpinBox_maxDepth_save;
_3dRenderingOpacity.resize(2);
_3dRenderingOpacity[0] = _ui->doubleSpinBox_opacity;
@@ -149,10 +145,9 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_3dRenderingPtSize[0] = _ui->spinBox_ptsize;
_3dRenderingPtSize[1] = _ui->spinBox_ptsize_odom;
_3dRenderingShowScans.resize(3);
_3dRenderingShowScans.resize(2);
_3dRenderingShowScans[0] = _ui->checkBox_showScans;
_3dRenderingShowScans[1] = _ui->checkBox_showOdomScans;
_3dRenderingShowScans[2] = _ui->checkBox_showSaveScans;
_3dRenderingOpacityScan.resize(2);
_3dRenderingOpacityScan[0] = _ui->doubleSpinBox_opacity_scan;
@@ -162,25 +157,7 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
_3dRenderingPtSizeScan[0] = _ui->spinBox_ptsize_scan;
_3dRenderingPtSizeScan[1] = _ui->spinBox_ptsize_odom_scan;
_3dRenderingMeshing.resize(1);
_3dRenderingMeshing[0] = _ui->checkBox_meshing;
_3dRenderingNormalKSearch.resize(2);
_3dRenderingNormalKSearch[0] = _ui->spinBox_normalKSearch;
_3dRenderingNormalKSearch[1] = _ui->spinBox_normalKSearch_save;
_3dRenderingGP3Radius.resize(2);
_3dRenderingGP3Radius[0] = _ui->doubleSpinBox_gp3Radius;
_3dRenderingGP3Radius[1] = _ui->doubleSpinBox_gp3Radius_save;
_3dRenderingSmoothing.resize(2);
_3dRenderingSmoothing[0] = _ui->checkBox_mls;
_3dRenderingSmoothingRadius.resize(2);
_3dRenderingSmoothingRadius[0] = _ui->doubleSpinBox_mlsRadius;
_3dRenderingSmoothingRadius[1] = _ui->doubleSpinBox_mlsRadius_save;
for(int i=0; i<3; ++i)
for(int i=0; i<2; ++i)
{
connect(_3dRenderingShowClouds[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingVoxelSize[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
@@ -188,24 +165,16 @@ PreferencesDialog::PreferencesDialog(QWidget * parent) :
connect(_3dRenderingMaxDepth[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingShowScans[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
if(i<2)
{
connect(_3dRenderingOpacity[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingPtSize[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingOpacityScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingPtSizeScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingNormalKSearch[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingGP3Radius[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingSmoothingRadius[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
}
if(i<1)
{
connect(_3dRenderingMeshing[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingSmoothing[i], SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
}
connect(_3dRenderingOpacity[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingPtSize[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingOpacityScan[i], SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_3dRenderingPtSizeScan[i], SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
}
connect(_ui->checkBox_meshing, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_ui->doubleSpinBox_gp3Radius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_ui->spinBox_normalKSearch, SIGNAL(valueChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_ui->checkBox_mls, SIGNAL(stateChanged(int)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_ui->doubleSpinBox_mlsRadius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_ui->groupBox_poseFiltering, SIGNAL(clicked(bool)), this, SLOT(makeObsoleteCloudRenderingPanel()));
connect(_ui->doubleSpinBox_cloudFilterRadius, SIGNAL(valueChanged(double)), this, SLOT(makeObsoleteCloudRenderingPanel()));
@@ -751,7 +720,7 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
}
else if(groupBox->objectName() == _ui->groupBox_cloudRendering1->objectName())
{
for(int i=0; i<3; ++i)
for(int i=0; i<2; ++i)
{
_3dRenderingShowClouds[i]->setChecked(true);
_3dRenderingVoxelSize[i]->setValue(i==2?0.005:0.00);
@@ -759,24 +728,16 @@ void PreferencesDialog::resetSettings(QGroupBox * groupBox)
_3dRenderingMaxDepth[i]->setValue(i==1?0.0:4.0);
_3dRenderingShowScans[i]->setChecked(true);
if(i<2)
{
_3dRenderingOpacity[i]->setValue(1.0);
_3dRenderingPtSize[i]->setValue(i==0?1:2);
_3dRenderingOpacityScan[i]->setValue(1.0);
_3dRenderingPtSizeScan[i]->setValue(1);
_3dRenderingNormalKSearch[i]->setValue(20);
_3dRenderingGP3Radius[i]->setValue(0.04);
_3dRenderingSmoothingRadius[i]->setValue(0.04);
}
if(i<1)
{
_3dRenderingMeshing[i]->setChecked(false);
_3dRenderingSmoothing[i]->setChecked(false);
}
_3dRenderingOpacity[i]->setValue(1.0);
_3dRenderingPtSize[i]->setValue(i==0?1:2);
_3dRenderingOpacityScan[i]->setValue(1.0);
_3dRenderingPtSizeScan[i]->setValue(1);
}
_ui->checkBox_meshing->setChecked(false);
_ui->doubleSpinBox_gp3Radius->setValue(0.04);
_ui->spinBox_normalKSearch->setValue(20);
_ui->checkBox_mls->setChecked(false);
_ui->doubleSpinBox_mlsRadius->setValue(0.04);
_ui->groupBox_poseFiltering->setChecked(false);
_ui->doubleSpinBox_cloudFilterRadius->setValue(0.1);
@@ -988,32 +949,24 @@ void PreferencesDialog::readGuiSettings(const QString & filePath)
_ui->checkBox_beep->setChecked(settings.value("beep", _ui->checkBox_beep->isChecked()).toBool());
_ui->horizontalSlider_keypointsOpacity->setValue(settings.value("keypointsOpacity", _ui->horizontalSlider_keypointsOpacity->value()).toInt());
for(int i=0; i<3; ++i)
for(int i=0; i<2; ++i)
{
_3dRenderingShowClouds[i]->setChecked(settings.value(tr("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked()).toBool());
_3dRenderingVoxelSize[i]->setValue(settings.value(tr("voxelSize%1").arg(i), _3dRenderingVoxelSize[i]->value()).toDouble());
_3dRenderingDecimation[i]->setValue(settings.value(tr("decimation%1").arg(i), _3dRenderingDecimation[i]->value()).toInt());
_3dRenderingMaxDepth[i]->setValue(settings.value(tr("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value()).toDouble());
_3dRenderingShowScans[i]->setChecked(settings.value(tr("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked()).toBool());
_3dRenderingShowClouds[i]->setChecked(settings.value(QString("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked()).toBool());
_3dRenderingVoxelSize[i]->setValue(settings.value(QString("voxelSize%1").arg(i), _3dRenderingVoxelSize[i]->value()).toDouble());
_3dRenderingDecimation[i]->setValue(settings.value(QString("decimation%1").arg(i), _3dRenderingDecimation[i]->value()).toInt());
_3dRenderingMaxDepth[i]->setValue(settings.value(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value()).toDouble());
_3dRenderingShowScans[i]->setChecked(settings.value(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked()).toBool());
if(i<2)
{
_3dRenderingOpacity[i]->setValue(settings.value(tr("opacity%1").arg(i), _3dRenderingOpacity[i]->value()).toDouble());
_3dRenderingPtSize[i]->setValue(settings.value(tr("ptSize%1").arg(i), _3dRenderingPtSize[i]->value()).toInt());
_3dRenderingOpacityScan[i]->setValue(settings.value(tr("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value()).toDouble());
_3dRenderingPtSizeScan[i]->setValue(settings.value(tr("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
_3dRenderingNormalKSearch[i]->setValue(settings.value(tr("meshNormalKSearch%1").arg(i), _3dRenderingNormalKSearch[i]->value()).toInt());
_3dRenderingGP3Radius[i]->setValue(settings.value(tr("meshGP3Radius%1").arg(i), _3dRenderingGP3Radius[i]->value()).toDouble());
_3dRenderingSmoothingRadius[i]->setValue(settings.value(tr("meshSmoothingRadius%1").arg(i), _3dRenderingSmoothingRadius[i]->value()).toDouble());
}
if(i<1)
{
_3dRenderingMeshing[i]->setChecked(settings.value(tr("meshing%1").arg(i), _3dRenderingMeshing[i]->isChecked()).toBool());
_3dRenderingSmoothing[i]->setChecked(settings.value(tr("meshSmoothing%1").arg(i), _3dRenderingSmoothing[i]->isChecked()).toBool());
}
_3dRenderingOpacity[i]->setValue(settings.value(QString("opacity%1").arg(i), _3dRenderingOpacity[i]->value()).toDouble());
_3dRenderingPtSize[i]->setValue(settings.value(QString("ptSize%1").arg(i), _3dRenderingPtSize[i]->value()).toInt());
_3dRenderingOpacityScan[i]->setValue(settings.value(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value()).toDouble());
_3dRenderingPtSizeScan[i]->setValue(settings.value(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value()).toInt());
}
_ui->checkBox_meshing->setChecked(settings.value("meshing", _ui->checkBox_meshing->isChecked()).toBool());
_ui->doubleSpinBox_gp3Radius->setValue(settings.value("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value()).toDouble());
_ui->spinBox_normalKSearch->setValue(settings.value("meshNormalKSearch", _ui->spinBox_normalKSearch->value()).toInt());
_ui->checkBox_mls->setChecked(settings.value("meshSmoothing", _ui->checkBox_mls->isChecked()).toBool());
_ui->doubleSpinBox_mlsRadius->setValue(settings.value("meshSmoothingRadius", _ui->doubleSpinBox_mlsRadius->value()).toDouble());
_ui->groupBox_poseFiltering->setChecked(settings.value("cloudFiltering", _ui->groupBox_poseFiltering->isChecked()).toBool());
_ui->doubleSpinBox_cloudFilterRadius->setValue(settings.value("cloudFilteringRadius", _ui->doubleSpinBox_cloudFilterRadius->value()).toDouble());
@@ -1202,32 +1155,25 @@ void PreferencesDialog::writeGuiSettings(const QString & filePath)
settings.setValue("beep", _ui->checkBox_beep->isChecked());
settings.setValue("keypointsOpacity", _ui->horizontalSlider_keypointsOpacity->value());
for(int i=0; i<3; ++i)
for(int i=0; i<2; ++i)
{
settings.setValue(tr("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked());
settings.setValue(tr("voxelSize%1").arg(i), _3dRenderingVoxelSize[i]->value());
settings.setValue(tr("decimation%1").arg(i), _3dRenderingDecimation[i]->value());
settings.setValue(tr("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value());
settings.setValue(tr("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked());
settings.setValue(QString("showClouds%1").arg(i), _3dRenderingShowClouds[i]->isChecked());
settings.setValue(QString("voxelSize%1").arg(i), _3dRenderingVoxelSize[i]->value());
settings.setValue(QString("decimation%1").arg(i), _3dRenderingDecimation[i]->value());
settings.setValue(QString("maxDepth%1").arg(i), _3dRenderingMaxDepth[i]->value());
settings.setValue(QString("showScans%1").arg(i), _3dRenderingShowScans[i]->isChecked());
if(i<2)
{
settings.setValue(tr("opacity%1").arg(i), _3dRenderingOpacity[i]->value());
settings.setValue(tr("ptSize%1").arg(i), _3dRenderingPtSize[i]->value());
settings.setValue(tr("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value());
settings.setValue(tr("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
settings.setValue(tr("meshNormalKSearch%1").arg(i), _3dRenderingNormalKSearch[i]->value());
settings.setValue(tr("meshGP3Radius%1").arg(i), _3dRenderingGP3Radius[i]->value());
settings.setValue(tr("meshSmoothingRadius%1").arg(i), _3dRenderingSmoothingRadius[i]->value());
}
if(i<1)
{
settings.setValue(tr("meshing%1").arg(i), _3dRenderingMeshing[i]->isChecked());
settings.setValue(tr("meshSmoothing%1").arg(i), _3dRenderingSmoothing[i]->isChecked());
}
settings.setValue(QString("opacity%1").arg(i), _3dRenderingOpacity[i]->value());
settings.setValue(QString("ptSize%1").arg(i), _3dRenderingPtSize[i]->value());
settings.setValue(QString("opacityScan%1").arg(i), _3dRenderingOpacityScan[i]->value());
settings.setValue(QString("ptSizeScan%1").arg(i), _3dRenderingPtSizeScan[i]->value());
}
settings.setValue("meshing", _ui->checkBox_meshing->isChecked());
settings.setValue("meshGP3Radius", _ui->doubleSpinBox_gp3Radius->value());
settings.setValue("meshNormalKSearch", _ui->spinBox_normalKSearch->value());
settings.setValue("meshSmoothing", _ui->checkBox_mls->isChecked());
settings.setValue("meshSmoothingRadius", _ui->doubleSpinBox_mlsRadius->value());
settings.setValue("cloudFiltering", _ui->groupBox_poseFiltering->isChecked());
settings.setValue("cloudFilteringRadius", _ui->doubleSpinBox_cloudFilterRadius->value());
settings.setValue("cloudFilteringAngle", _ui->doubleSpinBox_cloudFilterAngle->value());
@@ -2445,27 +2391,26 @@ int PreferencesDialog::getOdomQualityWarnThr() const
bool PreferencesDialog::isCloudsShown(int index) const
{
UASSERT(index >= 0 && index <= 2);
UASSERT(index >= 0 && index <= 1);
return _3dRenderingShowClouds[index]->isChecked();
}
bool PreferencesDialog::isCloudMeshing(int index) const
bool PreferencesDialog::isCloudMeshing() const
{
UASSERT(index == 0);
return _3dRenderingMeshing[index]->isChecked();
return _ui->checkBox_meshing->isChecked();
}
double PreferencesDialog::getCloudVoxelSize(int index) const
{
UASSERT(index >= 0 && index <= 2);
UASSERT(index >= 0 && index <= 1);
return _3dRenderingVoxelSize[index]->value();
}
int PreferencesDialog::getCloudDecimation(int index) const
{
UASSERT(index >= 0 && index <= 2);
UASSERT(index >= 0 && index <= 1);
return _3dRenderingDecimation[index]->value();
}
double PreferencesDialog::getCloudMaxDepth(int index) const
{
UASSERT(index >= 0 && index <= 2);
UASSERT(index >= 0 && index <= 1);
return _3dRenderingMaxDepth[index]->value();
}
double PreferencesDialog::getCloudOpacity(int index) const
@@ -2481,7 +2426,7 @@ int PreferencesDialog::getCloudPointSize(int index) const
bool PreferencesDialog::isScansShown(int index) const
{
UASSERT(index >= 0 && index <= 2);
UASSERT(index >= 0 && index <= 1);
return _3dRenderingShowScans[index]->isChecked();
}
double PreferencesDialog::getScanOpacity(int index) const
@@ -2494,25 +2439,21 @@ int PreferencesDialog::getScanPointSize(int index) const
UASSERT(index >= 0 && index <= 1);
return _3dRenderingPtSizeScan[index]->value();
}
int PreferencesDialog::getMeshNormalKSearch(int index) const
int PreferencesDialog::getMeshNormalKSearch() const
{
UASSERT(index >= 0 && index <= 1);
return _3dRenderingNormalKSearch[index]->value();
return _ui->spinBox_normalKSearch->value();
}
double PreferencesDialog::getMeshGP3Radius(int index) const
double PreferencesDialog::getMeshGP3Radius() const
{
UASSERT(index >= 0 && index <= 1);
return _3dRenderingGP3Radius[index]->value();
return _ui->doubleSpinBox_gp3Radius->value();
}
bool PreferencesDialog::getMeshSmoothing(int index) const
bool PreferencesDialog::getMeshSmoothing() const
{
UASSERT(index == 0);
return _3dRenderingSmoothing[index]->isChecked();
return _ui->checkBox_mls->isChecked();
}
double PreferencesDialog::getMeshSmoothingRadius(int index) const
double PreferencesDialog::getMeshSmoothingRadius() const
{
UASSERT(index >= 0 && index <= 1);
return _3dRenderingSmoothingRadius[index]->value();
return _ui->doubleSpinBox_mlsRadius->value();
}
bool PreferencesDialog::isCloudFiltering() const
{

View File

@@ -0,0 +1,342 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ExportCloudsDialog</class>
<widget class="QDialog" name="ExportCloudsDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>678</width>
<height>550</height>
</rect>
</property>
<property name="windowTitle">
<string>Export 3D clouds</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QGroupBox" name="groupBox_regenerate">
<property name="title">
<string>Regenerate clouds</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_3">
<item>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.005000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_107">
<property name="text">
<string>3D cloud voxel size.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QSpinBox" name="spinBox_decimation">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>32</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_108">
<property name="text">
<string>3D cloud decimation (1-2-4-8-...).</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>4.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_132">
<property name="text">
<string>3D cloud maximum depth (0 means no limit).</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_assemble">
<property name="title">
<string>Assemble clouds to a single output cloud</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QFormLayout" name="formLayout_3">
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize_assembled">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.005000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_109">
<property name="text">
<string>Voxel size.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_mls">
<property name="title">
<string>Mesh smoothing using Moving Least Squares algorithm (MLS)</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>WARNING: This adds significative time to process, though the clouds will be more smooth.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<layout class="QFormLayout" name="formLayout_4">
<item row="0" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_mlsRadius">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<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="0" column="1">
<widget class="QLabel" name="label_87">
<property name="text">
<string>MLS search radius: Set the sphere radius that is to be used for determining the k-nearest neighbors used for fitting.
Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_gp3">
<property name="title">
<string>Meshing using Greedy Projection Triangulation algorithm (GP3)</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
</property>
<layout class="QFormLayout" name="formLayout">
<property name="fieldGrowthPolicy">
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
</property>
<item row="0" column="0">
<widget class="QSpinBox" name="spinBox_normalKSearch">
<property name="minimum">
<number>0</number>
</property>
<property name="value">
<number>20</number>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="label_71">
<property name="text">
<string>Set the number of k nearest neighbors to use for the normal estimation to create the mesh. Not used when mesh smoothing (MLS) above is used.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_gp3Radius">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<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="1" column="1">
<widget class="QLabel" name="label_168">
<property name="text">
<string>Sphere radius that is to be used for determining the k-nearest neighbors used for triangulating (GP3).
Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="buttonBox">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>buttonBox</sender>
<signal>accepted()</signal>
<receiver>ExportCloudsDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>buttonBox</sender>
<signal>rejected()</signal>
<receiver>ExportCloudsDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>

View File

@@ -35,7 +35,7 @@
<string>File</string>
</property>
<addaction name="actionSave_point_cloud"/>
<addaction name="actionSave_mesh_ply_vtk_stl"/>
<addaction name="actionExport_2D_Grid_map_bmp_png"/>
<addaction name="separator"/>
<addaction name="actionExit"/>
</widget>
@@ -63,7 +63,6 @@
<addaction name="actionData_recorder"/>
<addaction name="separator"/>
<addaction name="actionView_high_res_point_cloud"/>
<addaction name="actionView_point_cloud_as_mesh"/>
</widget>
<widget class="QMenu" name="menu6">
<property name="title">
@@ -918,7 +917,7 @@
</action>
<action name="actionSave_point_cloud">
<property name="text">
<string>Export point clouds (*.pcd *.ply *.vtk)...</string>
<string>Export 3D clouds (*.pcd *.ply)...</string>
</property>
</action>
<action name="actionDownload_all_clouds">
@@ -964,17 +963,7 @@
</action>
<action name="actionView_high_res_point_cloud">
<property name="text">
<string>View high-res point clouds</string>
</property>
</action>
<action name="actionView_point_cloud_as_mesh">
<property name="text">
<string>View meshes</string>
</property>
</action>
<action name="actionSave_mesh_ply_vtk_stl">
<property name="text">
<string>Export meshes (*.ply *.vtk)...</string>
<string>View high-res point clouds...</string>
</property>
</action>
<action name="actionTrigger_a_new_map">
@@ -1050,6 +1039,11 @@
<string>Data recorder...</string>
</property>
</action>
<action name="actionExport_2D_Grid_map_bmp_png">
<property name="text">
<string>Export 2D grid map (*.bmp *.png)...</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>

View File

@@ -63,9 +63,9 @@
<property name="geometry">
<rect>
<x>0</x>
<y>-617</y>
<width>732</width>
<height>1198</height>
<y>-185</y>
<width>737</width>
<height>893</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_16">
@@ -86,7 +86,7 @@
<enum>QFrame::Raised</enum>
</property>
<property name="currentIndex">
<number>3</number>
<number>1</number>
</property>
<widget class="QWidget" name="page_22">
<layout class="QVBoxLayout" name="verticalLayout_29">
@@ -418,8 +418,18 @@ Show a yellow background when the number of odometry inliers goes under this thr
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,0,1">
<item row="3" column="3">
<layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,1">
<item row="9" column="0">
<widget class="QSpinBox" name="spinBox_ptsize_scan">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>64</number>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QLabel" name="label_108">
<property name="text">
<string>3D cloud decimation (1-2-4-8-...).</string>
@@ -455,20 +465,6 @@ Show a yellow background when the number of odometry inliers goes under this thr
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="label_159">
<property name="text">
<string>Exporting/
High-res view</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QCheckBox" name="checkBox_showClouds">
<property name="text">
@@ -490,16 +486,6 @@ High-res view</string>
</widget>
</item>
<item row="1" column="2">
<widget class="QCheckBox" name="checkBox_showSaveClouds">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QLabel" name="label_119">
<property name="text">
<string>Show 3D clouds.</string>
@@ -548,25 +534,6 @@ High-res view</string>
</widget>
</item>
<item row="2" column="2">
<widget class="QDoubleSpinBox" name="doubleSpinBox_voxelSize_save">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.010000000000000</double>
</property>
<property name="value">
<double>0.005000000000000</double>
</property>
</widget>
</item>
<item row="2" column="3">
<widget class="QLabel" name="label_107">
<property name="text">
<string>3D cloud voxel size.</string>
@@ -602,19 +569,6 @@ High-res view</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QSpinBox" name="spinBox_decimation_save">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>32</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth">
<property name="suffix">
@@ -654,25 +608,6 @@ High-res view</string>
</widget>
</item>
<item row="4" column="2">
<widget class="QDoubleSpinBox" name="doubleSpinBox_maxDepth_save">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>1</number>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="value">
<double>4.000000000000000</double>
</property>
</widget>
</item>
<item row="4" column="3">
<widget class="QLabel" name="label_132">
<property name="text">
<string>3D cloud maximum depth (0 means no limit).</string>
@@ -720,7 +655,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="5" column="3">
<item row="5" column="2">
<widget class="QLabel" name="label_155">
<property name="text">
<string>3D cloud opacity.</string>
@@ -750,7 +685,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="6" column="3">
<item row="6" column="2">
<widget class="QLabel" name="label_157">
<property name="text">
<string>3D cloud point size (1..64).</string>
@@ -781,16 +716,6 @@ High-res view</string>
</widget>
</item>
<item row="7" column="2">
<widget class="QCheckBox" name="checkBox_showSaveScans">
<property name="text">
<string/>
</property>
<property name="checked">
<bool>true</bool>
</property>
</widget>
</item>
<item row="7" column="3">
<widget class="QLabel" name="label_110">
<property name="text">
<string>Show 2D scans.</string>
@@ -845,7 +770,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="8" column="3">
<item row="8" column="2">
<widget class="QLabel" name="label_156">
<property name="text">
<string>2D scan opacity.</string>
@@ -855,16 +780,6 @@ High-res view</string>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QSpinBox" name="spinBox_ptsize_scan">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>64</number>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QSpinBox" name="spinBox_ptsize_odom_scan">
<property name="minimum">
@@ -875,7 +790,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="9" column="3">
<item row="9" column="2">
<widget class="QLabel" name="label_158">
<property name="text">
<string>2D scan point size (1..64).</string>
@@ -885,7 +800,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="12" column="3">
<item row="12" column="2">
<widget class="QLabel" name="label_168">
<property name="text">
<string>Sphere radius that is to be used for determining the k-nearest neighbors used for triangulating (GP3). Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
@@ -895,7 +810,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="14" column="3">
<item row="14" column="2">
<widget class="QLabel" name="label_85">
<property name="text">
<string>Mesh smoothing using Moving Least Squares algorithm (MLS).</string>
@@ -924,25 +839,6 @@ High-res view</string>
</property>
</widget>
</item>
<item row="12" column="2">
<widget class="QDoubleSpinBox" name="doubleSpinBox_gp3Radius_save">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<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="15" column="0">
<widget class="QDoubleSpinBox" name="doubleSpinBox_mlsRadius">
<property name="suffix">
@@ -962,7 +858,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="10" column="3">
<item row="10" column="2">
<widget class="QLabel" name="label_169">
<property name="text">
<string>Online meshing using Greedy Projection Triangulation (GP3).</string>
@@ -972,7 +868,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="15" column="3">
<item row="15" column="2">
<widget class="QLabel" name="label_87">
<property name="text">
<string>MLS search radius: Set the sphere radius that is to be used for determining the k-nearest neighbors used for fitting. Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
@@ -992,7 +888,7 @@ High-res view</string>
</property>
</widget>
</item>
<item row="11" column="3">
<item row="11" column="2">
<widget class="QLabel" name="label_71">
<property name="text">
<string>Set the number of k nearest neighbors to use for the normal estimation to create the mesh. Not used when mesh smoothing below is used.</string>
@@ -1009,35 +905,6 @@ High-res view</string>
</property>
</widget>
</item>
<item row="11" column="2">
<widget class="QSpinBox" name="spinBox_normalKSearch_save">
<property name="minimum">
<number>0</number>
</property>
<property name="value">
<number>20</number>
</property>
</widget>
</item>
<item row="15" column="2">
<widget class="QDoubleSpinBox" name="doubleSpinBox_mlsRadius_save">
<property name="suffix">
<string> m</string>
</property>
<property name="decimals">
<number>3</number>
</property>
<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>
</layout>
</widget>
</item>