【点云处理技术之PCL】PCL添加PCD文件并显示以及曲线的显示方式


读取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;
}

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

  • 6
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
要加载lvx格式的点云文件并转换为pcd文件,可以按照以下步骤操作: 1. 安装PCL库,并在代码中包含相关头文件。 2. 打开lvx文件读取文件头部信息,获取点云数据的起始位置和点云数量。 3. 定义一个结构体用于存储点云数据,结构体中包含点的x、y、z坐标以及颜色信息(如果有的话)。 4. 读取点云数据,将数据存储在定义的结构体中。 5. 将点云数据转换为pcl格式,可以使用pcl库中的PointCloud类。 6. 将转换后的点云数据保存为pcd文件。 以下是代码示例: ```c++ #include <iostream> #include <fstream> #include <vector> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> struct PointXYZRGBA { float x; float y; float z; uint8_t r; uint8_t g; uint8_t b; uint8_t a; }; int main(int argc, char** argv) { if (argc != 3) { std::cout << "Usage: " << argv[0] << " input.lvx output.pcd" << std::endl; return -1; } std::ifstream input(argv[1], std::ios::binary); if (!input.is_open()) { std::cout << "Failed to open input file." << std::endl; return -1; } // Read header information uint32_t header_size; input.read(reinterpret_cast<char*>(&header_size), sizeof(header_size)); input.seekg(header_size, std::ios::beg); uint64_t point_count; input.read(reinterpret_cast<char*>(&point_count), sizeof(point_count)); std::cout << "Point count: " << point_count << std::endl; // Read point cloud data std::vector<PointXYZRGBA> points(point_count); input.read(reinterpret_cast<char*>(points.data()), sizeof(PointXYZRGBA) * point_count); input.close(); // Convert to PCL point cloud pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>); cloud->width = point_count; cloud->height = 1; cloud->points.resize(point_count); for (size_t i = 0; i < point_count; ++i) { cloud->points[i].x = points[i].x; cloud->points[i].y = points[i].y; cloud->points[i].z = points[i].z; cloud->points[i].r = points[i].r; cloud->points[i].g = points[i].g; cloud->points[i].b = points[i].b; cloud->points[i].a = points[i].a; } // Save PCD file pcl::PCDWriter writer; writer.writeBinaryCompressed(argv[2], *cloud); return 0; } ``` 注意:这里并没有使用任何SDK,只使用了C++标准库和PCL库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值