PCL点云滤波:StatisticalOutlierRemoval

两种点云类型,均可以使用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);

注意,前面加“*”。

猜你喜欢

转载自blog.csdn.net/u013925378/article/details/83546884