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

}

結果爲:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章