diff --git a/segmentation/include/pcl/segmentation/impl/region_growing.hpp b/segmentation/include/pcl/segmentation/impl/region_growing.hpp index efbbe2fb22c..862af012807 100644 --- a/segmentation/include/pcl/segmentation/impl/region_growing.hpp +++ b/segmentation/include/pcl/segmentation/impl/region_growing.hpp @@ -332,7 +332,7 @@ pcl::RegionGrowing::findPointNeighbours () for (const auto& point_index: (*indices_)) { neighbours.clear (); - search_->nearestKSearch (point_index, neighbour_number_, neighbours, distances); + search_->nearestKSearch ((*input_)[point_index], neighbour_number_, neighbours, distances); point_neighbours_[point_index].swap (neighbours); } } @@ -343,7 +343,7 @@ pcl::RegionGrowing::findPointNeighbours () if (!pcl::isFinite ((*input_)[point_index])) continue; neighbours.clear (); - search_->nearestKSearch (point_index, neighbour_number_, neighbours, distances); + search_->nearestKSearch ((*input_)[point_index], neighbour_number_, neighbours, distances); point_neighbours_[point_index].swap (neighbours); } } diff --git a/segmentation/include/pcl/segmentation/impl/region_growing_rgb.hpp b/segmentation/include/pcl/segmentation/impl/region_growing_rgb.hpp index dd35c5b1e74..65b26dfec79 100644 --- a/segmentation/include/pcl/segmentation/impl/region_growing_rgb.hpp +++ b/segmentation/include/pcl/segmentation/impl/region_growing_rgb.hpp @@ -278,7 +278,7 @@ pcl::RegionGrowingRGB::findPointNeighbours () { neighbours.clear (); distances.clear (); - search_->nearestKSearch (point_index, region_neighbour_number_, neighbours, distances); + search_->nearestKSearch ((*input_)[point_index], region_neighbour_number_, neighbours, distances); point_neighbours_[point_index].swap (neighbours); point_distances_[point_index].swap (distances); } diff --git a/test/segmentation/test_segmentation.cpp b/test/segmentation/test_segmentation.cpp index ecdac73f650..72ecf6e3abc 100644 --- a/test/segmentation/test_segmentation.cpp +++ b/test/segmentation/test_segmentation.cpp @@ -78,6 +78,27 @@ TEST (RegionGrowingRGBTest, Segment) EXPECT_NE (0, num_of_segments); } +TEST (RegionGrowingRGBTest, SegmentWithIndices) +{ + // Same test as before, but now we pass a reduced set of indices to RegionGrowingRGB, which results in fewer clusters + pcl::IndicesPtr indices (new pcl::Indices(colored_cloud->size()-611)); + std::iota(indices->begin(), indices->end(), 611); + + RegionGrowingRGB rg; + + rg.setInputCloud (colored_cloud); + rg.setIndices (indices); + rg.setDistanceThreshold (10); + rg.setRegionColorThreshold (5); + rg.setPointColorThreshold (6); + rg.setMinClusterSize (20); + + std::vector clusters; + rg.extract (clusters); + const auto num_of_segments = clusters.size (); + EXPECT_EQ (5, num_of_segments); +} + //////////////////////////////////////////////////////////////////////////////////////////////// TEST (RegionGrowingTest, Segment) { @@ -91,6 +112,30 @@ TEST (RegionGrowingTest, Segment) EXPECT_NE (0, num_of_segments); } +TEST (RegionGrowingTest, SegmentWithIndices) +{ + // use colored_cloud, but with a reduced set of indices (colors are ignored) + pcl::IndicesPtr indices (new pcl::Indices(colored_cloud->size()-611)); + std::iota(indices->begin(), indices->end(), 611); + // create dummy normals that all point into the same direction + pcl::PointCloud::Ptr normals (new pcl::PointCloud); + normals->resize(colored_cloud->size()); + for(auto& normal: *normals) { + normal.normal_x = normal.normal_y = 0.0f; + normal.normal_z = 1.0f; + } + + pcl::RegionGrowing rg; + rg.setInputCloud (colored_cloud); + rg.setInputNormals (normals); + rg.setIndices (indices); + + std::vector clusters; + rg.extract (clusters); + const auto num_of_segments = clusters.size (); + EXPECT_EQ (5, num_of_segments); +} + //////////////////////////////////////////////////////////////////////////////////////////////// TEST (RegionGrowingTest, SegmentWithoutCloud) {