渐进形态学

#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);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值