PCL点云数据的VoxelGrid和RadiusOutlierRemoval滤波

VoxelGrid滤波器可以对密集的点云进行稀疏,减少计算机处理大量点云数据的压力;

RadiusOutlierRemoval统计每个点周边的邻近点个数,过滤掉离群的点。

将点云数据滤波并转化成PointCloud2在ros中发布的demo如下:

#include <pcl/io/pcd_io.h>  
#include <pcl/impl/point_types.hpp>  
#include <pcl_ros/point_cloud.h>  
#include <pcl_conversions/pcl_conversions.h>  
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/radius_outlier_removal.h> 
#include <sensor_msgs/PointCloud2.h>  

boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> pcl_cloud(new pcl::PointCloud<pcl::PointXYZ>());
……//建立点云数据
……//建立点云数据
pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_cloud_ptr(pcl_cloud);
      
boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> pcl_vg_cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_vg_cloud_ptr(pcl_vg_cloud);

boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> pcl_ror_cloud(new pcl::PointCloud<pcl::PointXYZ>());
pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_ror_cloud_ptr(pcl_ror_cloud);

//Use VoxelGrid to make points sparse
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud (pcl_cloud_ptr);
sor.setLeafSize (0.08, 0.1, 0.1); 
sor.filter (*pcl_vg_cloud_ptr);
      
//Use RadiusOutlierRemoval to remove the point whitch is far away to others
pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;
outrem.setInputCloud(pcl_vg_cloud_ptr);
outrem.setRadiusSearch(0.5);
outrem.setMinNeighborsInRadius (3);
outrem.filter (*pcl_ror_cloud_ptr); 
      
//transfrom and publish
sensor_msgs::PointCloud2Ptr msg_pointcloud(new sensor_msgs::PointCloud2);
pcl::toROSMsg(*pcl_ror_cloud, *msg_pointcloud);
msg_pointcloud->header.frame_id = optical_frame_id_[RS_STREAM_DEPTH];;  
msg_pointcloud->header.stamp = ros::Time::now();
pointcloud_publisher_.publish(*msg_pointcloud);

以上是学习笔记。如果不妥,多多指教!

猜你喜欢

转载自blog.csdn.net/u014695839/article/details/78746064