• PCL学习之点云可视化:坐标字段、随机、单一颜色、法向量


    pcl中几种常见的点云渲染方式

    (1)颜色区别深度

    此方法在PointCloudColorHandlerGenericField类中实现,该将不同的深度值显示为不同的颜色,实现以颜色区分深度的目的,PointCloudColorHandlerGenericField方法是将点云按深度值(“x”、“y”、"z"均可)的差异着以不同的颜色进行渲染。

    #include <pcl/point_cloud.h>
    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <vector>
    using namespace std;
    int main(int argc, char* argv[])
    {
        pcl::PointCloud<pcl::PointXYZ>::Ptr Cloud(new pcl::PointCloud<pcl::PointXYZ>);
        
        pcl::io::loadPCDFile("./biansu.pcd", *Cloud);//读入点云数据
     
        pcl::visualization::PCLVisualizer viewer("display");
        viewer.setBackgroundColor(0, 0, 0);
        
        pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(Cloud, "z");//按照z字段进行渲染
        viewer.addPointCloud<pcl::PointXYZ>(Cloud, fildColor, "sample");//显示点云,其中fildColor为颜色显示
        viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");//设置点云大小
     
        while (!viewer.wasStopped())
        {
            viewer.spinOnce();
        }
     
     
        return 0;
    }

    按x坐标中值显示

    按z坐标中值显示

    (2)显示点云颜色特征

    该方法(PointCloudColorHandlerRGBField)要求点云类型包含RGB三个颜色分量,即该方法是直接显示点云中各个点的RGB属性字段信息,而不是通过对点云着色显示不同颜色。

    #include <iostream>
    #include <pcl/point_cloud.h>
    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <pcl/io/io.h>
    
    using namespace std;
    using namespace pcl;
    using namespace io;
    
    int main() {
        PointCloud<PointXYZRGB>::Ptr cloud(new PointCloud<PointXYZRGB>);
    
        if (pcl::io::loadPCDFile("./biansu.pcd", *cloud) == -1) {
            cerr << "can't read file biansu.pcd" << endl;
            return -1;
        }
    
        boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
        pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);
    
        viewer->addPointCloud<pcl::PointXYZRGB>(cloud, "biansu cloud");
        viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "biansu cloud"); // 设置点云大小
    
        while (!viewer->wasStopped())
        {
            viewer->spinOnce(100);
            boost::this_thread::sleep(boost::posix_time::microseconds(100000));
        }
    
        return 0;
    }

    显示结果如下:

    (3)自定义点云颜色特征

    该方法(PointCloudColorHandlerCustom)适用于任何格式点云,不要求点云类型包含RGB三个颜色分量,即将id为"sample cloud"的点云作为一个整体进行着色。

    #include <iostream>
    #include <pcl/point_cloud.h>
    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <pcl/io/io.h>
    
    using namespace pcl;
    using namespace io;
    
    int main()
    {
        PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);
    
        if (pcl::io::loadPCDFile("./biansu.pcd", *cloud) == -1) {
            std::cerr << "can't read file biansu.pcd" << endl;
            return -1;
        }
    
        boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
    
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255,20,147); //DeepPink
    
        viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
        //    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR, 0,1,1, "sample cloud"); //这也是一种设置颜色的方法,0,1,1是r,g,b除以255后的值
        viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");//设置点云大小

       while (!viewer->wasStopped()) { viewer->spinOnce(100); boost::this_thread::sleep(boost::posix_time::microseconds(100000)); } return 0; }

     (4)随机生成颜色

    #include <iostream>
    #include <pcl/point_cloud.h>
    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/visualization/pcl_visualizer.h>
    #include <pcl/io/io.h>
    
    using namespace pcl;
    using namespace io;
    
    int main(int argc, char* argv[])
    {
        pcl::PointCloud<pcl::PointXYZ>::Ptr Cloud(new pcl::PointCloud<pcl::PointXYZ>);
    
        pcl::io::loadPCDFile("./biansu.pcd", *Cloud);
    
        pcl::visualization::PCLVisualizer viewer("biansu");
        viewer.setBackgroundColor(0, 0, 0);
    
        pcl::visualization::PointCloudColorHandlerRandom<pcl::PointXYZ> RandomColor(Cloud);
        viewer.addPointCloud<pcl::PointXYZ>(Cloud, RandomColor, "sample");
        viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample");
    
        while (!viewer.wasStopped())
        {
            viewer.spinOnce();
        }
    
        return 0;
    }

    结果为:

    (4)法向量的颜色表示

    #include <pcl/point_types.h>
    #include <pcl/io/pcd_io.h>
    #include <pcl/kdtree/kdtree_flann.h>
    #include <pcl/features/normal_3d.h>
    #include <pcl/surface/gp3.h>
    #include <pcl/visualization/pcl_visualizer.h>
    int main()
    {
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    
        pcl::io::loadPCDFile("./biansu.pcd", *cloud);//读入点云数据
    
        // Normal estimation*
        pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
        pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
        //建立kdtree来进行近邻点集搜索
        pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
        //为kdtree添加点云数据
        tree->setInputCloud(cloud);
    
        n.setInputCloud(cloud);
        n.setSearchMethod(tree);
        //点云法向计算时,需要搜索的近邻点大小
        n.setKSearch(20);
        //开始进行法向计算
        n.compute(*normals);
        //* normals should not contain the point normals + surface curvatures
    
        //显示类
        pcl::visualization::PCLVisualizer viewer("Cloud Viewer");
    
        //设置背景色
        viewer.setBackgroundColor(0, 0, 0);
    
        //按照z值进行渲染点的颜色
        pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z");
    
        //添加需要显示的点云数据
        viewer.addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
    
        //设置点显示大小
        viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");
    
        //添加需要显示的点云法向。cloud为原始点云模型,normal为法向信息,1表示需要显示法向的点云间隔,即每1个点显示一次法向,0.01表示法向长度。
        viewer.addPointCloudNormals<pcl::PointXYZ, pcl::Normal>(cloud, normals, 1, 0.01, "normals");
    
        while (!viewer.wasStopped())
        {
            viewer.spinOnce();
        }
    
    }

    结果为:

  • 相关阅读:
    day10函数名称空间与作用域(3)
    day10函数参数使用(2)
    day10函数基础(1)
    文件处理
    vue打包时semver.js版本报错
    js修改日期
    vue click事件获取当前元素属性
    js截取关键字之后的字符串
    css 清除浮动
    纯CSS绘制三角形
  • 原文地址:https://www.cnblogs.com/Glucklichste/p/11569258.html
Copyright © 2020-2023  润新知