给我一个用PCL和C++实现先读取点云,再点云统计滤波,再点云计算平面度,再点云输出保存的代码
时间: 2023-03-26 15:00:17 浏览: 74
以下是一个用 PCL 和 C 实现先读取点云,再点云统计滤波,再点云计算平面度,再点云输出保存的代码示例:
```
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/convex_hull.h>
int main(int argc, char** argv)
{
// 读取点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
reader.read("input_cloud.pcd", *cloud);
// 点云统计滤波
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setMeanK(50);
sor.setStddevMulThresh(1.);
sor.filter(*cloud_filtered);
// 点云计算法线
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> ne;
ne.setInputCloud(cloud_filtered);
ne.setSearchMethod(tree);
ne.setKSearch(20);
ne.compute(*normals);
// 点云计算平面度
pcl::ConvexHull<pcl::PointXYZ> chull;
chull.setInputCloud(cloud_filtered);
pcl::PointCloud<pcl::PointXYZ>::Ptr hull(new pcl::PointCloud<pcl::PointXYZ>);
chull.reconstruct(*hull);
float area = pcl::calculatePolygonArea(*hull);
// 点云输出保存
pcl::PCDWriter writer;
writer.write("output_cloud.pcd", *cloud_filtered);
return ;
}
```