【点云学习2.2】可视化txt、pcd文件(PCL)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本次介绍使用PCL库,可视化txt、pcd点云文件。代码为c++。
在PCL中,无论是什么类型的点云文件,都需要先进行读取,然后再转换成PCL可以使用的类别,最后进行可视化。
读取部分以前已经写过了,这里不再赘述,不清楚的朋友可以参考这个文章:【点云学习1.3】读取txt、pcd文件(PCL)

可视化一般可以分为两种方法:cloud_viewer和PCLVisualizer,个人感觉一般后者更常用一些。


一、cloud_viewer

个人基本不用这个方法,所以在此也就简单介绍了。
首先介绍引入的头文件。这里以pcd文件为例,txt请参考前言部分的链接。

#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <iostream>

之后定义一个函数,命名为visualization_CloudViewer。

void visualization_CloudViewer(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
    pcl::visualization::CloudViewer viewer("Cloud Viewer"); // 标题设置为Cloud Viewer
    viewer.showCloud(cloud);

	while (!viewer.wasStopped())
	{
		
	}
}

具体来说函数中第一行定义了一个可视化窗口,第二行把点云添加进窗口进行展示,用法相对简单。可视化结果如下:
在这里插入图片描述


二、PCLVisualizer

个人一般更倾向与使用PCLVisualizer,功能相对更强大一些。老规矩,先介绍头文件:

#include <iostream>
#include <boost/thread/thread.hpp>

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>

这里注意第二个头文件,boost那个,在PCLVisualizer使用中一般需要定义一个智能共享指针,所以需要引入。此时注意有可能在CMakeLists.txt中也需要单独加上这个。
读取文件数据的代码就不在说明了,这里只介绍可视化的函数。定义一个函数:visualization_PCLVisualizer(cloud);

void visualization_PCLVisualizer(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
    /* 创建窗口对象,并设置名称为“3D Viewer” 。boost::shared_ptr为智能共享指针,这样可以保证指针在程序中全局使用,而不引起内存错误*/
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cloud, 255, 0, 0);    // 设置点云颜色
    viewer->setBackgroundColor (255, 255, 255); //设置视窗的背景色,可以任意设置RGB的颜色,这里是设置为白色
    viewer->addPointCloud<pcl::PointXYZ> (cloud, color, "cloud"); // 核心代码,添加点云和颜色,并且定一个字符串作为ID号,多次调用addPointCloud可实现多个添加。
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");    // 设置点的大小,这里注意ID号与添加的点云一致
    viewer->addCoordinateSystem (30);  // 显示一个坐标轴,以防没有方向感。X(红色)Y(绿色 )Z (蓝色),30代表轴的大小
    viewer->initCameraParameters(); //通过设置照相机参数使得从默认的角度和方向观察点云
    
    while (!viewer->wasStopped()) // 直到窗口关闭才结束循环
    { 
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}  
}

至于每行代码的含义,我也已经在程序中注释的很详细了。
具体展示结果如下:
在这里插入图片描述


最后

如果是windows+PCL,建议直接复制代码到自己配置好的工程项目中。
如果是Ubuntu,需要新建一个名为build的文件夹,将pcd文件放入其中,在build目录下,cmake …;make;./+程序名
完整代码、CMakeLists与pcd等文件:github链接
cloud_viewer代码:

#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <iostream>

void visualization_CloudViewer(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
    pcl::visualization::CloudViewer viewer("Cloud Viewer"); // 标题设置为Cloud Viewer
    viewer.showCloud(cloud);

	while (!viewer.wasStopped())
	{
		
	}

}


int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile ("ism_test.pcd", *cloud);    // 解引用智能指针

    std::cout << "原始点云数量: " << cloud->points.size() << std::endl;

    visualization_CloudViewer(cloud);
  
    return 0;
}

PCLVisualizer代码:

#include <iostream>
#include <boost/thread/thread.hpp>

#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>

void visualization_PCLVisualizer(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
    /* 创建窗口对象,并设置名称为“3D Viewer” 。boost::shared_ptr为智能共享指针,这样可以保证指针在程序中全局使用,而不引起内存错误*/
    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));  

    pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cloud, 255, 0, 0);    // 设置点云颜色
    viewer->setBackgroundColor (255, 255, 255); //设置视窗的背景色,可以任意设置RGB的颜色,这里是设置为白色
    viewer->addPointCloud<pcl::PointXYZ> (cloud, color, "cloud"); // 核心代码,添加点云和颜色,并且定一个字符串作为ID号,多次调用addPointCloud可实现多个添加。
    viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 2, "cloud");    // 设置点的大小,这里注意ID号与添加的点云一致
    viewer->addCoordinateSystem (30);  // 显示一个坐标轴,以防没有方向感。X(红色)Y(绿色 )Z (蓝色),30代表轴的大小
    viewer->initCameraParameters(); //通过设置照相机参数使得从默认的角度和方向观察点云
    
    while (!viewer->wasStopped()) // 直到窗口关闭才结束循环
    { 
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}  
}

int main()
{
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::io::loadPCDFile ("ism_test.pcd", *cloud);   // 读取pcd文件

    std::cout << "原始点云数: " <<cloud->points.size() <<std::endl;

    visualization_PCLVisualizer(cloud);


    return 0;
}
  • 50
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值