test_filter.cpp
Go to the documentation of this file.
1 
18 #include <Filter.h>
19 #include <Utils.h>
20 #include <gtest/gtest.h>
21 #include <exception>
22 #include <pcl/filters/filter.h>
23 
24 typedef pcl::PointCloud<pcl::PointXYZRGB> PointCloudRGB;
25 
26 class TestFilter : public ::testing::Test
27 {
28 protected:
29 
30  PointCloudRGB::Ptr cloudRGB {new PointCloudRGB};
31 
33  {
34  cubePointCloud(cloudRGB, 5, 5000, 0);
35  }
36 
37  void cubePointCloud(PointCloudRGB::Ptr cloud, float dim, int nsamples, int x)
38  {
39  pcl::PointXYZRGB p_rgb;
40  for(int i=0; i<nsamples; i++)
41  {
42  p_rgb.x = x + dim * (double)std::rand() / (double)RAND_MAX;
43  p_rgb.y = x + dim * (double)std::rand() / (double)RAND_MAX;
44  p_rgb.z = x + dim * (double)std::rand() / (double)RAND_MAX;
45  p_rgb.r = 255;
46  p_rgb.g = 255;
47  p_rgb.b = 255;
48  cloud->push_back(p_rgb);
49  }
50  }
51  void floorPointCloud(PointCloudRGB::Ptr cloud, float dim)
52  {
53  pcl::PointXYZRGB p_rgb;
54  for (float i=0; i<dim; i+=0.1){
55  for (float j=0; j<dim; j+=0.1){
56  p_rgb.x = i;
57  p_rgb.y = j;
58  p_rgb.z = 0;
59  p_rgb.r = 255;
60  p_rgb.g = 255;
61  p_rgb.b = 255;
62  cloud->push_back(p_rgb);
63  }
64  }
65  }
66 };
67 
68 TEST_F(TestFilter, testDownsample)
69 {
71  float leaf_size = 2*res;
72 
73  PointCloudRGB::Ptr cloudRGBfiltered {new PointCloudRGB};
74 
75  Filter cloud_filter(leaf_size);
76  cloud_filter.setLeafSize(leaf_size);
77  cloud_filter.downsampleCloud(cloudRGB, cloudRGBfiltered);
78 
79  double end_res = Utils::computeCloudResolution(cloudRGBfiltered);
80 
81  EXPECT_GT(end_res, res);
82 }
83 
84 TEST_F(TestFilter, testBox)
85 {
87  float noise_th = res*5;
88 
89  PointCloudRGB::Ptr cloudRGBfiltered {new PointCloudRGB};
90 
91  Filter cloud_filter;
92  cloud_filter.setNoiseThreshold(noise_th);
93  cloud_filter.setCloudCenter(Eigen::Vector3f(0,0,0));
94  cloud_filter.filterNoise(cloudRGB, cloudRGBfiltered);
95 
96  double end_res = Utils::computeCloudResolution(cloudRGBfiltered);
97 
98  // EXPECT_GT(end_res, res);
99  ASSERT_TRUE(Utils::isValidCloud(cloudRGBfiltered));
100 }
101 
102 TEST_F(TestFilter, testDifference)
103 {
105  PointCloudRGB::Ptr source_cloud = cloudRGB;
106  PointCloudRGB::Ptr target_cloud{new PointCloudRGB};
107  cubePointCloud(target_cloud, 5, 5000, 2);
108 
109  PointCloudRGB::Ptr cloudRGBDiff {new PointCloudRGB};
110  Filter::removeFromCloud(target_cloud, source_cloud, res, cloudRGBDiff);
111 
112  ASSERT_TRUE(Utils::isValidCloud(cloudRGBDiff));
113 }
114 
115 TEST_F(TestFilter, testFloor)
116 {
117  PointCloudRGB::Ptr source_cloud{new PointCloudRGB};
118  PointCloudRGB::Ptr floor_cloud{new PointCloudRGB};
119  floorPointCloud(floor_cloud, 10);
120 
121  *source_cloud = *cloudRGB+*floor_cloud;
122 
123  PointCloudRGB::Ptr cloudRGBfiltered{new PointCloudRGB};
124  Filter cloud_filter;
125  cloud_filter.setFloorThreshold(0.01);
126  cloud_filter.filterFloor(source_cloud, cloudRGBfiltered);
127 
128  EXPECT_GT(source_cloud->size(), cloudRGBfiltered->size());
129  ASSERT_TRUE(Utils::isValidCloud(cloudRGBfiltered));
130 }
131 
132 TEST_F(TestFilter, testExtractIndices)
133 {
134  PointCloudNormal::Ptr normals{new PointCloudNormal};
135  Utils::getNormals(cloudRGB, 0.01, normals);
136 
137  pcl::IndicesPtr indices(new std::vector<int>);
138  pcl::removeNaNFromPointCloud(*cloudRGB, *cloudRGB, *indices);
139  Filter::extractIndices(cloudRGB, cloudRGB, indices);
140  pcl::removeNaNNormalsFromPointCloud(*normals, *normals, *indices);
141  Filter::extractIndices(normals, normals, indices);
142 }
143 
144 TEST_F(TestFilter, testOutlierRemove)
145 {
146  PointCloudRGB::Ptr cloudRGBfiltered{new PointCloudRGB};
147 
148  Filter cloud_filter;
149  cloud_filter.outlierRemove(cloudRGB, cloudRGBfiltered);
150  EXPECT_GT(cloudRGB->size(), cloudRGBfiltered->size());
151 }
152 
153 int main(int argc, char **argv){
154  testing::InitGoogleTest(&argc, argv);
155 
156  return RUN_ALL_TESTS();
157 }
pcl::PointCloud< pcl::PointXYZRGB > PointCloudRGB
static bool getNormals(PointCloudRGB::Ptr &cloud, double normal_radius, PointCloudNormal::Ptr &normals)
Get the normals for input cloud with specified normal&#39;s radius.
Definition: Utils.cpp:27
Definition: Filter.h:25
pcl::PointCloud< pcl::PointXYZRGB > PointCloudRGB
Definition: test_filter.cpp:24
void cubePointCloud(PointCloudRGB::Ptr cloud, float dim, int nsamples, int x)
Definition: test_filter.cpp:37
pcl::PointCloud< pcl::Normal > PointCloudNormal
Definition: Viewer.h:28
static bool isValidCloud(PointCloudXYZ::Ptr cloud)
Check whether cloud contains data and is not empty.
Definition: Utils.cpp:46
TEST_F(TestFilter, testDownsample)
Definition: test_filter.cpp:68
static double computeCloudResolution(PointCloudXYZ::Ptr cloud)
Obtain the resolution of the cloud.
Definition: Utils.cpp:114
PointCloudRGB::Ptr cloudRGB
Definition: test_filter.cpp:30
int main(int argc, char **argv)
void floorPointCloud(PointCloudRGB::Ptr cloud, float dim)
Definition: test_filter.cpp:51


leica_point_cloud_processing
Author(s): Ines Lara Sicilia
autogenerated on Fri Feb 5 2021 03:20:30