一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法

官网链接:Point Cloud Library (PCL): Module visualization
参考博客:PCL可视化

一、PCL可视化概述

构建pcl_visualization库的目的是能够快速原型化和可视化对3D点云数据运行的算法的结果。与OpenCV用于显示2D图像和在屏幕上绘制基本2D形状 highgui例程类似,该库提供:

  • 用于以 pcl::PointCloud
  • 从点集或参数方程中绘制屏幕上的基本3D形状(例如,圆柱体,球体,线条,多边形等)的方法;
  • 用于2D绘图的直方图可视化模块(PCLHistogramVisualizer);
  • 用于 pcl:😛 ointCloud
  • pcl::RangeImage可视化模块。

二、简单点云可视化

CloudView类不能在多线程应用程序中使用,可以通过在类的最前面放下面三行代码解决。

#include
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);

#include
#include
#include
#include

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);

    user_data++;
}

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile("./maize.pcd", *cloud);
    pcl::visualization::CloudViewer viewer("Cloud Viewer");

    viewer.showCloud(cloud);

    viewer.runOnVisualizationThreadOnce(viewerOneOff);

    viewer.runOnVisualizationThread(viewerPsycho);
    while(!viewer.wasStopped())
    {
        user_data++;

    }
    return 0;
}

一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法
  • ubuntu下工具显示
sudo apt-get install pcl-tools  #&#x5B89;&#x88C5;pcl_tools
pcl_viewer maize.pcd

三、可视化深度图像

3.1 两种可视化方法

  • 3D视窗中以点云形式可视化
  • 将深度值映射为不同的颜色,以彩色图方式可视化深度图像

3.2代码示例

#include

#include
#include
#include

using namespace pcl;
using namespace std;

float angular_resolution_x = 0.5f, angular_resolution_y = angular_resolution_x;
RangeImage::CoordinateFrame coordinate_frame = RangeImage::CAMERA_FRAME;
bool live_update = true;

void setViewerPose(pcl::visualization::PCLVisualizer&viewer,const Eigen::Affine3f& viewer_pose)
{
    Eigen::Vector3f pos_vector = viewer_pose * Eigen::Vector3f(0, 0, 0);
    Eigen::Vector3f look_at_vector = viewer_pose.rotation()*Eigen::Vector3f(0, 0, 1) + pos_vector;
    Eigen::Vector3f up_vector = viewer_pose.rotation()*Eigen::Vector3f(0, -1, 0);
    viewer.setCameraPosition(pos_vector[0], pos_vector[1], pos_vector[2],
        look_at_vector[0], look_at_vector[1], look_at_vector[2],
        up_vector[0], up_vector[1], up_vector[2]);

}

int main()
{
    angular_resolution_x = deg2rad(angular_resolution_x);
    angular_resolution_y = deg2rad(angular_resolution_y);
    PointCloud<PointXYZ>::Ptr point_cloud_ptr(new pcl::PointCloud<PointXYZ>);
    PointCloud<PointXYZ>& point_cloud = *point_cloud_ptr;
    Eigen::Affine3f scene_sensor_pose(Eigen::Affine3f::Identity());
    string filename = "room_scan1.pcd";
    if(pcl::io::loadPCDFile(filename, point_cloud)==-1)
    {
        std::cout << "Was not able to open file \"" << filename << "\".\n";
        return 0;
    }
    scene_sensor_pose = Eigen::Affine3f(Eigen::Translation3f(point_cloud.sensor_origin_[0], point_cloud.sensor_origin_[1], point_cloud.sensor_origin_[2]))*Eigen::Affine3f(point_cloud.sensor_orientation_);

    float noise_level = 0.0;
    float min_range = 0.0f;
    float border_size = 1;
    RangeImage::Ptr range_image_ptr(new RangeImage);
    RangeImage& range_image = *range_image_ptr;
    range_image.createFromPointCloud(point_cloud, angular_resolution_x, angular_resolution_y, deg2rad(360.0f), deg2rad(180.0f), scene_sensor_pose, coordinate_frame, noise_level, border_size);

    visualization::PCLVisualizer viewer("3D Viewer");
    viewer.setBackgroundColor(1, 1, 1);
    visualization::PointCloudColorHandlerCustom<PointWithRange> range_image_color_handler(range_image_ptr, 0, 0, 0);
    viewer.addPointCloud(range_image_ptr, range_image_color_handler, "range image");
    viewer.initCameraParameters();
    setViewerPose(viewer, range_image.getTransformationToWorldSystem());

    visualization::RangeImageVisualizer range_image_widget("Range Image");
    range_image_widget.showRangeImage(range_image);

    while (!viewer.wasStopped())
    {

        range_image_widget.spinOnce();
        viewer.spinOnce();

        if(!live_update)
        {
            scene_sensor_pose = viewer.getViewerPose();

            range_image.createFromPointCloud(point_cloud, angular_resolution_x, angular_resolution_y,
                pcl::deg2rad(360.0f), pcl::deg2rad(180.0f),
                scene_sensor_pose, pcl::RangeImage::LASER_FRAME, noise_level, min_range, border_size);

            range_image_widget.showRangeImage(range_image);
        }
    }
}

一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法

四、PCLVisualizer可视化类

4.1 简要介绍对于3D视窗的操作:

  • Q键退出视窗应用窗口
  • R键居中并缩放整个点云
  • 使用鼠标左键单击或拖动旋转窗口
  • 鼠标滚轮或鼠标右键上下拖动,实现放大缩小
  • 滚轮单机或拖动将会移动视窗

4.2 可实现功能

具体代码参考博客:PCL可视化 PCLVisualizer可视化类

  • 改变背景颜色改变坐标轴
  • 可视化点云颜色特征
  • 点云着色
  • 可视化点云法线和其它特征
  • 绘制普通形状
  • 多视口显示
  • 自定义交互
    一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法

; 五、PCLPlotter可视化直方图

PCL官方文档:PCLPloter
PCLPlotter提供一个直接简单的绘图接口,可绘制 二维图形、多项式函数、特征直方图 (FPFH)等。利用PCLPlotter绘图步骤:

  1. 声明PCLPlotter对象;
  2. 利用addPlotData()函数添加绘图所需的函数或数据;
  3. 添加窗口特性。可以调整窗口大小和标题设置;
  4. 显示绘图。

  5. addPlotData函数
    利用addPlotData()函数,用户可以为所绘制图形添加用户设定的颜色,如果不进行设置,则绘图对象将会依据颜色表随机赋色

    一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法
  6. 绘图效果和MATLAB类似
    一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法

注:可以绘制函数动画

Original: https://blog.csdn.net/weixin_43949950/article/details/126391060
Author: SUN&LIGHT
Title: 一文读懂PCL可视化,CloudView类、PCLVisualizer可视化类、PCLPlotter可视化方法

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

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

(0)

大家都在看

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