在线客服

PCL点云可视化

adminadmin 报建百科 2024-04-25 156 12
PCL点云可视化

本文已参与「新人创作礼」活动,一起开启编程创作之路。

本文首发于微信公众号【DeepDriving】,欢迎关注。

前言

在做点云处理相关的工作中,通常需要将点云进行可视化以方便我们查看处理结果。PCLVisualizerPCL中一个能够提供完备点云可视化功能的类,使用这个类可以实现基本的点云可视化、法向量显示、画各种图形、多视窗显示等功能。

本文将通过几个例程来介绍如何使用PCLVisualizer类来实现点云的可视化。

点云可视化例程

1. 基本的点云可视化

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

#include?<chrono>
#include?<iostream>
#include?<thread>

int?main(int?argc,?char**?argv)?{
??if?(argc?<?2)?{
????std::cout?<<?"Usage:?"?<<?argv[0]?<<?"?<pcd_file>\n";
????return?-1;
??}
??const?std::string?pcd_file(argv[1]);
??pcl::PointCloud<pcl::PointXYZI>::Ptr?point_cloud(
??????new?pcl::PointCloud<pcl::PointXYZI>);

??if?(pcl::io::loadPCDFile<pcl::PointXYZI>(pcd_file,?*point_cloud)?==?-1)?{
????std::cout?<<?"Can't?read?pcd?file:?"?<<?pcd_file?<<?std::endl;
????return?-1;
??}

??pcl::visualization::PCLVisualizer::Ptr?visualizer(
??????new?pcl::visualization::PCLVisualizer("PointCloud?Visualizer"));
??visualizer->setBackgroundColor(0,?0,?0);
??visualizer->addPointCloud<pcl::PointXYZI>(point_cloud,?"PointCloud");
??visualizer->setPointCloudRenderingProperties(
??????pcl::visualization::PCL_VISUALIZER_POINT_SIZE,?3,?"PointCloud");
??visualizer->addCoordinateSystem(5.0);

??while?(!visualizer->wasStopped())?{
????visualizer->spinOnce(100);
????std::this_thread::sleep_for(std::chrono::milliseconds(100));
??}

??return?0;
}

在上面的代码中,首先是从PCD文件中读取点云数据,然后实例化一个PCLVisualizer类对象visualizer来对点云进行可视化。PCLVisualizer类的几个成员函数的功能如下:

  • setBackgroundColor:用于设置显示窗口的背景颜色,颜色用RGB来表示,这里设置为黑色。
  • addPointCloud:用于把点云加载到显示窗口中,第二个参数是string类型,是一个用来标识该点云的ID,因为可以通过addPointCloud添加多个点云所以必须加ID来进行区分。
  • setPointCloudRenderingProperties:用于设置点云的渲染参数,这里设置的是点云的大小PCL_VISUALIZER_POINT_SIZE,值越大则显示的点就越大。其他的渲染参数可以参考枚举类型pcl::visualization::RenderingProperties。
  • addCoordinateSystem:显示坐标轴,XYZ三个坐标轴的颜色分别为红色R、绿色G、蓝色B

下图是用上面的代码对SemanticKITTI数据集中某帧点云进行可视化的结果:

2. 给点云一点颜色

使用上面的代码显示的点云颜色默认是白色,如果想让点云显示其他的颜色,可以通过pcl::visualization::PointCloudColorHandlerCustom给点云设置其他颜色,这样就可以通过PCLVisualizer显示彩色了。

pcl::visualization::PCLVisualizer::Ptr?visualizer(
??????new?pcl::visualization::PCLVisualizer("PointCloud?Visualizer"));
??visualizer->setBackgroundColor(0,?0,?0);
??pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZI>
??????single_color_handler(point_cloud,?0,?255,?0);
??visualizer->addPointCloud<pcl::PointXYZI>(point_cloud,?single_color_handler,
????????????????????????????????????????????"PointCloud");
??visualizer->setPointCloudRenderingProperties(
??????pcl::visualization::PCL_VISUALIZER_POINT_SIZE,?3,?"PointCloud");
??visualizer->addCoordinateSystem(5.0);

与前面的程序相比,PCLVisualizer这里需要实例化一个pcl::visualization::PointCloudColorHandlerCustom对象来设置自定义的RGB颜色,并把这个对象作为参数传递给addPointCloud函数。我这里把点云颜色设置为绿色,下图是点云显示效果:

3. 每个点都想要属于自己的颜色

上面的例子只能够让整个点云显示同一种颜色,如果每个点都想显示不同的颜色该怎么办呢?比如在自动驾驶感知任务中需要对激光点云做语义分割,也就是给每个点都赋予一个语义标签。为了直观地查看点云语义分割的结果,那么在可视化界面中就需要让每个点都显示其语义标签对应的颜色。怎么实现这个功能呢?来看下面的代码:

??pcl::PointCloud<pcl::PointXYZRGB>::Ptr?rgb_pointcloud(
??????new?pcl::PointCloud<pcl::PointXYZRGB>);
??for?(std::size_t?i?=?0;?i?<?point_cloud->size();?++i)?{
????const?auto?&point?=?point_cloud->points.at(i);
????const?auto?&label?=?labels.at(i);
????if?(KITTI_COLOR_MAP.find(label)?==?KITTI_COLOR_MAP.end())?{
??????std::cout?<<?"Invalid?label:?"?<<?label?<<?std::endl;
??????continue;
????}
????const?auto?&bgr_color?=?KITTI_COLOR_MAP.at(label);
????pcl::PointXYZRGB?rgb_point;
????rgb_point.x?=?point.x;
????rgb_point.y?=?point.y;
????rgb_point.z?=?point.z;
????rgb_point.r?=?bgr_color.at(2);
????rgb_point.g?=?bgr_color.at(1);
????rgb_point.b?=?bgr_color.at(0);
????rgb_pointcloud->push_back(std::move(rgb_point));
??}

??pcl::visualization::PCLVisualizer::Ptr?visualizer(
??????new?pcl::visualization::PCLVisualizer("PointCloud?Visualizer"));
??visualizer->setBackgroundColor(0,?0,?0);
??pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>
??????rgb_color_handler(rgb_pointcloud);
??visualizer->addPointCloud<pcl::PointXYZRGB>(rgb_pointcloud,?rgb_color_handler,
??????????????????????????????????????????????"RGB?PointCloud");
??visualizer->setPointCloudRenderingProperties(
??????pcl::visualization::PCL_VISUALIZER_POINT_SIZE,?3,?"RGB?PointCloud");
??visualizer->addCoordinateSystem(5.0);

要想给每个点都赋上颜色值,首先需要把点云格式转换为pcl::PointXYZRGB格式,并且给每个点都设置一个RGB值,我这里是根据SemanticKITTI数据集中的label文件对每个点设置其语义标签对应的颜色。PCLVisualizer这里有2个变化:

  1. 点云格式变为pcl::PointXYZRGB格式;
  2. 需要实例化一个pcl::visualization::PointCloudColorHandlerRGBField对象,并作为参数传递给addPointCloud函数。

根据每个点的语义标签显示对应颜色的效果如下图所示:

4. 多视窗显示

有的时候我们想要直观地对比不同的点云,比如对比原始点云与语义分割后的结果,或者不同分割算法对同一帧点云的语义分割结果。要想实现这种功能,可以把不同的点云放在不同的显示窗口中。PCLVisualizer允许创建多个视窗,每个视窗可以显示各自的点云。

pcl::visualization::PCLVisualizer::Ptr?visualizer(
??????new?pcl::visualization::PCLVisualizer("PointCloud?Visualizer"));

//?创建视窗1用于显示原始点云
int?view_port_1?=?1;
visualizer->createViewPort(0.0,?0.0,?0.5,?1.0,?view_port_1);
visualizer->setBackgroundColor(0,?0,?0,?view_port_1);
visualizer->addPointCloud<pcl::PointXYZI>(point_cloud,?"PointCloud");
visualizer->setPointCloudRenderingProperties(
????pcl::visualization::PCL_VISUALIZER_POINT_SIZE,?3,?"PointCloud");

//?创建视窗2用于显示语义分割后的点云
int?view_port_2?=?2;
visualizer->createViewPort(0.5,?0.0,?1.0,?1.0,?view_port_2);
visualizer->setBackgroundColor(0,?0,?0,?view_port_2);
pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB>
????rgb_color_handler(rgb_pointcloud);
visualizer->addPointCloud<pcl::PointXYZRGB>(rgb_pointcloud,?rgb_color_handler,
????????????????????????????????????????????"RGB?PointCloud",?view_port_2);
visualizer->setPointCloudRenderingProperties(
????pcl::visualization::PCL_VISUALIZER_POINT_SIZE,?3,?"RGB?PointCloud");
visualizer->addCoordinateSystem(5.0);

PCLVisualizer类的createViewPort函数用于创建视窗,创建的时候需要指定视窗的四个坐标xmin,ymin,xmax,ymax0.0~1.0范围内)和它的ID,后面再调用addPointCloud函数把点云加载到指定的视窗中去。不同的视窗加载不同的点云,这样就可以在多个视窗中显示各自的点云了,显示效果如下:

在上图中,左边为原始点云,右边为语义分割的结果。如果我们按住鼠标左键变换视角,两边的点云是一起变换的,可以让我们非常方便地去对比结果,很实用!

结束语

本文通过几个例程介绍了如何使用PCL库的PCLVisualizer类对点云进行可视化,这个类还有很多其他的功能,比如画各种形状(直线、箭头、立方体等)、显示文本、显示点云的法向量等等,由于篇幅有限本文就不一一展示了,感兴趣的读者可以通过下面参考资料里的链接去查看相关的文档。

参考资料

  • pcl.readthedocs.io/projects/tu…
  • pointclouds.org/documentati…
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!
代办报建

本公司承接江浙沪报建代办施工许可证。
联系人:张经理,18321657689(微信同号)。

喜欢0发布评论

12条评论

  • 游客 发表于 2个月前

    楼主是我最崇拜的人!http://mjx.hnmmco.com

  • 游客 发表于 2个月前

    我只看看不说话。。。http://kdhlpt.com/article/3038272.html

  • 游客 发表于 2天前

    这么版块的帖子越来越有深度了!http://www.guangcexing.net/voddetail/MMWApFg.html

发表评论

  • 昵称(必填)
  • 邮箱
  • 网址