Extract Plane


1 #include <iostream> 2 #include <pcl/ModelCoefficients.h> 3 #include <pcl/io/pcd_io.h> 4 #include <pcl/point_types.h> 5 #include <pcl/sample_consensus/method_types.h> 6 #include <pcl/sample_consensus/model_types.h> 7 #include <pcl/segmentation/sac_segmentation.h> 8 9 int 10 main(int argc, char** argv) 11 { 12 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); 13 pcl::io::loadPCDFile("D:\\in.pcd", *cloud); 14 15 pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); 16 pcl::PointIndices::Ptr inliers(new pcl::PointIndices); 17 // Create the segmentation object 18 pcl::SACSegmentation<pcl::PointXYZ> seg; 19 // Optional 20 seg.setOptimizeCoefficients(true); 21 // Mandatory 22 seg.setModelType(pcl::SACMODEL_PLANE); 23 seg.setMethodType(pcl::SAC_RANSAC); 24 seg.setDistanceThreshold(0.01); 25 26 seg.setInputCloud(cloud); 27 seg.segment(*inliers, *coefficients); 28 29 if (inliers->indices.size() == 0) 30 { 31 PCL_ERROR("Could not estimate a planar model for the given dataset."); 32 return (-1); 33 } 34 35 std::cerr << "Model coefficients: " << coefficients->values[0] << " " 36 << coefficients->values[1] << " " 37 << coefficients->values[2] << " " 38 << coefficients->values[3] << std::endl; 39 40 int num = inliers->indices.size(); 41 pcl::PointCloud<pcl::PointXYZ>::Ptr cloudOut(new pcl::PointCloud<pcl::PointXYZ>); 42 cloudOut->width = num; 43 cloudOut->height = 1; 44 cloudOut->points.resize(cloudOut->width*cloudOut->height); 45 for (int i=0;i<num;++i) 46 { 47 cloudOut->points[i] = cloud->points[inliers->indices[i]]; 48 } 49 pcl::io::savePCDFileASCII("D:\\out.pcd", *cloudOut); 50 return (0); 51 }