mirror of
https://github.com/introlab/rtabmap_ros.git
synced 2026-10-04 00:37:46 +08:00
ExportClouds: set minimum K (for normal estimation) to 3. Also added a check if the created cloud is empty.
This commit is contained in:
@@ -1434,59 +1434,62 @@ std::map<int, std::pair<pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr, pcl::Indic
|
|||||||
indices.get(),
|
indices.get(),
|
||||||
parameters);
|
parameters);
|
||||||
|
|
||||||
// Don't voxelize if we create organized mesh
|
if(cloudWithoutNormals->size())
|
||||||
if(!(_ui->comboBox_pipeline->currentIndex()==0 && _ui->groupBox_meshing->isChecked()) && _ui->doubleSpinBox_voxelSize_assembled->value()>0.0)
|
|
||||||
{
|
{
|
||||||
cloudWithoutNormals = util3d::voxelize(cloudWithoutNormals, indices, _ui->doubleSpinBox_voxelSize_assembled->value());
|
// Don't voxelize if we create organized mesh
|
||||||
indices->resize(cloudWithoutNormals->size());
|
if(!(_ui->comboBox_pipeline->currentIndex()==0 && _ui->groupBox_meshing->isChecked()) && _ui->doubleSpinBox_voxelSize_assembled->value()>0.0)
|
||||||
for(unsigned int i=0; i<indices->size(); ++i)
|
|
||||||
{
|
{
|
||||||
indices->at(i) = i;
|
cloudWithoutNormals = util3d::voxelize(cloudWithoutNormals, indices, _ui->doubleSpinBox_voxelSize_assembled->value());
|
||||||
|
indices->resize(cloudWithoutNormals->size());
|
||||||
|
for(unsigned int i=0; i<indices->size(); ++i)
|
||||||
|
{
|
||||||
|
indices->at(i) = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// view point
|
// view point
|
||||||
Eigen::Vector3f viewPoint(0.0f,0.0f,0.0f);
|
Eigen::Vector3f viewPoint(0.0f,0.0f,0.0f);
|
||||||
if(d.cameraModels().size() && !d.cameraModels()[0].localTransform().isNull())
|
if(d.cameraModels().size() && !d.cameraModels()[0].localTransform().isNull())
|
||||||
{
|
|
||||||
viewPoint[0] = d.cameraModels()[0].localTransform().x();
|
|
||||||
viewPoint[1] = d.cameraModels()[0].localTransform().y();
|
|
||||||
viewPoint[2] = d.cameraModels()[0].localTransform().z();
|
|
||||||
}
|
|
||||||
else if(!d.stereoCameraModel().localTransform().isNull())
|
|
||||||
{
|
|
||||||
viewPoint[0] = d.stereoCameraModel().localTransform().x();
|
|
||||||
viewPoint[1] = d.stereoCameraModel().localTransform().y();
|
|
||||||
viewPoint[2] = d.stereoCameraModel().localTransform().z();
|
|
||||||
}
|
|
||||||
|
|
||||||
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloudWithoutNormals, indices, _ui->spinBox_normalKSearch->value(), viewPoint);
|
|
||||||
pcl::concatenateFields(*cloudWithoutNormals, *normals, *cloud);
|
|
||||||
|
|
||||||
if(_ui->groupBox_subtraction->isChecked() &&
|
|
||||||
_ui->doubleSpinBox_subtractPointFilteringRadius->value() > 0.0)
|
|
||||||
{
|
|
||||||
pcl::IndicesPtr beforeSubtractionIndices = indices;
|
|
||||||
if( cloud->size() &&
|
|
||||||
previousCloud.get() != 0 &&
|
|
||||||
previousIndices.get() != 0 &&
|
|
||||||
previousIndices->size() &&
|
|
||||||
!previousPose.isNull())
|
|
||||||
{
|
{
|
||||||
rtabmap::Transform t = iter->second.inverse() * previousPose;
|
viewPoint[0] = d.cameraModels()[0].localTransform().x();
|
||||||
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr transformedCloud = rtabmap::util3d::transformPointCloud(previousCloud, t);
|
viewPoint[1] = d.cameraModels()[0].localTransform().y();
|
||||||
indices = rtabmap::util3d::subtractFiltering(
|
viewPoint[2] = d.cameraModels()[0].localTransform().z();
|
||||||
cloud,
|
}
|
||||||
indices,
|
else if(!d.stereoCameraModel().localTransform().isNull())
|
||||||
transformedCloud,
|
{
|
||||||
previousIndices,
|
viewPoint[0] = d.stereoCameraModel().localTransform().x();
|
||||||
_ui->doubleSpinBox_subtractPointFilteringRadius->value(),
|
viewPoint[1] = d.stereoCameraModel().localTransform().y();
|
||||||
_ui->doubleSpinBox_subtractPointFilteringAngle->value(),
|
viewPoint[2] = d.stereoCameraModel().localTransform().z();
|
||||||
_ui->spinBox_subtractFilteringMinPts->value());
|
}
|
||||||
|
|
||||||
|
pcl::PointCloud<pcl::Normal>::Ptr normals = util3d::computeNormals(cloudWithoutNormals, indices, _ui->spinBox_normalKSearch->value(), viewPoint);
|
||||||
|
pcl::concatenateFields(*cloudWithoutNormals, *normals, *cloud);
|
||||||
|
|
||||||
|
if(_ui->groupBox_subtraction->isChecked() &&
|
||||||
|
_ui->doubleSpinBox_subtractPointFilteringRadius->value() > 0.0)
|
||||||
|
{
|
||||||
|
pcl::IndicesPtr beforeSubtractionIndices = indices;
|
||||||
|
if( cloud->size() &&
|
||||||
|
previousCloud.get() != 0 &&
|
||||||
|
previousIndices.get() != 0 &&
|
||||||
|
previousIndices->size() &&
|
||||||
|
!previousPose.isNull())
|
||||||
|
{
|
||||||
|
rtabmap::Transform t = iter->second.inverse() * previousPose;
|
||||||
|
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr transformedCloud = rtabmap::util3d::transformPointCloud(previousCloud, t);
|
||||||
|
indices = rtabmap::util3d::subtractFiltering(
|
||||||
|
cloud,
|
||||||
|
indices,
|
||||||
|
transformedCloud,
|
||||||
|
previousIndices,
|
||||||
|
_ui->doubleSpinBox_subtractPointFilteringRadius->value(),
|
||||||
|
_ui->doubleSpinBox_subtractPointFilteringAngle->value(),
|
||||||
|
_ui->spinBox_subtractFilteringMinPts->value());
|
||||||
|
}
|
||||||
|
previousCloud = cloud;
|
||||||
|
previousIndices = beforeSubtractionIndices;
|
||||||
|
previousPose = iter->second;
|
||||||
}
|
}
|
||||||
previousCloud = cloud;
|
|
||||||
previousIndices = beforeSubtractionIndices;
|
|
||||||
previousPose = iter->second;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
<item row="3" column="0">
|
<item row="3" column="0">
|
||||||
<widget class="QSpinBox" name="spinBox_normalKSearch">
|
<widget class="QSpinBox" name="spinBox_normalKSearch">
|
||||||
<property name="minimum">
|
<property name="minimum">
|
||||||
<number>0</number>
|
<number>3</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>20</number>
|
<number>20</number>
|
||||||
|
|||||||
Reference in New Issue
Block a user