mirror of
https://github.com/introlab/rtabmap.git
synced 2026-09-02 01:20:25 +08:00
Added Poisson surface reconstruction in export options
This commit is contained in:
@@ -675,11 +675,11 @@ pcl::TextureMesh::Ptr createTextureMesh(
|
|||||||
cv::Mat emptyImage;
|
cv::Mat emptyImage;
|
||||||
if(i>0)
|
if(i>0)
|
||||||
{
|
{
|
||||||
emptyImage = cv::Mat::zeros(cameras[i-1].height,cameras[i-1].width, CV_8UC1);
|
emptyImage = cv::Mat::ones(cameras[i-1].height,cameras[i-1].width, CV_8UC1)*255;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
emptyImage = cv::Mat::zeros(480, 640, CV_8UC1);
|
emptyImage = cv::Mat::ones(480, 640, CV_8UC1)*255;
|
||||||
}
|
}
|
||||||
cv::imwrite(mesh_material.tex_file, emptyImage);
|
cv::imwrite(mesh_material.tex_file, emptyImage);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
#include <pcl/io/vtk_io.h>
|
#include <pcl/io/vtk_io.h>
|
||||||
#include <pcl/io/obj_io.h>
|
#include <pcl/io/obj_io.h>
|
||||||
#include <pcl/pcl_config.h>
|
#include <pcl/pcl_config.h>
|
||||||
|
#include <pcl/surface/poisson.h>
|
||||||
|
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
@@ -77,6 +78,8 @@ ExportCloudsDialog::ExportCloudsDialog(QWidget *parent) :
|
|||||||
connect(_ui->spinBox_normalKSearch, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
connect(_ui->spinBox_normalKSearch, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->comboBox_pipeline, SIGNAL(currentIndexChanged(int)), this, SIGNAL(configChanged()));
|
connect(_ui->comboBox_pipeline, SIGNAL(currentIndexChanged(int)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->comboBox_pipeline, SIGNAL(currentIndexChanged(int)), this, SLOT(updateReconstructionFlavor()));
|
connect(_ui->comboBox_pipeline, SIGNAL(currentIndexChanged(int)), this, SLOT(updateReconstructionFlavor()));
|
||||||
|
connect(_ui->comboBox_meshingApproach, SIGNAL(currentIndexChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->comboBox_meshingApproach, SIGNAL(currentIndexChanged(int)), this, SLOT(updateDenseReconstruction()));
|
||||||
|
|
||||||
connect(_ui->groupBox_regenerate, SIGNAL(clicked(bool)), this, SIGNAL(configChanged()));
|
connect(_ui->groupBox_regenerate, SIGNAL(clicked(bool)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->spinBox_decimation, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
connect(_ui->spinBox_decimation, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
@@ -125,9 +128,20 @@ ExportCloudsDialog::ExportCloudsDialog(QWidget *parent) :
|
|||||||
connect(_ui->doubleSpinBox_gp3Radius, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
connect(_ui->doubleSpinBox_gp3Radius, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->doubleSpinBox_gp3Mu, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
connect(_ui->doubleSpinBox_gp3Mu, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->doubleSpinBox_meshDecimationFactor, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
connect(_ui->doubleSpinBox_meshDecimationFactor, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->doubleSpinBox_transferColorRadius, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->checkBox_textureMapping, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged()));
|
connect(_ui->checkBox_textureMapping, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged()));
|
||||||
connect(_ui->checkBox_textureMapping, SIGNAL(stateChanged(int)), this, SLOT(updateTexturingAvailability()));
|
connect(_ui->checkBox_textureMapping, SIGNAL(stateChanged(int)), this, SLOT(updateTexturingAvailability()));
|
||||||
|
|
||||||
|
connect(_ui->checkBox_poisson_outputPolygons, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->checkBox_poisson_manifold, SIGNAL(stateChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->spinBox_poisson_depth, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->spinBox_poisson_iso, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->spinBox_poisson_solver, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->spinBox_poisson_minDepth, SIGNAL(valueChanged(int)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->doubleSpinBox_poisson_samples, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->doubleSpinBox_poisson_pointWeight, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
|
connect(_ui->doubleSpinBox_poisson_scale, SIGNAL(valueChanged(double)), this, SIGNAL(configChanged()));
|
||||||
|
|
||||||
_progressDialog = new ProgressDialog(this);
|
_progressDialog = new ProgressDialog(this);
|
||||||
_progressDialog->setVisible(false);
|
_progressDialog->setVisible(false);
|
||||||
_progressDialog->setAutoClose(true, 2);
|
_progressDialog->setAutoClose(true, 2);
|
||||||
@@ -161,8 +175,8 @@ void ExportCloudsDialog::updateTexturingAvailability(bool isExporting)
|
|||||||
{
|
{
|
||||||
_ui->checkBox_textureMapping->setEnabled(!_ui->checkBox_assemble->isChecked() || isExporting);
|
_ui->checkBox_textureMapping->setEnabled(!_ui->checkBox_assemble->isChecked() || isExporting);
|
||||||
_ui->label_textureMapping->setEnabled(_ui->checkBox_textureMapping->isEnabled());
|
_ui->label_textureMapping->setEnabled(_ui->checkBox_textureMapping->isEnabled());
|
||||||
_ui->doubleSpinBox_meshDecimationFactor->setEnabled(!_ui->checkBox_textureMapping->isEnabled() || !_ui->checkBox_textureMapping->isChecked() || _ui->comboBox_pipeline->currentIndex() == 1);
|
_ui->comboBox_meshingApproach->setCurrentIndex(_ui->checkBox_assemble->isChecked()?1:0);
|
||||||
_ui->label_meshDecimation->setEnabled(_ui->doubleSpinBox_meshDecimationFactor->isEnabled());
|
_ui->comboBox_meshingApproach->setItemData(1, _ui->checkBox_assemble->isChecked()?1 | 32:0,Qt::UserRole - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportCloudsDialog::cancel()
|
void ExportCloudsDialog::cancel()
|
||||||
@@ -224,14 +238,27 @@ void ExportCloudsDialog::saveSettings(QSettings & settings, const QString & grou
|
|||||||
settings.setValue("mesh_radius", _ui->doubleSpinBox_gp3Radius->value());
|
settings.setValue("mesh_radius", _ui->doubleSpinBox_gp3Radius->value());
|
||||||
settings.setValue("mesh_mu", _ui->doubleSpinBox_gp3Mu->value());
|
settings.setValue("mesh_mu", _ui->doubleSpinBox_gp3Mu->value());
|
||||||
settings.setValue("mesh_decimation_factor", _ui->doubleSpinBox_meshDecimationFactor->value());
|
settings.setValue("mesh_decimation_factor", _ui->doubleSpinBox_meshDecimationFactor->value());
|
||||||
|
settings.setValue("mesh_color_radius", _ui->doubleSpinBox_transferColorRadius->value());
|
||||||
settings.setValue("mesh_min_cluster_size", _ui->spinBox_mesh_minClusterSize->value());
|
settings.setValue("mesh_min_cluster_size", _ui->spinBox_mesh_minClusterSize->value());
|
||||||
|
|
||||||
|
settings.setValue("mesh_dense_strategy", _ui->comboBox_meshingApproach->currentIndex());
|
||||||
|
|
||||||
settings.setValue("mesh_texture", _ui->checkBox_textureMapping->isChecked());
|
settings.setValue("mesh_texture", _ui->checkBox_textureMapping->isChecked());
|
||||||
|
|
||||||
settings.setValue("mesh_angle_tolerance", _ui->doubleSpinBox_mesh_angleTolerance->value());
|
settings.setValue("mesh_angle_tolerance", _ui->doubleSpinBox_mesh_angleTolerance->value());
|
||||||
settings.setValue("mesh_quad", _ui->checkBox_mesh_quad->isChecked());
|
settings.setValue("mesh_quad", _ui->checkBox_mesh_quad->isChecked());
|
||||||
settings.setValue("mesh_triangle_size", _ui->spinBox_mesh_triangleSize->value());
|
settings.setValue("mesh_triangle_size", _ui->spinBox_mesh_triangleSize->value());
|
||||||
|
|
||||||
|
settings.setValue("poisson_outputPolygons", _ui->checkBox_poisson_outputPolygons->isChecked());
|
||||||
|
settings.setValue("poisson_manifold", _ui->checkBox_poisson_manifold->isChecked());
|
||||||
|
settings.setValue("poisson_depth", _ui->spinBox_poisson_depth->value());
|
||||||
|
settings.setValue("poisson_iso", _ui->spinBox_poisson_iso->value());
|
||||||
|
settings.setValue("poisson_solver", _ui->spinBox_poisson_solver->value());
|
||||||
|
settings.setValue("poisson_minDepth", _ui->spinBox_poisson_minDepth->value());
|
||||||
|
settings.setValue("poisson_samples", _ui->doubleSpinBox_poisson_samples->value());
|
||||||
|
settings.setValue("poisson_pointWeight", _ui->doubleSpinBox_poisson_pointWeight->value());
|
||||||
|
settings.setValue("poisson_scale", _ui->doubleSpinBox_poisson_scale->value());
|
||||||
|
|
||||||
if(!group.isEmpty())
|
if(!group.isEmpty())
|
||||||
{
|
{
|
||||||
settings.endGroup();
|
settings.endGroup();
|
||||||
@@ -292,14 +319,27 @@ void ExportCloudsDialog::loadSettings(QSettings & settings, const QString & grou
|
|||||||
_ui->doubleSpinBox_gp3Radius->setValue(settings.value("mesh_radius", _ui->doubleSpinBox_gp3Radius->value()).toDouble());
|
_ui->doubleSpinBox_gp3Radius->setValue(settings.value("mesh_radius", _ui->doubleSpinBox_gp3Radius->value()).toDouble());
|
||||||
_ui->doubleSpinBox_gp3Mu->setValue(settings.value("mesh_mu", _ui->doubleSpinBox_gp3Mu->value()).toDouble());
|
_ui->doubleSpinBox_gp3Mu->setValue(settings.value("mesh_mu", _ui->doubleSpinBox_gp3Mu->value()).toDouble());
|
||||||
_ui->doubleSpinBox_meshDecimationFactor->setValue(settings.value("mesh_decimation_factor",_ui->doubleSpinBox_meshDecimationFactor->value()).toDouble());
|
_ui->doubleSpinBox_meshDecimationFactor->setValue(settings.value("mesh_decimation_factor",_ui->doubleSpinBox_meshDecimationFactor->value()).toDouble());
|
||||||
|
_ui->doubleSpinBox_transferColorRadius->setValue(settings.value("mesh_color_radius",_ui->doubleSpinBox_transferColorRadius->value()).toDouble());
|
||||||
_ui->spinBox_mesh_minClusterSize->setValue(settings.value("mesh_min_cluster_size", _ui->spinBox_mesh_minClusterSize->value()).toInt());
|
_ui->spinBox_mesh_minClusterSize->setValue(settings.value("mesh_min_cluster_size", _ui->spinBox_mesh_minClusterSize->value()).toInt());
|
||||||
|
|
||||||
|
_ui->comboBox_meshingApproach->setCurrentIndex(settings.value("mesh_dense_strategy", _ui->comboBox_meshingApproach->currentIndex()).toInt());
|
||||||
|
|
||||||
_ui->checkBox_textureMapping->setChecked(settings.value("mesh_texture", _ui->checkBox_textureMapping->isChecked()).toBool());
|
_ui->checkBox_textureMapping->setChecked(settings.value("mesh_texture", _ui->checkBox_textureMapping->isChecked()).toBool());
|
||||||
|
|
||||||
_ui->doubleSpinBox_mesh_angleTolerance->setValue(settings.value("mesh_angle_tolerance", _ui->doubleSpinBox_mesh_angleTolerance->value()).toDouble());
|
_ui->doubleSpinBox_mesh_angleTolerance->setValue(settings.value("mesh_angle_tolerance", _ui->doubleSpinBox_mesh_angleTolerance->value()).toDouble());
|
||||||
_ui->checkBox_mesh_quad->setChecked(settings.value("mesh_quad", _ui->checkBox_mesh_quad->isChecked()).toBool());
|
_ui->checkBox_mesh_quad->setChecked(settings.value("mesh_quad", _ui->checkBox_mesh_quad->isChecked()).toBool());
|
||||||
_ui->spinBox_mesh_triangleSize->setValue(settings.value("mesh_triangle_size", _ui->spinBox_mesh_triangleSize->value()).toInt());
|
_ui->spinBox_mesh_triangleSize->setValue(settings.value("mesh_triangle_size", _ui->spinBox_mesh_triangleSize->value()).toInt());
|
||||||
|
|
||||||
|
_ui->checkBox_poisson_outputPolygons->setChecked(settings.value("poisson_outputPolygons", _ui->checkBox_poisson_outputPolygons->isChecked()).toBool());
|
||||||
|
_ui->checkBox_poisson_manifold->setChecked(settings.value("poisson_manifold", _ui->checkBox_poisson_manifold->isChecked()).toBool());
|
||||||
|
_ui->spinBox_poisson_depth->setValue(settings.value("poisson_depth", _ui->spinBox_poisson_depth->value()).toInt());
|
||||||
|
_ui->spinBox_poisson_iso->setValue(settings.value("poisson_iso", _ui->spinBox_poisson_iso->value()).toInt());
|
||||||
|
_ui->spinBox_poisson_solver->setValue(settings.value("poisson_solver", _ui->spinBox_poisson_solver->value()).toInt());
|
||||||
|
_ui->spinBox_poisson_minDepth->setValue(settings.value("poisson_minDepth", _ui->spinBox_poisson_minDepth->value()).toInt());
|
||||||
|
_ui->doubleSpinBox_poisson_samples->setValue(settings.value("poisson_samples", _ui->doubleSpinBox_poisson_samples->value()).toDouble());
|
||||||
|
_ui->doubleSpinBox_poisson_pointWeight->setValue(settings.value("poisson_pointWeight", _ui->doubleSpinBox_poisson_pointWeight->value()).toDouble());
|
||||||
|
_ui->doubleSpinBox_poisson_scale->setValue(settings.value("poisson_scale", _ui->doubleSpinBox_poisson_scale->value()).toDouble());
|
||||||
|
|
||||||
updateReconstructionFlavor();
|
updateReconstructionFlavor();
|
||||||
updateTexturingAvailability();
|
updateTexturingAvailability();
|
||||||
updateMLSGrpVisibility();
|
updateMLSGrpVisibility();
|
||||||
@@ -359,6 +399,9 @@ void ExportCloudsDialog::restoreDefaults()
|
|||||||
_ui->doubleSpinBox_gp3Radius->setValue(0.04);
|
_ui->doubleSpinBox_gp3Radius->setValue(0.04);
|
||||||
_ui->doubleSpinBox_gp3Mu->setValue(2.5);
|
_ui->doubleSpinBox_gp3Mu->setValue(2.5);
|
||||||
_ui->doubleSpinBox_meshDecimationFactor->setValue(0.0);
|
_ui->doubleSpinBox_meshDecimationFactor->setValue(0.0);
|
||||||
|
_ui->doubleSpinBox_transferColorRadius->setValue(0.05);
|
||||||
|
|
||||||
|
_ui->comboBox_meshingApproach->setCurrentIndex(1);
|
||||||
|
|
||||||
_ui->checkBox_textureMapping->setChecked(false);
|
_ui->checkBox_textureMapping->setChecked(false);
|
||||||
|
|
||||||
@@ -366,6 +409,16 @@ void ExportCloudsDialog::restoreDefaults()
|
|||||||
_ui->checkBox_mesh_quad->setChecked(false);
|
_ui->checkBox_mesh_quad->setChecked(false);
|
||||||
_ui->spinBox_mesh_triangleSize->setValue(1);
|
_ui->spinBox_mesh_triangleSize->setValue(1);
|
||||||
|
|
||||||
|
_ui->checkBox_poisson_outputPolygons->setChecked(false);
|
||||||
|
_ui->checkBox_poisson_manifold->setChecked(true);
|
||||||
|
_ui->spinBox_poisson_depth->setValue(9);
|
||||||
|
_ui->spinBox_poisson_iso->setValue(8);
|
||||||
|
_ui->spinBox_poisson_solver->setValue(8);
|
||||||
|
_ui->spinBox_poisson_minDepth->setValue(5);
|
||||||
|
_ui->doubleSpinBox_poisson_samples->setValue(1.0);
|
||||||
|
_ui->doubleSpinBox_poisson_pointWeight->setValue(4.0);
|
||||||
|
_ui->doubleSpinBox_poisson_scale->setValue(1.1);
|
||||||
|
|
||||||
updateReconstructionFlavor();
|
updateReconstructionFlavor();
|
||||||
updateTexturingAvailability();
|
updateTexturingAvailability();
|
||||||
updateMLSGrpVisibility();
|
updateMLSGrpVisibility();
|
||||||
@@ -377,8 +430,16 @@ void ExportCloudsDialog::updateReconstructionFlavor()
|
|||||||
{
|
{
|
||||||
_ui->groupBox_mls->setVisible(_ui->comboBox_pipeline->currentIndex() == 1);
|
_ui->groupBox_mls->setVisible(_ui->comboBox_pipeline->currentIndex() == 1);
|
||||||
_ui->groupBox_mls->setEnabled(_ui->comboBox_pipeline->currentIndex() == 1);
|
_ui->groupBox_mls->setEnabled(_ui->comboBox_pipeline->currentIndex() == 1);
|
||||||
_ui->groupBox_gp3->setVisible(_ui->comboBox_pipeline->currentIndex() == 1);
|
_ui->comboBox_meshingApproach->setEnabled(_ui->comboBox_pipeline->currentIndex() == 1);
|
||||||
|
_ui->label_denseReconstruction->setEnabled(_ui->comboBox_pipeline->currentIndex() == 1);
|
||||||
_ui->groupBox_organized->setVisible(_ui->comboBox_pipeline->currentIndex() == 0);
|
_ui->groupBox_organized->setVisible(_ui->comboBox_pipeline->currentIndex() == 0);
|
||||||
|
updateDenseReconstruction();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ExportCloudsDialog::updateDenseReconstruction()
|
||||||
|
{
|
||||||
|
_ui->groupBox_gp3->setVisible(_ui->comboBox_pipeline->currentIndex() == 1 && _ui->comboBox_meshingApproach->currentIndex()==0);
|
||||||
|
_ui->groupBox_poisson->setVisible(_ui->comboBox_pipeline->currentIndex() == 1 && _ui->comboBox_meshingApproach->currentIndex()==1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ExportCloudsDialog::selectDistortionModel()
|
void ExportCloudsDialog::selectDistortionModel()
|
||||||
@@ -535,6 +596,8 @@ void ExportCloudsDialog::viewClouds(
|
|||||||
{
|
{
|
||||||
viewer->setBackfaceCulling(true, false);
|
viewer->setBackfaceCulling(true, false);
|
||||||
}
|
}
|
||||||
|
viewer->setLighting(true);
|
||||||
|
viewer->setBackgroundColor(Qt::darkGray);
|
||||||
|
|
||||||
QVBoxLayout *layout = new QVBoxLayout();
|
QVBoxLayout *layout = new QVBoxLayout();
|
||||||
layout->addWidget(viewer);
|
layout->addWidget(viewer);
|
||||||
@@ -618,6 +681,7 @@ void ExportCloudsDialog::viewClouds(
|
|||||||
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
color = (Qt::GlobalColor)(mapId % 12 + 7 );
|
||||||
}
|
}
|
||||||
viewer->addCloud(uFormat("cloud%d",iter->first), iter->second, iter->first>0?poses.at(iter->first):Transform::getIdentity());
|
viewer->addCloud(uFormat("cloud%d",iter->first), iter->second, iter->first>0?poses.at(iter->first):Transform::getIdentity());
|
||||||
|
viewer->setCloudPointSize(uFormat("cloud%d",iter->first), 2);
|
||||||
_progressDialog->appendText(tr("Viewing the cloud %1 (%2 points)... done.").arg(iter->first).arg(iter->second->size()));
|
_progressDialog->appendText(tr("Viewing the cloud %1 (%2 points)... done.").arg(iter->first).arg(iter->second->size()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1047,8 +1111,53 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
_ui->doubleSpinBox_meshDecimationFactor->value() > 0.0)
|
_ui->doubleSpinBox_meshDecimationFactor->value() > 0.0)
|
||||||
{
|
{
|
||||||
int count = mesh->polygons.size();
|
int count = mesh->polygons.size();
|
||||||
|
_progressDialog->appendText(tr("Mesh decimation (factor=%1) from %2 polygons...").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count));
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
mesh = util3d::meshDecimation(mesh, (float)_ui->doubleSpinBox_meshDecimationFactor->value());
|
mesh = util3d::meshDecimation(mesh, (float)_ui->doubleSpinBox_meshDecimationFactor->value());
|
||||||
_progressDialog->appendText(tr("Mesh decimation (factor=%1) from %2 to %3 polygons").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count).arg(mesh->polygons.size()));
|
_progressDialog->appendText(tr("Mesh decimated (factor=%1) from %2 to %3 polygons").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count).arg(mesh->polygons.size()));
|
||||||
|
if(count < mesh->polygons.size())
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Decimated mesh %1 has more polygons than before!").arg(iter->first), Qt::darkYellow);
|
||||||
|
_progressDialog->setAutoClose(false);
|
||||||
|
}
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
|
if(_ui->doubleSpinBox_transferColorRadius->value() > 0.0 &&
|
||||||
|
(!_ui->checkBox_textureMapping->isEnabled() || !_ui->checkBox_textureMapping->isChecked()))
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Transfering color from point cloud to mesh..."));
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
|
// transfer color from point cloud to mesh
|
||||||
|
pcl::search::KdTree<pcl::PointXYZRGBNormal>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGBNormal>(true));
|
||||||
|
tree->setInputCloud(denseCloud);
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr coloredCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
|
||||||
|
pcl::fromPCLPointCloud2(mesh->cloud, *coloredCloud);
|
||||||
|
for(unsigned int i=0; i<coloredCloud->size(); ++i)
|
||||||
|
{
|
||||||
|
std::vector<int> kIndices;
|
||||||
|
std::vector<float> kDistances;
|
||||||
|
pcl::PointXYZRGBNormal pt;
|
||||||
|
pt.x = coloredCloud->at(i).x;
|
||||||
|
pt.y = coloredCloud->at(i).y;
|
||||||
|
pt.z = coloredCloud->at(i).z;
|
||||||
|
tree->radiusSearch(pt, _ui->doubleSpinBox_transferColorRadius->value(), kIndices, kDistances);
|
||||||
|
if(kIndices.size())
|
||||||
|
{
|
||||||
|
coloredCloud->at(i).r = denseCloud->at(kIndices[0]).r;
|
||||||
|
coloredCloud->at(i).g = denseCloud->at(kIndices[0]).g;
|
||||||
|
coloredCloud->at(i).b = denseCloud->at(kIndices[0]).b;
|
||||||
|
coloredCloud->at(i).a = denseCloud->at(kIndices[0]).a;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//white
|
||||||
|
coloredCloud->at(i).r = coloredCloud->at(i).g = coloredCloud->at(i).b = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcl::toPCLPointCloud2(*coloredCloud, mesh->cloud);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -1125,8 +1234,53 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
_ui->doubleSpinBox_meshDecimationFactor->value() > 0.0)
|
_ui->doubleSpinBox_meshDecimationFactor->value() > 0.0)
|
||||||
{
|
{
|
||||||
int count = mesh->polygons.size();
|
int count = mesh->polygons.size();
|
||||||
|
_progressDialog->appendText(tr("Mesh decimation (factor=%1) from %2 polygons...").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count));
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
mesh = util3d::meshDecimation(mesh, (float)_ui->doubleSpinBox_meshDecimationFactor->value());
|
mesh = util3d::meshDecimation(mesh, (float)_ui->doubleSpinBox_meshDecimationFactor->value());
|
||||||
_progressDialog->appendText(tr("Assembled mesh decimation (factor=%1) from %2 to %3 polygons").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count).arg(mesh->polygons.size()));
|
_progressDialog->appendText(tr("Mesh decimated (factor=%1) from %2 to %3 polygons").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count).arg(mesh->polygons.size()));
|
||||||
|
if(count < mesh->polygons.size())
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Decimated mesh has more polygons than before!"), Qt::darkYellow);
|
||||||
|
_progressDialog->setAutoClose(false);
|
||||||
|
}
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
|
if(_ui->doubleSpinBox_transferColorRadius->value() > 0.0 &&
|
||||||
|
(!_ui->checkBox_textureMapping->isEnabled() || !_ui->checkBox_textureMapping->isChecked()))
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Transfering color from point cloud to mesh..."));
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
|
// transfer color from point cloud to mesh
|
||||||
|
pcl::search::KdTree<pcl::PointXYZRGBNormal>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGBNormal>(true));
|
||||||
|
tree->setInputCloud(mergedClouds);
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr coloredCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
|
||||||
|
pcl::fromPCLPointCloud2(mesh->cloud, *coloredCloud);
|
||||||
|
for(unsigned int i=0; i<coloredCloud->size(); ++i)
|
||||||
|
{
|
||||||
|
std::vector<int> kIndices;
|
||||||
|
std::vector<float> kDistances;
|
||||||
|
pcl::PointXYZRGBNormal pt;
|
||||||
|
pt.x = coloredCloud->at(i).x;
|
||||||
|
pt.y = coloredCloud->at(i).y;
|
||||||
|
pt.z = coloredCloud->at(i).z;
|
||||||
|
tree->radiusSearch(pt, _ui->doubleSpinBox_transferColorRadius->value(), kIndices, kDistances);
|
||||||
|
if(kIndices.size())
|
||||||
|
{
|
||||||
|
coloredCloud->at(i).r = mergedClouds->at(kIndices[0]).r;
|
||||||
|
coloredCloud->at(i).g = mergedClouds->at(kIndices[0]).g;
|
||||||
|
coloredCloud->at(i).b = mergedClouds->at(kIndices[0]).b;
|
||||||
|
coloredCloud->at(i).a = mergedClouds->at(kIndices[0]).a;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//white
|
||||||
|
coloredCloud->at(i).r = coloredCloud->at(i).g = coloredCloud->at(i).b = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcl::toPCLPointCloud2(*coloredCloud, mesh->cloud);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
meshes.insert(std::make_pair(0, mesh));
|
meshes.insert(std::make_pair(0, mesh));
|
||||||
@@ -1137,7 +1291,14 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
_progressDialog->appendText(tr("Greedy projection triangulation... [radius=%1m]").arg(_ui->doubleSpinBox_gp3Radius->value()));
|
if(_ui->comboBox_meshingApproach->currentIndex() == 0)
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Greedy projection triangulation... [radius=%1m]").arg(_ui->doubleSpinBox_gp3Radius->value()));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Poisson surface reconstruction..."));
|
||||||
|
}
|
||||||
QApplication::processEvents();
|
QApplication::processEvents();
|
||||||
QApplication::processEvents();
|
QApplication::processEvents();
|
||||||
|
|
||||||
@@ -1146,10 +1307,32 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
iter!= cloudsWithNormals.end();
|
iter!= cloudsWithNormals.end();
|
||||||
++iter)
|
++iter)
|
||||||
{
|
{
|
||||||
pcl::PolygonMesh::Ptr mesh = util3d::createMesh(
|
bool lostColors = false;
|
||||||
iter->second,
|
pcl::PolygonMesh::Ptr mesh(new pcl::PolygonMesh);
|
||||||
_ui->doubleSpinBox_gp3Radius->value(),
|
if(_ui->comboBox_meshingApproach->currentIndex() == 0)
|
||||||
_ui->doubleSpinBox_gp3Mu->value());
|
{
|
||||||
|
mesh = util3d::createMesh(
|
||||||
|
iter->second,
|
||||||
|
_ui->doubleSpinBox_gp3Radius->value(),
|
||||||
|
_ui->doubleSpinBox_gp3Mu->value());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pcl::Poisson<pcl::PointXYZRGBNormal> poisson;
|
||||||
|
poisson.setOutputPolygons(_ui->checkBox_poisson_outputPolygons->isChecked());
|
||||||
|
poisson.setManifold(_ui->checkBox_poisson_manifold->isChecked());
|
||||||
|
poisson.setSamplesPerNode(_ui->doubleSpinBox_poisson_samples->value());
|
||||||
|
poisson.setDepth(_ui->spinBox_poisson_depth->value());
|
||||||
|
poisson.setIsoDivide(_ui->spinBox_poisson_iso->value());
|
||||||
|
poisson.setSolverDivide(_ui->spinBox_poisson_solver->value());
|
||||||
|
poisson.setMinDepth(_ui->spinBox_poisson_minDepth->value());
|
||||||
|
poisson.setPointWeight(_ui->doubleSpinBox_poisson_pointWeight->value());
|
||||||
|
poisson.setScale(_ui->doubleSpinBox_poisson_scale->value());
|
||||||
|
poisson.setInputCloud(iter->second);
|
||||||
|
poisson.reconstruct(*mesh);
|
||||||
|
|
||||||
|
lostColors = true;
|
||||||
|
}
|
||||||
|
|
||||||
if(_ui->spinBox_mesh_minClusterSize->value())
|
if(_ui->spinBox_mesh_minClusterSize->value())
|
||||||
{
|
{
|
||||||
@@ -1183,8 +1366,55 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
_ui->doubleSpinBox_meshDecimationFactor->value() > 0.0)
|
_ui->doubleSpinBox_meshDecimationFactor->value() > 0.0)
|
||||||
{
|
{
|
||||||
int count = mesh->polygons.size();
|
int count = mesh->polygons.size();
|
||||||
|
_progressDialog->appendText(tr("Mesh decimation (factor=%1) from %2 polygons...").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count));
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
mesh = util3d::meshDecimation(mesh, (float)_ui->doubleSpinBox_meshDecimationFactor->value());
|
mesh = util3d::meshDecimation(mesh, (float)_ui->doubleSpinBox_meshDecimationFactor->value());
|
||||||
_progressDialog->appendText(tr("Assembled mesh decimation (factor=%1) from %2 to %3 polygons").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count).arg(mesh->polygons.size()));
|
_progressDialog->appendText(tr("Mesh decimated (factor=%1) from %2 to %3 polygons").arg(_ui->doubleSpinBox_meshDecimationFactor->value()).arg(count).arg(mesh->polygons.size()));
|
||||||
|
if(count < mesh->polygons.size())
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Decimated mesh %1 has more polygons than before!").arg(iter->first), Qt::darkYellow);
|
||||||
|
_progressDialog->setAutoClose(false);
|
||||||
|
}
|
||||||
|
QApplication::processEvents();
|
||||||
|
lostColors = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(lostColors &&
|
||||||
|
_ui->doubleSpinBox_transferColorRadius->value() > 0.0 &&
|
||||||
|
(!_ui->checkBox_textureMapping->isEnabled() || !_ui->checkBox_textureMapping->isChecked()))
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Transfering color from point cloud to mesh..."));
|
||||||
|
QApplication::processEvents();
|
||||||
|
|
||||||
|
// transfer color from point cloud to mesh
|
||||||
|
pcl::search::KdTree<pcl::PointXYZRGBNormal>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGBNormal>(true));
|
||||||
|
tree->setInputCloud(iter->second);
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGB>::Ptr coloredCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
|
||||||
|
pcl::fromPCLPointCloud2(mesh->cloud, *coloredCloud);
|
||||||
|
for(unsigned int i=0; i<coloredCloud->size(); ++i)
|
||||||
|
{
|
||||||
|
std::vector<int> kIndices;
|
||||||
|
std::vector<float> kDistances;
|
||||||
|
pcl::PointXYZRGBNormal pt;
|
||||||
|
pt.x = coloredCloud->at(i).x;
|
||||||
|
pt.y = coloredCloud->at(i).y;
|
||||||
|
pt.z = coloredCloud->at(i).z;
|
||||||
|
tree->radiusSearch(pt, _ui->doubleSpinBox_transferColorRadius->value(), kIndices, kDistances);
|
||||||
|
if(kIndices.size())
|
||||||
|
{
|
||||||
|
coloredCloud->at(i).r = iter->second->at(kIndices[0]).r;
|
||||||
|
coloredCloud->at(i).g = iter->second->at(kIndices[0]).g;
|
||||||
|
coloredCloud->at(i).b = iter->second->at(kIndices[0]).b;
|
||||||
|
coloredCloud->at(i).a = iter->second->at(kIndices[0]).a;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//white
|
||||||
|
coloredCloud->at(i).r = coloredCloud->at(i).g = coloredCloud->at(i).b = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pcl::toPCLPointCloud2(*coloredCloud, mesh->cloud);
|
||||||
}
|
}
|
||||||
|
|
||||||
meshes.insert(std::make_pair(iter->first, mesh));
|
meshes.insert(std::make_pair(iter->first, mesh));
|
||||||
|
|||||||
@@ -87,6 +87,7 @@ public slots:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void updateReconstructionFlavor();
|
void updateReconstructionFlavor();
|
||||||
|
void updateDenseReconstruction();
|
||||||
void selectDistortionModel();
|
void selectDistortionModel();
|
||||||
void updateMLSGrpVisibility();
|
void updateMLSGrpVisibility();
|
||||||
void updateTexturingAvailability();
|
void updateTexturingAvailability();
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>814</width>
|
<width>814</width>
|
||||||
<height>667</height>
|
<height>680</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -23,9 +23,9 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-1311</y>
|
<y>-1525</y>
|
||||||
<width>773</width>
|
<width>773</width>
|
||||||
<height>1902</height>
|
<height>2568</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_13">
|
<layout class="QVBoxLayout" name="verticalLayout_13">
|
||||||
@@ -1052,7 +1052,7 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
|||||||
<layout class="QVBoxLayout" name="verticalLayout_15">
|
<layout class="QVBoxLayout" name="verticalLayout_15">
|
||||||
<item>
|
<item>
|
||||||
<layout class="QGridLayout" name="gridLayout_10" columnstretch="0,1">
|
<layout class="QGridLayout" name="gridLayout_10" columnstretch="0,1">
|
||||||
<item row="1" column="0">
|
<item row="2" column="0">
|
||||||
<widget class="QDoubleSpinBox" name="doubleSpinBox_meshDecimationFactor">
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_meshDecimationFactor">
|
||||||
<property name="decimals">
|
<property name="decimals">
|
||||||
<number>2</number>
|
<number>2</number>
|
||||||
@@ -1071,47 +1071,103 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="1">
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_textureMapping">
|
||||||
|
<property name="text">
|
||||||
|
<string>Texture mapping. Images of the cameras will be projected on the mesh(es). Output is a *.obj format. Only available on Export or when clouds are not assembled.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
<widget class="QLabel" name="label_16">
|
<widget class="QLabel" name="label_16">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Min polygon cluster size</string>
|
<string>Min polygon cluster size</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="3" column="0">
|
<item row="4" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_mesh_minClusterSize">
|
<widget class="QSpinBox" name="spinBox_mesh_minClusterSize">
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>999</number>
|
<number>999</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="1">
|
<item row="2" column="1">
|
||||||
<widget class="QLabel" name="label_meshDecimation">
|
<widget class="QLabel" name="label_meshDecimation">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Mesh quadric decimation factor (0=no decimation). Used to reduce the number of polygons. Cannot be used if texturing is on and organized mesh flavor is selected.</string>
|
<string>Mesh quadric decimation factor (0=no decimation). Used to reduce the number of polygons. Higher the factor, lower the output resolution (less polygons).</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QCheckBox" name="checkBox_textureMapping">
|
<widget class="QCheckBox" name="checkBox_textureMapping">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string/>
|
<string/>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QComboBox" name="comboBox_meshingApproach">
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Fast GP3</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<property name="text">
|
||||||
|
<string>Poisson</string>
|
||||||
|
</property>
|
||||||
|
</item>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item row="0" column="1">
|
<item row="0" column="1">
|
||||||
<widget class="QLabel" name="label_textureMapping">
|
<widget class="QLabel" name="label_denseReconstruction">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Texture mapping. Images of the cameras will be projected on the mesh(es). Output is a *.obj format.</string>
|
<string>Surface reconstruction approach. Can be used only when dense reconstruction flavor is selected. Poisson is available only when clouds are assembled.</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLabel" name="label_meshDecimation_2">
|
||||||
|
<property name="text">
|
||||||
|
<string>Radius used to transfer color from original cloud to resampled reconstructed surface (e.g., Poisson or mesh decimation). 0 means disabled.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_transferColorRadius">
|
||||||
|
<property name="suffix">
|
||||||
|
<string> m</string>
|
||||||
|
</property>
|
||||||
|
<property name="decimals">
|
||||||
|
<number>2</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>10.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="singleStep">
|
||||||
|
<double>0.010000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="value">
|
||||||
|
<double>0.050000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -1188,6 +1244,189 @@ Guidelines: 4 times the voxel size, 0.025 for voxel=0.</string>
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="groupBox_poisson">
|
||||||
|
<property name="title">
|
||||||
|
<string>Poisson Surface Reconstruction</string>
|
||||||
|
</property>
|
||||||
|
<property name="checkable">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>false</bool>
|
||||||
|
</property>
|
||||||
|
<layout class="QGridLayout" name="gridLayout_14" columnstretch="0,0">
|
||||||
|
<item row="0" column="1">
|
||||||
|
<widget class="QLabel" name="label_172">
|
||||||
|
<property name="text">
|
||||||
|
<string>Depth. Increasing the depth increase the output mesh size but it would be more precise (also longer to compute).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="1">
|
||||||
|
<widget class="QLabel" name="label_177">
|
||||||
|
<property name="text">
|
||||||
|
<string>Samples per node. Set the minimum number of sample points that should fall within an octree node as the octree construction is adapted to sampling density. Note for noise-free samples, small values in the range [1.0 - 5.0] can be used. For more noisy samples, larger values in the range [15.0 - 20.0] may be needed to provide a smoother, noise-reduced, reconstruction.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_poisson_iso">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="1">
|
||||||
|
<widget class="QLabel" name="label_176">
|
||||||
|
<property name="text">
|
||||||
|
<string>Manifold flag. Enabling this flag tells the reconstructor to add the polygon barycenter when triangulating polygons with more than three vertices.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="7" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_poisson_samples">
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>30.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_poisson_scale">
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>1.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
<property name="maximum">
|
||||||
|
<double>2.000000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="1">
|
||||||
|
<widget class="QLabel" name="label_181">
|
||||||
|
<property name="text">
|
||||||
|
<string>Point weight.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="1">
|
||||||
|
<widget class="QLabel" name="label_182">
|
||||||
|
<property name="text">
|
||||||
|
<string>Min depth.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_poisson_depth">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="8" column="1">
|
||||||
|
<widget class="QLabel" name="label_178">
|
||||||
|
<property name="text">
|
||||||
|
<string>Iso divide. Set the depth at which a block iso-surface extractor should be used to extract the iso-surface note Using this parameter helps reduce the memory overhead at the cost of a small increase in extraction time. (In practice, we have found that for reconstructions of depth 9 or higher a subdivide depth of 7 or 8 can greatly reduce the memory usage.)</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="1">
|
||||||
|
<widget class="QLabel" name="label_179">
|
||||||
|
<property name="text">
|
||||||
|
<string>Solver divide. Set the the depth at which a block Gauss-Seidel solver is used to solve the Laplacian equation. Note that using this parameter helps reduce the memory overhead at the cost of a small increase in reconstruction time. (In practice, we have found that for reconstructions of depth 9 or higher a subdivide depth of 7 or 8 can greatly reduce the memory usage.)</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="5" column="1">
|
||||||
|
<widget class="QLabel" name="label_180">
|
||||||
|
<property name="text">
|
||||||
|
<string>Scale. Set the ratio between the diameter of the cube used for reconstruction and the diameter of the samples' bounding cube.</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="2" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_poisson_manifold">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="9" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_poisson_solver">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="1">
|
||||||
|
<widget class="QLabel" name="label_173">
|
||||||
|
<property name="text">
|
||||||
|
<string>Output polygons flag. Enabling this flag tells the reconstructor to output a polygon mesh (rather than triangulating of the results of Marching Cubes).</string>
|
||||||
|
</property>
|
||||||
|
<property name="wordWrap">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="1" column="0">
|
||||||
|
<widget class="QCheckBox" name="checkBox_poisson_outputPolygons">
|
||||||
|
<property name="text">
|
||||||
|
<string/>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="3" column="0">
|
||||||
|
<widget class="QDoubleSpinBox" name="doubleSpinBox_poisson_pointWeight">
|
||||||
|
<property name="decimals">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
<property name="minimum">
|
||||||
|
<double>0.100000000000000</double>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item row="4" column="0">
|
||||||
|
<widget class="QSpinBox" name="spinBox_poisson_minDepth">
|
||||||
|
<property name="minimum">
|
||||||
|
<number>1</number>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QGroupBox" name="groupBox_organized">
|
<widget class="QGroupBox" name="groupBox_organized">
|
||||||
<property name="title">
|
<property name="title">
|
||||||
|
|||||||
Reference in New Issue
Block a user