两种点云类型,均可以使用StatisticalOutlierRemoval进行滤波:
一、PointXYZ类型
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> outrem_(true);
outrem_.setInputCloud(cloud);
outrem_.setMeanK(50);
outrem_.setStddevMulThresh(1.0);
outrem_.filter(*cloud_filtered);//注意前面加“*”
注意,需要给输入的cloud赋值:
cloud->width = pointcloud_all.size();
cloud->height = 1;
cloud->is_dense = true;
for (int k = 0; k < pointcloud_all.size(); k++)
{
pcl::PointXYZ p;
p.x = pointcloud_all[k].x;
p.y = pointcloud_all[k].y;
p.z = pointcloud_all[k].z;
cloud->points.push_back(p);
}
二、PCLPointCloud2类型
pcl::PCLPointCloud2::Ptr cloud_blob(new pcl::PCLPointCloud2);
【为cloud_blob赋值:不能直接给PCLPointCloud2类型的点云赋值,需要将已赋值的PointXYZ转为PCLPointCloud2:
pcl::toPCLPointCloud2(*cloud, *cloud_blob);】
pcl::PCLPointCloud2 filtered_pointcloud2;
pcl::StatisticalOutlierRemoval<pcl::PCLPointCloud2> outrem2;
outrem2.setInputCloud(cloud_blob);
outrem2.setMeanK(50);
outrem2.setStddevMulThresh(1.0);
outrem2.filter(filtered_pointcloud2);
三、两种类型之间的转换函数
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCLPointCloud2::Ptr cloud_blob(new pcl::PCLPointCloud2);
1)PointXYZ->PCLPointCloud2
pcl::toPCLPointCloud2(*cloud, *cloud_blob);
2)PCLPointCloud2->PointXYZ
pcl::fromPCLPointCloud2(*cloud_blob, *cloud);
注意,前面加“*”。