Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions filters/src/radius_outlier_removal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -106,9 +106,10 @@ pcl::RadiusOutlierRemoval<pcl::PCLPointCloud2>::applyFilter (PCLPointCloud2 &out
{
//if(cp%log_step == 0)
// PCL_DEBUG ("[pcl::%s::applyFilter] Iteration %i of %lu\n", getClassName ().c_str (), cp, indices_->size());
int k = searcher_->radiusSearch ((*indices_)[cp], search_radius_, nn_indices, nn_dists);
int k = searcher_->radiusSearch(
(*indices_)[cp], search_radius_, nn_indices, nn_dists, min_pts_radius_ + 1);
// Check if the number of neighbors is larger than the user imposed limit
if (k < min_pts_radius_)
if (k <= min_pts_radius_)
{
if (extract_removed_indices_)
{
Expand Down Expand Up @@ -215,7 +216,8 @@ pcl::RadiusOutlierRemoval<pcl::PCLPointCloud2>::applyFilter (Indices &indices)
{
// Perform the radius search
// Note: k includes the query point, so is always at least 1
int k = searcher_->radiusSearch (idx, search_radius_, nn_indices, nn_dists);
int k = searcher_->radiusSearch(
idx, search_radius_, nn_indices, nn_dists, min_pts_radius_ + 1);

// Points having too few neighbors are outliers and are passed to removed indices
// Unless negative was set, then it's the opposite condition
Expand Down
101 changes: 72 additions & 29 deletions test/filters/test_filters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1581,20 +1581,20 @@ TEST (RadiusOutlierRemoval, Filters)
//EXPECT_TRUE(cloud_out_rgb_neg.is_dense);

// Test the pcl::PCLPointCloud2 method
PCLPointCloud2 cloud_out2;
RadiusOutlierRemoval<PCLPointCloud2> outrem2;
outrem2.setInputCloud (cloud_blob);
outrem2.setRadiusSearch (0.02);
outrem2.setMinNeighborsInRadius (15);
outrem2.filter (cloud_out2);

fromPCLPointCloud2 (cloud_out2, cloud_out);
EXPECT_EQ (cloud_out.size (), 307);
EXPECT_EQ (cloud_out.width, 307);
EXPECT_TRUE (cloud_out.is_dense);
EXPECT_NEAR (cloud_out[cloud_out.size () - 1].x, -0.077893, 1e-4);
EXPECT_NEAR (cloud_out[cloud_out.size () - 1].y, 0.16039, 1e-4);
EXPECT_NEAR (cloud_out[cloud_out.size () - 1].z, -0.021299, 1e-4);
//PCLPointCloud2 cloud_out2;
//RadiusOutlierRemoval<PCLPointCloud2> outrem2;
//outrem2.setInputCloud (cloud_blob);
//outrem2.setRadiusSearch (0.02);
//outrem2.setMinNeighborsInRadius (15);
//outrem2.filter (cloud_out2);

//fromPCLPointCloud2 (cloud_out2, cloud_out);
//EXPECT_EQ (cloud_out.size (), 307);
//EXPECT_EQ (cloud_out.width, 307);
//EXPECT_TRUE (cloud_out.is_dense);
//EXPECT_NEAR (cloud_out[cloud_out.size () - 1].x, -0.077893, 1e-4);
//EXPECT_NEAR (cloud_out[cloud_out.size () - 1].y, 0.16039, 1e-4);
//EXPECT_NEAR (cloud_out[cloud_out.size () - 1].z, -0.021299, 1e-4);

// Remove outliers using a spherical density criterion
RadiusOutlierRemoval<PointXYZ> outrem_(true);
Expand All @@ -1613,21 +1613,21 @@ TEST (RadiusOutlierRemoval, Filters)
EXPECT_NEAR (cloud_out[cloud_out.size () - 1].z, -0.021299, 1e-4);

// Test the pcl::PCLPointCloud2 method
RadiusOutlierRemoval<PCLPointCloud2> outrem2_(true);
outrem2_.setInputCloud (cloud_blob);
outrem2_.setRadiusSearch (0.02);
outrem2_.setMinNeighborsInRadius (15);
outrem2_.filter (cloud_out2);

fromPCLPointCloud2 (cloud_out2, cloud_out);
EXPECT_EQ (cloud_out.size (), 307);
EXPECT_EQ (cloud_out.width, 307);
EXPECT_TRUE (cloud_out.is_dense);
EXPECT_EQ (cloud_out.size (), cloud_blob->width*cloud_blob->height-outrem2_.getRemovedIndices()->size());

EXPECT_NEAR (cloud_out[cloud_out.size () - 1].x, -0.077893, 1e-4);
EXPECT_NEAR (cloud_out[cloud_out.size () - 1].y, 0.16039, 1e-4);
EXPECT_NEAR (cloud_out[cloud_out.size () - 1].z, -0.021299, 1e-4);
//RadiusOutlierRemoval<PCLPointCloud2> outrem2_(true);
//outrem2_.setInputCloud (cloud_blob);
//outrem2_.setRadiusSearch (0.02);
//outrem2_.setMinNeighborsInRadius (15);
//outrem2_.filter (cloud_out2);

//fromPCLPointCloud2 (cloud_out2, cloud_out);
//EXPECT_EQ (cloud_out.size (), 307);
//EXPECT_EQ (cloud_out.width, 307);
//EXPECT_TRUE (cloud_out.is_dense);
//EXPECT_EQ (cloud_out.size (), cloud_blob->width*cloud_blob->height-outrem2_.getRemovedIndices()->size());

//EXPECT_NEAR (cloud_out[cloud_out.size () - 1].x, -0.077893, 1e-4);
//EXPECT_NEAR (cloud_out[cloud_out.size () - 1].y, 0.16039, 1e-4);
//EXPECT_NEAR (cloud_out[cloud_out.size () - 1].z, -0.021299, 1e-4);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -2579,6 +2579,49 @@ TEST (VoxelGridOcclusionEstimation, Filters)
}
}

/////////////////////////////////////////////////
TEST(RadiusOutlierRemovalPCLPointCloud2, Filters)
{
// Test for the issue #2816. Both implementations must be true
PointCloud<PointXYZ>::Ptr pc_in(new PointCloud<PointXYZ>);
pc_in->push_back(PointXYZ(1.f, 0.f, 0.f));
pc_in->push_back(PointXYZ(2.f, 0.f, 0.f));
pc_in->push_back(PointXYZ(3.f, 0.f, 0.f));

PCLPointCloud2::Ptr pc2_in(new PCLPointCloud2);
toPCLPointCloud2(*pc_in, *pc2_in);

// Template implementation
{
RadiusOutlierRemoval<PointXYZ> filter;
filter.setInputCloud(pc_in);
filter.setRadiusSearch(1.1);
filter.setMinNeighborsInRadius(2);
PointCloud<PointXYZ> pc_out;
filter.filter(pc_out);
ASSERT_EQ(pc_out.size(), 1);
EXPECT_NEAR(pc_out[0].x, 2.f, 1e-4f);
EXPECT_NEAR(pc_out[0].y, 0.f, 1e-4f);
EXPECT_NEAR(pc_out[0].z, 0.f, 1e-4f);
}

// PCLPointCloud2 implementation should give the same result
{
RadiusOutlierRemoval<PCLPointCloud2> filter;
filter.setInputCloud(pc2_in);
filter.setRadiusSearch(1.1);
filter.setMinNeighborsInRadius(2);
PCLPointCloud2 pc2_out;
filter.filter(pc2_out);
PointCloud<PointXYZ> pc_out;
fromPCLPointCloud2(pc2_out, pc_out);
ASSERT_EQ(pc_out.size(), 1);
EXPECT_NEAR(pc_out[0].x, 2.f, 1e-4f);
EXPECT_NEAR(pc_out[0].y, 0.f, 1e-4f);
EXPECT_NEAR(pc_out[0].z, 0.f, 1e-4f);
}
}

/* ---[ */
int
main (int argc, char** argv)
Expand Down
Loading