mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 00:37:46 +08:00
Export: using color transfer radius to limit texturing far polygons from the orignal cloud
This commit is contained in:
@@ -437,7 +437,7 @@ void ExportCloudsDialog::restoreDefaults()
|
|||||||
_ui->doubleSpinBox_gp3Radius->setValue(0.2);
|
_ui->doubleSpinBox_gp3Radius->setValue(0.2);
|
||||||
_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.0);
|
_ui->doubleSpinBox_transferColorRadius->setValue(0.05);
|
||||||
_ui->checkBox_cleanMesh->setChecked(true);
|
_ui->checkBox_cleanMesh->setChecked(true);
|
||||||
_ui->spinBox_mesh_minClusterSize->setValue(0);
|
_ui->spinBox_mesh_minClusterSize->setValue(0);
|
||||||
|
|
||||||
@@ -1569,6 +1569,61 @@ bool ExportCloudsDialog::getExportedClouds(
|
|||||||
mesh->polygons = filteredPolygons;
|
mesh->polygons = filteredPolygons;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if(lostColors &&
|
||||||
|
_ui->doubleSpinBox_transferColorRadius->value() > 0.0 &&
|
||||||
|
_ui->checkBox_cleanMesh->isChecked() &&
|
||||||
|
(_ui->checkBox_textureMapping->isEnabled() && _ui->checkBox_textureMapping->isChecked()))
|
||||||
|
{
|
||||||
|
_progressDialog->appendText(tr("Removing polygons too far from the cloud..."));
|
||||||
|
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::PointXYZ>::Ptr optimizedCloud(new pcl::PointCloud<pcl::PointXYZ>);
|
||||||
|
pcl::fromPCLPointCloud2(mesh->cloud, *optimizedCloud);
|
||||||
|
std::vector<bool> closePts(optimizedCloud->size());
|
||||||
|
for(unsigned int i=0; i<optimizedCloud->size(); ++i)
|
||||||
|
{
|
||||||
|
std::vector<int> kIndices;
|
||||||
|
std::vector<float> kDistances;
|
||||||
|
pcl::PointXYZRGBNormal pt;
|
||||||
|
pt.x = optimizedCloud->at(i).x;
|
||||||
|
pt.y = optimizedCloud->at(i).y;
|
||||||
|
pt.z = optimizedCloud->at(i).z;
|
||||||
|
tree->radiusSearch(pt, _ui->doubleSpinBox_transferColorRadius->value(), kIndices, kDistances);
|
||||||
|
if(kIndices.size())
|
||||||
|
{
|
||||||
|
closePts.at(i) = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
closePts.at(i) = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// remove far polygons
|
||||||
|
std::vector<pcl::Vertices> filteredPolygons(mesh->polygons.size());
|
||||||
|
int oi=0;
|
||||||
|
for(unsigned int i=0; i<mesh->polygons.size(); ++i)
|
||||||
|
{
|
||||||
|
bool keepPolygon = true;
|
||||||
|
for(unsigned int j=0; j<mesh->polygons[i].vertices.size(); ++j)
|
||||||
|
{
|
||||||
|
if(!closePts.at(mesh->polygons[i].vertices[j]))
|
||||||
|
{
|
||||||
|
keepPolygon = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(keepPolygon)
|
||||||
|
{
|
||||||
|
filteredPolygons[oi++] = mesh->polygons[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
filteredPolygons.resize(oi);
|
||||||
|
mesh->polygons = filteredPolygons;
|
||||||
|
}
|
||||||
|
|
||||||
if(_ui->spinBox_mesh_minClusterSize->value() &&
|
if(_ui->spinBox_mesh_minClusterSize->value() &&
|
||||||
!(_ui->checkBox_textureMapping->isEnabled() &&
|
!(_ui->checkBox_textureMapping->isEnabled() &&
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>-1879</y>
|
<y>-1649</y>
|
||||||
<width>773</width>
|
<width>773</width>
|
||||||
<height>3158</height>
|
<height>3158</height>
|
||||||
</rect>
|
</rect>
|
||||||
|
|||||||
Reference in New Issue
Block a user