一、概述
PCL中有两种提取子集的方法。
1、copyPointCloud
pcl::copyPointCloud(*cloud_in, indices, *cloud_copy);
cloud_in
原始点云indices
目标子集在原始点云中的索引cloud_copy
要提取的点云子集
2、 ExtractIndices方法
pcl::IndicesPtr index_ptr(new vector<int>(point.indices));/// 将自定义的point数组进行智能指针的转换
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(index_ptr);
extract.setNegative(true); /// 默认false,提取索引内的点;true,提取索引外的点
extract.filter(*cloud_indice);
index_ptr
为点云索引智能指针extract
为点云索引提取对象setInputCloud(cloud)
设置输入点云cloudsetIndices(index_ptr )
设置点云索引setNegative(false)
默认false
,提取索引内的点;true
,提取索引外的点filter(*cloud_indice)
执行点云子集提取,并将提取出的点存放到cloud_indice
中
二、代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
int main()
{
// 加载点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile("facade_cloud.pcd", *cloud) < 0)
{
PCL_ERROR("点云文件不存在!");
return -1;
}
cout << "加载点云点数:" << cloud->points.size() << endl;
// 提取前10000个点的点云索引
pcl::PointIndices idx; //点云索引index数组
for (size_t i = 0; i < 10000; ++i)
{
idx.indices.push_back(i);
}
// copyPointCloud提取点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_copy(new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud(*cloud, idx.indices, *cloud_copy);
// ExtractInsides提取点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_indice(new pcl::PointCloud<pcl::PointXYZ>);
pcl::IndicesPtr index_ptr(new vector<int>(idx.indices));/// 将自定义的pi数组进行智能指针的转换
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(index_ptr);
extract.setNegative(true); // 提取索引外的点云,false提取索引内的点
extract.filter(*cloud_indice);
// 可视化提取结果
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("点云索引提取结果"));
viewer->addPointCloud<pcl::PointXYZ>(cloud_copy, "insides cloud");
viewer->addPointCloud<pcl::PointXYZ>(cloud_indice, "outsides cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 1, 0, 0, "insides cloud");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0, 1, 0, "outsides cloud");
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
}
return 0;
}