1、导入点云库
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h>
2、创建空的PointIndices对象,用于存储需要删除的点的索引
pcl::PointIndices::Ptr indices (new pcl::PointIndices);
3、遍历点云数据,找到x、y、z为0 的点的索引值,并将其添加到indices中
for (size_t i = 0; i < cloud->points.size(); ++i)
{
if (cloud->points[i].x == 0 && cloud->points[i].y == 0 && cloud->points[i].z == 0)
{
indices->indices.push_back(i); // 将点的索引添加到indices中
}
}
4、使用PCL的ExtractIndices方法从原始点云中删除指定索引的点,并将结果存储到新的点云对象中
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud (cloud);
extract.setIndices (indices);
extract.setNegative (true); // 保留指定索引的点,删除其他点
extract.filter (*filtered_cloud); // 应用提取方法,并将结果存储在filtered_cloud中
完整代码:
//删除x、y、z为0的点
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/extract_indices.h>
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile("..\\testdata\\result\\6.pcd", *cloud) == -1)
return (-1);
pcl::PointIndices::Ptr indices(new pcl::PointIndices);
for (size_t i = 0; i < cloud->points.size(); ++i)
{
if (cloud->points[i].x == 0 && cloud->points[i].y == 0 && cloud->points[i].z == 0)
{
indices->indices.push_back(i); // 将点的索引添加到indices中
}
}
pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(indices);
extract.setNegative(true); // 保留指定索引的点,删除其他点
extract.filter(*filtered_cloud); // 应用提取方法,并将结果存储在filtered_cloud中
pcl::io::savePCDFileASCII<pcl::PointXYZ>("..\\testdata\\result\\a.pcd", *filtered_cloud);
return 0;
}