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

}

结果为:

猜你喜欢

转载自www.cnblogs.com/kerngeeksund/p/11569258.html