平面模型上提取凸凹多边形
pcl::PointCloud<pcl::PointXYZ>::Ptr PclTool::ExtractConvexConcavePolygons(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new pcl::PointCloud<pcl::PointXYZ>);// 建立过滤器消除杂散的NaNpcl::PassThrough<pcl::PointXYZ> pass;pass.setInputCloud(cloud); // 设置输入点云pass.setFilterFieldName("z"); // 设置分割字段为z坐标pass.setFilterLimits(0, 1.1); // 设置分割阀值为(0, 1.1)pass.filter(*cloud_filtered);std::cerr << "PointCloud after filtering has: " << cloud_filtered->points.size() << " data points." << std::endl;// 分割pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);pcl::PointIndices::Ptr inliers(new pcl::PointIndices); // inliers存储分割后的点云// 创建分割对象pcl::SACSegmentation<pcl::PointXYZ> seg;// 设置优化系数,该参数为可选参数seg.setOptimizeCoefficients(true);// Mandatoryseg.setModelType(pcl::SACMODEL_PLANE);seg.setMethodType(pcl::SAC_RANSAC);seg.setDistanceThreshold(0.01);seg.setInputCloud(cloud_filtered);seg.segment(*inliers, *coefficients);std::cerr << "PointCloud after segmentation has: " << inliers->indices.size() << " inliers." << std::endl;// Project the model inliers点云投影滤波模型pcl::ProjectInliers<pcl::PointXYZ> proj; // 点云投影滤波模型proj.setModelType(pcl::SACMODEL_PLANE); // 设置投影模型proj.setIndices(inliers);proj.setInputCloud(cloud_filtered);proj.setModelCoefficients(coefficients); // 将估计得到的平面coefficients参数设置为投影平面模型系数proj.filter(*cloud_projected); // 得到投影后的点云std::cerr << "PointCloud after projection has: " << cloud_projected->points.size() << " data points." << std::endl;// 存储提取多边形上的点云pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull(new pcl::PointCloud<pcl::PointXYZ>);pcl::ConcaveHull<pcl::PointXYZ> chull; // 创建多边形提取对象chull.setInputCloud(cloud_projected); // 设置输入点云为提取后点云chull.setAlpha(0.1);chull.reconstruct(*cloud_hull); // 创建提取创建凹多边形std::cerr << "Concave hull has: " << cloud_hull->points.size() << " data points." << std::endl;return cloud_hull;
}
传入的原始点云数据
先对原始点云做一个制动滤波仅保留红色方框中的数据
然后再提取多边形,得到结果