#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/time.h>
#include <pcl/filters/extract_indices.h>
#include <pcl/segmentation/progressive_morphological_filter.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
using namespace std;
int
main(int argc, char** argv)
{
// --------------------------------加载点云数据----------------------------------------
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCDReader reader;
if (reader.read("data//40m1A.pcd", *cloud) < 0)
{
PCL_ERROR("Could not read file\n");
return (-1);
}
printf("从点云数据中加载 %lld 个点\n", cloud->points.size());
// ------------------------------------渐进式形态学滤波---------------------------------------
pcl::StopWatch time;
pcl::ProgressiveMorphologicalFilter<pcl::PointXYZ> pmf;
pmf.setInputCloud(cloud); // 待处理点云
pmf.setMaxWindowSize(20); // 最大窗口大小
pmf.setSlope(1.0f); // 地形坡度参数
pmf.setInitialDistance(0.5f); // 初始高差阈值
pmf.setMaxDistance(3.0f); // 最大高差阈值
/*可选参数*/
pmf.setCellSize(3); // 设置窗口的大小
pmf.setBase(3); //设置计算渐进窗口大小时使用的基数
pmf.setExponential(true);//设置是否以指数方式增加窗口大小
pcl::PointIndicesPtr ground(new pcl::PointIndices);
pmf.extract(ground->indices); // 获取地面点的索引
cout << "渐进式形态学滤波算法运行时间:" << time.getTimeSeconds() << "秒" << endl;
// ----------------------------------------提取地面-------------------------------------------
pcl::PointCloud<pcl::PointXYZ>::Ptr ground_cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud);
extract.setIndices(ground);
extract.filter(*ground_cloud);
printf("地面点的个数为: %lld\n", ground_cloud->size());
pcl::PCDWriter writer;
writer.write("samp11-utm_ground.pcd", *ground_cloud, true); //设置为true,可提高效率
// --------------------------------------提取非地面------------------------------------------
pcl::PointCloud<pcl::PointXYZ>::Ptr non_ground_cloud(new pcl::PointCloud<pcl::PointXYZ>);
extract.setNegative(true);
extract.filter(*non_ground_cloud);
printf("非地面点的个数为: %lld\n", non_ground_cloud->size());
writer.write("samp11-utm_object.pcd", *non_ground_cloud, true);
// ---------------------------------------可视化---------------------------------------------
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("3D-viewer"));
viewer->setWindowName("渐进式形态学地面滤波");
viewer->addPointCloud(ground_cloud, pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>(ground_cloud, 255, 0, 0), "ground");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "ground");
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(non_ground_cloud, "z"); // 按照z字段进行渲染
viewer->addPointCloud<pcl::PointXYZ>(non_ground_cloud, fildColor, "non_ground");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "non_ground");
viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_OPACITY, 0.7, "non_ground");// 设置透明度
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));
}
return (0);
}
渐进形态学
最新推荐文章于 2023-03-10 13:08:43 发布