pcl案例五 求类平面点云孔区面积
流程
1,直通滤波去除极值点
2,平面分割
3,平面点云提取
4,平面投影
5,凹边界计算
6,轮廓面积计算
#include <iostream>
#include<string.h>
#include<pcl/io/pcd_io.h>
#include<pcl/keypoints/sift_keypoint.h>
#include<pcl/keypoints/harris_3d.h>
#include<pcl/segmentation/sac_segmentation.h>
#include<pcl/filters/voxel_grid.h>
#include<pcl/sample_consensus/sac_model_perpendicular_plane.h>
#include<pcl/sample_consensus/sac_model_plane.h>
#include<pcl/common/common.h>
#include<pcl/common/angles.h>
#include<pcl/sample_consensus/ransac.h>
#include<pcl/surface/mls.h>
#include<pcl/filters/bilateral.h>
#include<pcl/filters/passthrough.h>
#include<pcl/filters/conditional_removal.h>
#include<pcl/segmentation/sac_segmentation.h>
#include<pcl/filters/extract_indices.h>
#include<pcl/filters/project_inliers.h>
#include<pcl/surface/concave_hull.h>
#include"tolls.h"using namespace std;int main()
{pcl::PointCloud < pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud < pcl::PointXYZ>);pcl::io::loadPCDFile("D:\\Desktop\\pacl_learning\\cloud\\table_textured.pcd", *cloud);vector<int> a;pcl::removeNaNFromPointCloud(*cloud, *cloud, a);//直通滤波pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_con(new pcl::PointCloud<pcl::PointXYZ>);for (auto it:cloud->points){if (0<it.z && it.z<1.1){cloud_con->push_back(it);}}//平面分割——进行分割pcl::PointIndices::Ptr in_plane(new pcl::PointIndices);pcl::ModelCoefficients::Ptr model_coeff(new pcl::ModelCoefficients);pcl::SACSegmentation<pcl::PointXYZ> seg;seg.setInputCloud(cloud_con);seg.setMaxIterations(200);seg.setMethodType(pcl::SAC_RANSAC);seg.setModelType(pcl::SACMODEL_PLANE);seg.setOptimizeCoefficients(true);seg.setDistanceThreshold(0.01);seg.segment(*in_plane,*model_coeff);//点云提取pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_seg_plane(new pcl::PointCloud<pcl::PointXYZ>);pcl::ExtractIndices<pcl::PointXYZ> extract;extract.setInputCloud(cloud_con);extract.setIndices(in_plane);extract.filter(*cloud_seg_plane);//show_pointcloud<pcl::PointXYZ>(cloud_seg_plane);//平面投影pcl::ProjectInliers < pcl::PointXYZ > proj;proj.setInputCloud(cloud_seg_plane);proj.setModelCoefficients(model_coeff);proj.setModelType(pcl::SACMODEL_PLANE);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_proj(new pcl::PointCloud<pcl::PointXYZ>);proj.filter(*cloud_proj);//show_pointcloud<pcl::PointXYZ>(cloud_proj);//凹边界计算pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_hull(new pcl::PointCloud<pcl::PointXYZ>);vector<pcl::Vertices>polygons;pcl::ConcaveHull<pcl::PointXYZ> concave_hull;concave_hull.setInputCloud(cloud_proj);concave_hull.setDimension(2);concave_hull.setAlpha(0.005); //凹包的精细度。concave_hull.reconstruct(*cloud_hull, polygons);show_pointcloud<pcl::PointXYZ>(cloud_hull);cout << polygons.size() << endl;//提取并计算一下每个边界包含的面积for (auto ply:polygons){pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ply(new pcl::PointCloud<pcl::PointXYZ>);for (int i:ply.vertices){cloud_ply->push_back(cloud_hull->points[i]);}cout << get_area_form_boundary<pcl::PointXYZ>(cloud_ply) << endl;;}return 0;}