PCL点云可视化

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

前言

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

PCL点云可视化

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

; 点云可视化例程

1. 基本的点云可视化

#include
#include
#include

#include
#include
#include

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

  if (pcl::io::loadPCDFile(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(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数据集中某帧点云进行可视化的结果:

PCL点云可视化

; 2. 给点云一点颜色

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

pcl::visualization::PCLVisualizer::Ptr visualizer(
      new pcl::visualization::PCLVisualizer("PointCloud Visualizer"));
  visualizer->setBackgroundColor(0, 0, 0);
  pcl::visualization::PointCloudColorHandlerCustom
      single_color_handler(point_cloud, 0, 255, 0);
  visualizer->addPointCloud(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函数。我这里把点云颜色设置为绿色,下图是点云显示效果:

PCL点云可视化

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

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

  pcl::PointCloud::Ptr rgb_pointcloud(
      new pcl::PointCloud);
  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
      rgb_color_handler(rgb_pointcloud);
  visualizer->addPointCloud(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函数。

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

PCL点云可视化

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(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
    rgb_color_handler(rgb_pointcloud);
visualizer->addPointCloud(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点云可视化

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

结束语

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

参考资料

  • https://pcl.readthedocs.io/projects/tutorials/en/latest/pcl_visualizer.html
  • https://pointclouds.org/documentation/classpcl_1_1visualization_1_1_p_c_l_visualizer.html

Original: https://blog.csdn.net/weixin_44613415/article/details/126517196
Author: DeepDriving
Title: PCL点云可视化

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/717660/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球