#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/common/transforms.h>
#include <pcl/filters/passthrough.h>
#include<pcl/common/common.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
typedef pcl::PointXYZRGB PointT; PointXYZ-->PointXYZRGB
typedef pcl::PointCloud<PointT> PointCloud;
// 旋转矩阵的具体定义 (请参考 https://en.wikipedia.org/wiki/Rotation_matrix)
int
main(int argc, char** argv)
{
//输入ply
std::string src_cloud_path = "pointCloud_trunc_passthroughed_.ply";
PointCloud::Ptr cloud_in(new PointCloud);
pcl::io::loadPLYFile(src_cloud_path, *cloud_in);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZRGB>); //PointXYZ-->PointXYZRGB
//pcl::PointXYZ minPt, maxPt;
//pcl::getMinMax3D(*cloud_in, minPt, maxPt);
// 创建滤波器对象
pcl::PassThrough<pcl::PointXYZRGB> pass; //设置滤波器对象 PointXYZ-->PointXYZRGB
pass.setInputCloud(cloud_in);//设置输入点云
pass.setFilterFieldName("z"); //设置过滤时所需要的点云类型的z字段
//pass.setFilterLimits(minPt.z + 0.2, maxPt.z - 0.1); //设置在过滤字段上的范围
pass.setFilterLimits(1000.0,1400.0);
//pass.setFilterLimitsNegative(false); //设置保留范围内的还是过滤掉范围内的:算法内部默认false,即保留范围内的,滤掉范围外的;若设为true,则保留范围外的,滤掉范围内的;
pass.filter(*cloud_filtered); //执行滤波
//可视化单个点云
pcl::visualization::PCLVisualizer viewer("registration Viewer");
viewer.addPointCloud(cloud_filtered, "source cloud");
//执行一个 while 循环,每次调用 spinOnce 都给视窗处理事件的时间,允许鼠标键盘等交互操作
while (!viewer.wasStopped())
{
viewer.spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(10000));
}
//pcl::io::savePLYFileASCII("cartman_passthroughed_phase1.ply", *cloud_filtered); //将数据存储到磁盘
pcl::io::savePLYFile("pointCloud_trunc_passthroughed_2.ply", *cloud_filtered);
return (0);
}