[Point Cloud Library] 使用直通滤波器过滤点云

这个教程学习如何使用简单的滤波器,沿着指定维,过滤掉指定范围内外的值。

#include <iostream>#include <pcl/point_types.h>#include <pcl/filters/passthrough.h>int main (int argc, char** argv){  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);  // Fill in the cloud data  cloud->width  = 5;  cloud->height = 1;  cloud->points.resize (cloud->width * cloud->height);  for (size_t i = 0; i < cloud->points.size (); ++i)  {    cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);    cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);    cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);  }  std::cerr << "Cloud before filtering: " << std::endl;  for (size_t i = 0; i < cloud->points.size (); ++i)    std::cerr << "    " << cloud->points[i].x << " "                         << cloud->points[i].y << " "                         << cloud->points[i].z << std::endl;  // Create the filtering object  pcl::PassThrough<pcl::PointXYZ> pass;  pass.setInputCloud (cloud);  pass.setFilterFieldName ("z");  pass.setFilterLimits (0.0, 1.0);  //pass.setFilterLimitsNegative (true);  pass.filter (*cloud_filtered);  std::cerr << "Cloud after filtering: " << std::endl;  for (size_t i = 0; i < cloud_filtered->points.size (); ++i)    std::cerr << "    " << cloud_filtered->points[i].x << " "                         << cloud_filtered->points[i].y << " "                         << cloud_filtered->points[i].z << std::endl;  return (0);}

一步一步来分析这些代码。

首先,我们创建一个PointCloud,填充数据。

然后创建一个直通滤波器并且设置参数。过滤器字段的名字设置为“Z”,接受的区间值设置为(0.0, 1.0);

即:保留z轴上z值为0.0-1.0之间的值的点,其他点均过滤掉。

运行程序,你会看到类似如下的结果。

Cloud before filtering:    0.352222 -0.151883 -0.106395    -0.397406 -0.473106 0.292602    -0.731898 0.667105 0.441304    -0.734766 0.854581 -0.0361733    -0.4607 -0.277468 -0.916762Cloud after filtering:    -0.397406 -0.473106 0.292602    -0.731898 0.667105 0.441304


猜你喜欢

转载自yiheng.iteye.com/blog/1624612