PCL学习总结PCL添加PCD文件并显示的不同方式以及PCL中的其他显示方法

Posted 非晚非晚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PCL学习总结PCL添加PCD文件并显示的不同方式以及PCL中的其他显示方法相关的知识,希望对你有一定的参考价值。

读取PCD文件和显示点云信息是PCL中的基本操作,这里介绍3种点云显示方式,单个PCD显示、多个PCD在同一个窗口显示和逐个显示多个PCD文件。在这里也会介绍其他的显示方法,比如plotter显示等。

pcl_visualization库建立了能够快速建立原型的目的和可视化算法对三维点云数据操作的结果。类似于opencv的highgui例程显示二维图像,在屏幕上绘制基本的二维图形。

1. 单个PCD文件读取并显示

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>

int user_data;

//函数实现对可视化对象背景颜色的设置
void  viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor (1.0, 0.5, 1.0);//设置背景颜色
    pcl::PointXYZ o;//设置圆心位置
    o.x = 1.0;
    o.y = 0;
    o.z = 0;
    viewer.addSphere (o, 0.25, "sphere", 0);//添加圆球几何对象
    std::cout << "i only run once" << std::endl;
}
//循环显示
void  viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
    static unsigned count = 0;
    std::stringstream ss;
    ss << "Once per viewer loop: " << count++;
    viewer.removeShape ("text", 0);
    viewer.addText (ss.str(), 200, 300, "text", 0);//添加文本
    
    //FIXME: possible race condition here:
    user_data++;
}
    
int  main ()
{
    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>);
    pcl::io::loadPCDFile ("/home/liqiang/Data/PCD/classic/rabbit.pcd", *cloud);//加载点云文件,如果读取不成功返回-1
    
    pcl::visualization::CloudViewer viewer("Cloud Viewer");//viewer对象,标题
    
    //blocks until the cloud is actually rendered
    viewer.showCloud(cloud);
    
    //use the following functions to get access to the underlying more advanced/powerful
    //PCLVisualizer
    
    //This will only get called once
    //只调用一次
    viewer.runOnVisualizationThreadOnce (viewerOneOff);//背景设置,只调用一次
    
    //This will get called once per visualization iteration
    //该注册函数在渲染输出时每次都调用
    viewer.runOnVisualizationThread (viewerPsycho);//
    while (!viewer.wasStopped ())
    {
    //you can also do cool processing here
    //FIXME: Note that this is running in a separate thread from viewerPsycho
    //and you should guard against race conditions yourself...
    user_data++;
    }
    return 0;
}

显示结果:
在这里插入图片描述

2. 读取多个PCD文件并在同一窗口显示

#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>

using pcl::visualization::PointCloudColorHandlerCustom;
typedef pcl::PointXYZ PointT;

int main (int argc, char** argv)
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_1(new pcl::PointCloud<pcl::PointXYZ>); //第一幅点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_2(new pcl::PointCloud<pcl::PointXYZ>); //第一幅点云
    if (pcl::io::loadPCDFile("/home/liqiang/Data/PCD/classic/ism_test_horse.pcd", *cloud_1) == -1)
    {
        PCL_ERROR("Couldn't read file could_1.pcd\\n");
        return (-1);
    }
    if (pcl::io::loadPCDFile("/home/liqiang/Data/PCD/classic/ism_test_michael.pcd", *cloud_2) == -1)
    {
        PCL_ERROR("Couldn't read file could_2.pcd\\n");
        return (-1);
    }

    //pcl::visualization::CloudViewer Viewer("Viewer"); //viewer对象,标题
    pcl::visualization::PCLVisualizer * Viewer = new pcl::visualization::PCLVisualizer (argc, argv, "Viewer");

    //blocks until the cloud is actually rendered
    int v1(0);
    int v2(1);
    Viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1); //第一幅窗口
    Viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2); //第二幅图像

    PointCloudColorHandlerCustom<PointT> tgt_h(cloud_1, 0, 255, 0);//设置颜色
    PointCloudColorHandlerCustom<PointT> src_h(cloud_2, 255, 0, 0);

    Viewer->addPointCloud(cloud_1, tgt_h, "cloud_in_v1", v1);
    Viewer->addPointCloud(cloud_2, src_h, "cloud_in_v2", v2);

    Viewer->spin();
    return 0;
}

显示效果如下所示:
在这里插入图片描述

3. 读取多个文件并逐步显示

读取11个pcd文件,每次只显示一个pcd文件,点击关闭窗口之后会显示下一副点云图像,直到所有的窗口都关闭。

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/filter_indices.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>

using namespace std;

//int main()
int main(int argc, char **argv)
{
    //***************************read PCD file*****************************************
    pcl::PointCloud<pcl::PointXYZ>::Ptr source(new pcl::PointCloud<pcl::PointXYZ>());
    //输入点云路径
    string addr = "/home/liqiang/Data/PCD/classic/test/"; //点云路径
    string filename;
    //待处理点云个数
    int num = 11;

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("Viewer"));

    //背景颜色
    viewer->setBackgroundColor(0, 0, 0);
    //创建窗口
    int vp;
    viewer->createViewPort(0.0, 0.0, 1.0, 1.0, vp); //整个窗口

    for (int i = 1; i <= num; i++) //逐个显示
    {
        if (i > 1)  //第一个不做删除
            viewer->removePointCloud(to_string(i - 1)); //删除点云
        //filename 为点云文件名
        filename = addr + "ism" + to_string(i) + ".pcd"; //文件名
        //读取点云
        pcl::io::loadPCDFile(filename, *source);

        //设置点云颜色
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> source_color(source, 0, 255, 0);

        viewer->addPointCloud<pcl::PointXYZ>(source, source_color, to_string(i), vp);
        viewer->spin();//关闭窗口才能显示另外一个
    }
    //显示坐标系
    viewer->addCoordinateSystem(1.0);
}

显示效果如下图所示:
在这里插入图片描述

4. 画曲线

#include <vector>
#include <iostream>
#include <utility>
#include <pcl/visualization/pcl_plotter.h>

int main()
{
    //defining a plotter
    pcl::visualization::PCLPlotter *plotter = new pcl::visualization::PCLPlotter();

    // 定义一个多项式 y = 2 + 3x + x^2. 由vector存储各项系数,从x的零次项系数开始……
    std::vector<double> func1(3, 0);
    func1[0] = 2;
    func1[1] = 3;
    func1[2] = 1;

    // 将多项式载入到绘图器重,设定X轴范围,和曲线名称
    plotter->addPlotData(func1, -10, 10, "y = 2 + 3x + x^2");

    //设置属性
	plotter->setShowLegend(true);//是否显示名称:y = 2 + 3x + x^2
	plotter->setBackgroundColor(1, 1, 1);//背景
	plotter->setTitle("curve");
	plotter->setXTitle("x");
	plotter->setYTitle("y");

    //显示曲线
    plotter->plot();

    return 0;
}

显示结果如下图所示:
在这里插入图片描述

以上是关于PCL学习总结PCL添加PCD文件并显示的不同方式以及PCL中的其他显示方法的主要内容,如果未能解决你的问题,请参考以下文章

PCL学习笔记:PCL官方教程学习

PCL系列——读入PCD格式文件

001 :PCL 的基本文件类型PCD的读入和写入操作

显示pcd文件头

QT+PCL 点云学习

QT+PCL 点云学习