如下基于PCL设置高度区间,对点云进行分割处理
void Multilayer() {
string filename = "XXXX";
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(filename, *cloud) == -1)//打开点云文件。
{
PCL_ERROR("Couldn't read that pcd file\n");
}
//设置高度区间
float DivisionHeight[9] = { 0.00,1.35,1.91,2.55,2.84,3.50,4.00,5.80,11.55 };
// 对每个分割高度进行处理
for (int i = 0; i < 8; ++i) {
pcl::ExtractIndices<pcl::PointXYZ> extract;
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
// 遍历点云,将满足高度条件的点加入索引集合
for (std::size_t j = 0; j < cloud->points.size(); ++j) {
if (cloud->points[j].y >= DivisionHeight[i] && cloud->points[j].y < DivisionHeight[i + 1]) {
inliers->indices.push_back(j);
}
}
// 设置要提取的点的索引
extract.setInputCloud(cloud);
extract.setIndices(inliers);
extract.setNegative(false); // 设置为false,表示提取索引对应的点而不是剔除它们
// 执行提取操作
pcl::PointCloud<pcl::PointXYZ>::Ptr segmentedCloud(new pcl::PointCloud<pcl::PointXYZ>);
extract.filter(*segmentedCloud);
// 保存分割后的点云
std::string outputFilename = "segmented_cloud_" + std::to_string(i) + ".pcd";
pcl::io::savePCDFile(outputFilename, *segmentedCloud);
}
}
进行如下操作后将切割文件在cloudcompare中打开可见: