从pcl :: PointCloud <pcl :: pointxyzrgb>中删除点

时间:2017-07-05 09:18:44

标签: c++ ros point-cloud-library point-clouds

我是PCL的新手。我正在使用PCL库,我正在寻找一种从点云提取点或将特定点复制到新点的方法。我想验证每个点是否尊重某个条件,我想获得一个只有好点的点云。谢谢!

3 个答案:

答案 0 :(得分:11)

Use the ExtractIndices class:

  • add your points to be removed to a PointIndices variable
  • pass these Indices to the ExtractIndices
  • run filter() method "negatively" to get the original cloud minus your points

example:

  pcl::PointCloud<pcl::PointXYZ>::Ptr p_obstacles(new pcl::PointCloud<pcl::PointXYZ>);
  pcl::PointIndices::Ptr inliers(new pcl::PointIndices());
  pcl::ExtractIndices<pcl::PointXYZ> extract;
  for (int i = 0; i < (*p_obstacles).size(); i++)
  {
    pcl::PointXYZ pt(p_obstacles->points[i].x, p_obstacles->points[i].y, p_obstacles->points[i].z);
    float zAvg = 0.5f;
    if (abs(pt.z - zAvg) < THRESHOLD) // e.g. remove all pts below zAvg
    {
      inliers->indices.push_back(i);
    }
  }
  extract.setInputCloud(p_obstacles);
  extract.setIndices(inliers);
  extract.setNegative(true);
  extract.filter(*p_obstacles);

答案 1 :(得分:0)

如果您是PCL的新手。看一下文档应该是一个好主意:

http://pointclouds.org/documentation/tutorials/

我认为您正在寻找的内容在本教程中进行了解释:

http://pointclouds.org/documentation/tutorials/remove_outliers.php#remove-outliers

尝试在您的计算机上重现该示例,然后根据您的需要进行修改。

答案 2 :(得分:0)

只需使用pcl迭代器进行逐点操作,就可以说您要在云中操作W.R.T z值,那么您可以;

for (pcl::PointCloud<pcl::PointXYZRGB>::iterator it = cloud_filtered->begin(); it != cloud_filtered->end(); it++) {
    if (it->z > 3.0) {
        cloud_filtered->erase(it);
    }
}