PCL显示和保存3d点云

发布于:2021-06-11 04:10:21

1、PCL的IO模块

加载主要用到IO模块里的几个类:pcl::io::loadPCDFile、pcl::PCDReader和 pcl::PCDWriter等,他们的成员函数也基本只用到一个,第一个类直接定义对象将PCD加载到定义的点云cloud中,第二个类是通过read(cloud,cloud_name)函数将PCD文件读取到点云cloud中,同理,第三个类是将点云数据写入到.pcd文件中。


2、PCL的visualization模块

显示点云主要用到两个类:pcl::visualization::PCLVisualizer和pcl::visualization::CloudViewer。
pcl::visualization::PCLVisualizer 的成员函数主要用到的有:
具体参见官方库


    addPointCloud(cloud,geometry_handler,cloud_name,viewport)addLine(线第一个点,线第二个点,r,g,b,id,viewport)addsphere(球心,半径,id,viewport)addPlane(*面模型参数coefficients,x,y,z,id,viewport)addCone(coefficients,id,viewport) 添加圆锥spin()spinOnce()wasStopped()

pcl::visualization::CloudViewer的成员函数主要有:


    showcloud(cloud)wasStopped() 检查gui是否退出runOnVisualizationThreadOnce()runOnVisualizationThread()

3、PCL的filter模块

点云滤波主要有双边滤波,高斯滤波,条件滤波、直通滤波和基于随机采样一致性滤波。采取点云滤波是因为:


    点云数据密度不规则需要*滑处理需要去除离群点简化点云数据,下采样(downsample)去除噪音数据

a.直通滤波器

主要用到类 pcl::PassThrough,其主要成员函数如下:


    setFilterFieldName(field_name) 设置滤波点云类型字段

    setFilterLimits(limit_min,limit_max) 设置过滤字段上的范围

    getFilte斜体样式rLimitsNegative(bool) *ture:返回间隔外数据 *
    false:返回间隔内数据

    setInputCloud(cloud) 设置输入点云

    filter(PointCloud & output) 保存过滤后的点云数据

    filter(&indices) 保存过滤后的点云索引


b.voxelGrid滤波器

对点*邢虏裳瑅oxelGrid类通过创建一个三维体素格,利用体素格的重心来*似显示体素中其他点。主要用到类:pcl::voxelGrid,成员函数如下:


    setLeafSize(float lx,float ly,float lz) 设置体素网格叶子大小setDownsampleAllData(bool downsample) ture:对所有字段下采样 false:仅对xyz进行下采样setInputCloud(cloud) 设置输入点云filter(PointCloud & output) 保存过滤后的点云数据

c.离群值滤波器

首先要计算出离群点,计算点云中每个点到它所有临*点距离的*均值,从整个点云全局来看,*均值满足高斯分布,若某个点的*均距离在标准范围之外,即全局距离*局值和*方差,则为离群点。
主要用到的类 pcl::StatisticalOutlierRemoval,成员函数如下:


    setMeanK(int nr_k) 设置在进行统计是考虑查询点邻*点数setStddevMulThresh(double std_mul) 设置标准偏差乘数阈值setInputCloud(cloud) 设置输入点云filter(PointCloud & output) 保存过滤后的点云数据

4、显示代码

#include
#include
#include
#include
#include
#include

using namespace std;

int main(int argc,char **argv)
{
pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);
pcl::io::loadPCDFile("test1.pcd",*cloud);

pcl::StatisticalOutlierRemoval sor;
sor.setInputCloud (cloud);
sor.setMeanK (50);
sor.setStddevMulThresh (1.0);
sor.filter (*cloud_filtered);


pcl::PCDWriter writer;
writer.write("young2.pcd",*cloud_filtered,false);

//使用pcl::visualization类显示点云
pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer ("3d cloud"));
viewer->addPointCloud (cloud,"sample cloud");
viewer->addSphere(cloud->points[0],0.2,0.0,0.0,255.0,"Sphere");
viewer->addLine(cloud->points[0],cloud->points[cloud->size()-1],"line");
viewer->spin();



//使用pcl::visualization::CloudViewer显示点云
/*pcl::visualization::CloudViewer viewer("Cloud viewer");

while(!viewer.wasStopped())
{
viewer.showCloud(cloud);
}*/


return 0;
}

结果如下:


相关推荐

最新更新

猜你喜欢