PCL点云根据强度着色绘图

  • Post author:
  • Post category:其他


  • 刚刚在网上搜了一下,使用 PCL 库,根据点云数据的强度的大小,对点云进行着色的程序,并没有找到特别合适的,于是我参考网上的一个教程,稍微改写了一下。
  • 参考链接:

    PCL可视化点云颜色特征

  • 参考根据 z 坐标值着色的程序:
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_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<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);

    if (io::loadPLYFile("bunny.ply", *cloud) == -1) { // 读取.ply文件
        cerr << "can't read file bunny.pcd" << endl;
        return -1;
    }

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	
    // 关键语句
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z"); // 按照z字段进行渲染
    
    viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); // 设置点云大小
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }
    return 0;
}
  • 其中关键的语句就是
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z"); // 按照z字段进行渲染
  • 将其中的 ‘z’ 改为 ‘intensity’ 即可
pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "intensity"); // 按照 intensity 强度字段进行渲染
  • 完整程序
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/ply_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<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>);

    if (io::loadPLYFile("bunny.ply", *cloud) == -1) { // 读取.ply文件
        cerr << "can't read file bunny.pcd" << endl;
        return -1;
    }

    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	
    // 关键语句
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "intensity"); // 按照 intensity 强度字段进行渲染
    
    viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); // 设置点云大小
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }
    return 0;
}
  • 注意:以上程序我并没有运行过,因为我导入的不是 ply 文件,我用的是 .pcd 文件,但是替换以上一些关键语句之后,发现可以使用
  • 以下程序是我使用的着色函数,可以参考
// 按强度可视化 1 个点云着色
void VisualClouds(pcl::PointCloud<pcl::PointXYZI>::Ptr &cloud_src)
{
    // 创建1个可视化窗口
    boost::shared_ptr<pcl::visualization::PCLVisualizer> MView (new pcl::visualization::PCLVisualizer ("My program"));
    pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> fildColor(cloud_src, "intensity"); // 按照intensity字段进行渲染

    int v1(0);
    MView->createViewPort (0.0, 0.0, 1, 1.0, v1);
    MView->setBackgroundColor (0.3, 0.3, 0.3, v1);
    MView->addText ("Raw point clouds", 10, 10, "v1_text", v1);

    MView->addPointCloud<pcl::PointXYZI> (cloud_src, fildColor, "sample cloud",v1);
    MView->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud", v1); // 设置点云大小

    MView->spin();
}
  • 使用的时候直接在主函数调用即可:VisualClouds(test);



版权声明:本文为m0_52162112原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。