【PCL入门】点云滤波—之PassThrough

下面的代码来自点云库官方教程 :http://pointclouds.org/documentation/tutorials/
PassThrough 直通滤波是最简单的滤波方法,就是在指定的方向上x,y,z,按照给定的区间,保留该维度上在该区间上的点或者是保留该维度上在该区间之外的点。

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/filters/passthrough.h>
#include <pcl/filters/statistical_outlier_removal.h>

int main(int argc, char** argv)
{
	//点云的类型由 类pcl::PointCloud 的模板参数来定义
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);   // cloud是对象指针
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);

	// Fill in the cloud data
	cloud->width = 5;  // ->左边必须是指针变量; .左边必须是实体变量
	cloud->height = 1;  //height = 1 表明生成的点云是 含有5个点的无序点云。
	cloud->points.resize(cloud->width * cloud->height);   

	//c++中 &  是取地址运算,*可以是乘法运算符;
	//定义指针变量,如int *p;访问指针指向的变量的值,如cout<<*p<<endl;
	for (auto& point : *cloud) 
	{
		point.x =  1024* rand() / (RAND_MAX + 1.0f); //rand()产生的随机数大小范围是 0 - RANDMAX, RANDMAX最小是32767(int)
		point.y = 1024 * rand() / (RAND_MAX + 1.0f); // x,y,z的取值范围是 0-2 的随机小数
		point.z = 1024*  rand() / (RAND_MAX + 1.0f);
	}

	std::cerr << "Cloud before filtering: " << std::endl;  //cerr, cout, clog这3个都是ostream类型的对象,cin是istream类型的对象
	for (const auto& point : *cloud)
		std::cerr << "    " << point.x << " "
		<< point.y << " "
		<< point.z << std::endl;
	

	// Create the PassThrough filter object:pass
	pcl::PassThrough<pcl::PointXYZ> pass;  
	pass.setInputCloud(cloud);
	pass.setFilterFieldName("z");  // perform a simple filter along the  z axis
	pass.setFilterLimits(0.0f, 200.0f);
	//pass.setFilterLimitsNegative (true);
	pass.filter(*cloud_filtered);


	std::cerr << "Cloud after filtering: " << std::endl;
	for (const auto& point : *cloud_filtered)
		std::cerr << "    " << point.x << " "
		<< point.y << " "
		<< point.z << std::endl;

	return (0);
}

上面这段代码没有涉及到从磁盘中读取ply文件,而是直接随机生成一个点云,并输出;然后创建一个PassThrough filter对象,并对它进行设置,然后将滤波后得到的点云保存至*cloud_filtered中,并输出。
现在遇到的问题是:运行结果中只输出了滤波前的点云坐标。
在这里插入图片描述
vs的输出控制台显示:出现了Microsoft C++ 异常: std::length_error
在这里插入图片描述
PCL环境配置这篇文章中有提到跟上面一样的问题。
在这里插入图片描述
出错原因:我在Debug,release模式下对链接器–>输入–>附加依赖项 设置的内容是一样的,所以导致上面错误的发生。
解决
然后,参考PCL环境配置:VS2017,PCL1.8.1,win10这篇教程,首先将release x64下面的属性配置页给移除,然后重新对Debug x64中的链接器–>输入–>附加依赖项 进行设置。【成功】
运行结果:
在这里插入图片描述

以下是使用C++PCL库进行点云滤波的示例代码: ```cpp #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h> int main (int argc, char** argv) { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>); // 从PCD文件中读取点云数据 pcl::PCDReader reader; reader.read<pcl::PointXYZ> ("input_cloud.pcd", *cloud); std::cout << "PointCloud before filtering: " << cloud->width * cloud->height << " data points." << std::endl; // 创建一个体素网格滤波器对象 pcl::VoxelGrid<pcl::PointXYZ> sor; sor.setInputCloud (cloud); sor.setLeafSize (0.01f, 0.01f, 0.01f); // 设置体素大小 sor.filter (*cloud_filtered); std::cout << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << " data points." << std::endl; // 保存滤波后的点云数据到PCD文件中 pcl::PCDWriter writer; writer.write<pcl::PointXYZ> ("output_cloud.pcd", *cloud_filtered, false); return (0); } ``` 在该示例中,我们首先使用pcl::PCDReader从PCD文件中读取点云数据,然后创建pcl::VoxelGrid滤波器对象并设置体素大小。最后,我们将点云数据传递给滤波器,并保存滤波后的点云数据到PCD文件中。 请注意,该示例仅仅使用了最基本的点云滤波器,PCL库中还有很多其他的滤波器可以使用,具体可以参考PCL官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值