#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/approximate_voxel_grid.h>
#include <pcl/filters/voxel_grid.h>
#include <pcl/common/transforms.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/search/kdtree.h>
#include <pcl/segmentation/extract_clusters.h>
using namespace std;
int main()
{
string pcdPath = "d://PCD//11.pcd";
pcl::PointCloud<pcl::PointXYZ>::Ptr pingyi(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDWriter writer;
if (pcl::io::loadPCDFile(pcdPath.c_str(), *pingyi) < 0)
{
cout << "load PCD failure" << endl;
}
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliners(new pcl::PointIndices);
pcl::SACSegmentation<pcl::PointXYZ> sac;
sac.setOptimizeCoefficients(true);
sac.setModelType(pcl::SACMODEL_PLANE);
sac.setMethodType(pcl::SAC_RANSAC);
sac.setDistanceThreshold(0.1);
sac.setMaxIterations(500);
int i = 0, nr_points = (int)pingyi->points.size();
pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPlane(new pcl::PointCloud<pcl::PointXYZ>), cloudT(new pcl::PointCloud<pcl::PointXYZ>);
while (pingyi->points.size() > 0.1 * nr_points)
{
sac.setInputCloud(pingyi);
sac.segment(*inliners, *coefficients);
if (inliners->indices.size() == 0)
{
cout << "could not remove " << endl;
break;
}
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(pingyi);
extract.setIndices(inliners);
extract.setNegative(false);
extract.filter(*cloudPlane);
extract.setNegative(true);
extract.filter(*cloudT);
cout<<cloudPlane->size()<<endl;
writer.write<pcl::PointXYZ>("d://PCD" + to_string(i) + ".pcd", *cloudPlane, false);
writer.write<pcl::PointXYZ>("d://PCD" + to_string(i) + ".pcd", *cloudT, false);
i++;
*pingyi = *cloudT;
}
return 0;
}