PCl 几种采样对比

#include <iostream>

#include <pcl/io/pcd_io.h>

#include <pcl/point_types.h>

#include <pcl/filters/voxel_grid.h>

#include <pcl/filters/statistical_outlier_removal.h>

#include <pcl/visualization/cloud_viewer.h>

#include <pcl/visualization/pcl_visualizer.h>

#include <pcl/keypoints/uniform_sampling.h>

#include <pcl/surface/mls.h>



int main(int argc, char** argv)

{

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered1(new pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered2(new pcl::PointCloud<pcl::PointXYZ>);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered3(new pcl::PointCloud<pcl::PointXYZ>);



// Fill in the cloud data

pcl::PCDReader reader;

// Replace the path below with the path where you saved your file

reader.read("rabbit_gra.pcd", *cloud); // Remember to download the file first!

std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height

<< " data points (" << pcl::getFieldsList(*cloud) << ")."<<std::endl;



// Create the filtering object

pcl::VoxelGrid<pcl::PointXYZ> sor;    // 创建滤波(下采样)对象

sor.setInputCloud(cloud);             //设置需要过滤的点云

sor.setLeafSize(0.1f, 0.1f, 0.1f);    //设置滤波时创建的体素体积为1cm的立方体

sor.filter(*cloud_filtered1);          //执行滤波处理,储存输出点云 

std::cerr << "PointCloud after filtering: " << cloud_filtered1->width * cloud_filtered1->height

<< " data points (" << pcl::getFieldsList(*cloud_filtered1) << ")."<<std::endl;



// Create the filtering object

pcl::UniformSampling<pcl::PointXYZ> sor2;    // 创建均匀采样对象

sor2.setInputCloud(cloud);             //设置需要过滤的点云

sor2.setRadiusSearch(0.01f);    //设置滤波时创建的体素体积为1cm的立方体

sor2.filter(*cloud_filtered2);          //执行滤波处理,储存输出点云 

std::cerr << "PointCloud after filtering: " << cloud_filtered2->width * cloud_filtered2->height

      << " data points "<< std::endl;



pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ> sor3;

sor3.setInputCloud(cloud);

//建立搜索对象

pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree;

sor3.setSearchMethod(kdtree);

sor3.setSearchRadius(0.1);  //设置搜索邻域的半径为3cm

sor3.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ>::SAMPLE_LOCAL_PLANE);  // Upsampling 采样的方法有 DISTINCT_CLOUD, RANDOM_UNIFORM_DENSIT

sor3.setUpsamplingRadius(0.1); // 采样的半径是

sor3.setUpsamplingStepSize(0.02);// 采样步数的大小

sor3.process(*cloud_filtered3);

std::cerr << "PointCloud after filtering: " << cloud_filtered3->width * cloud_filtered3->height

<< " data points (" << pcl::getFieldsList(*cloud_filtered3) << ")." << std::endl;

//pcl::PCDWriter writer;

//writer.write("table_scene_lms400_downsampled.pcd", *cloud_filtered,

//Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), false);



pcl::visualization::PCLVisualizer viewer("采样");

int v1(1);   //设置左右窗口

int v2(2);

int v3(3);

int v4(4);

viewer.createViewPort(0.0, 0.0, 0.5, 0.5, v1);

viewer.setBackgroundColor(0, 0, 0, v1);



viewer.createViewPort(0.5, 0.0, 1.0, 0.5, v2);

viewer.setBackgroundColor(0, 0, 0, v2);



viewer.createViewPort(0.0, 0.5, 0.5, 1.0, v3);

viewer.setBackgroundColor(0, 0, 0, v3);



viewer.createViewPort(0.5, 0.5, 1.0, 1.0, v4);

viewer.setBackgroundColor(0, 0, 0, v4);



// The color we will be using

float bckgr_gray_level = 0.0;  // Black    设置背景颜色

float txt_gray_lvl = 1.0 - bckgr_gray_level;



// Original point cloud is white

pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_in_color_h(cloud, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl, (int)255 * txt_gray_lvl);

viewer.addPointCloud(cloud, cloud_in_color_h, "cloud_in_v1", v1);   //viewer.addPointCloud(cloud_in, cloud_in_color_h, "cloud_in_v2", v2);



pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_green(cloud_filtered1, 20, 180, 20);      // 显示绿色点云

viewer.addPointCloud(cloud_filtered1, cloud_out_green, "cloud_out1", v2); 



pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_orage(cloud_filtered2, 250, 128, 10);     //显示橘色点云

viewer.addPointCloud(cloud_filtered2, cloud_out_orage, "cloud_out2", v3);



pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_out_purple(cloud_filtered3, 255, 0, 255);      //显示紫色点云

viewer.addPointCloud(cloud_filtered3, cloud_out_purple, "cloud_out3", v4);



//viewer.setBackgroundColor(bckgr_gray_level, bckgr_gray_level, bckgr_gray_level, v2);

viewer.setSize(1280, 1024);  // Visualiser window size

//viewer.showCloud(cloud_out);

while (!viewer.wasStopped())

{

viewer.spinOnce();

}



return (0);

}



/********************************************************/

实验结果图:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值