PCl 点云可视化

#include <iostream>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/filter_indices.h>
#include <pcl/point_cloud.h>
#include <pcl/visualization/pcl_visualizer.h>
#include "pclhl.h"
int main()
{
    using io::loadPCDFile;
    std::string path = "1.txt";
    std::string path0 = "CloudPoint.pcd";
    PointCloud<PointXYZ>::Ptr cloud(new PointCloud<PointXYZ>());
       //读入数据
    readCloudFile(path, cloud);
    //int ret = pcl::io::loadPCDFile(path0, *cloud);
    //loadPCDFile("CloudPoint.pcd", *cloud);
    std::cout << cloud->size() << std::endl;
    //去除无效点
    std::vector<int>index;
    removeNaNFromPointCloud(*cloud, *cloud, index);
    //=======================可视化=======================
    using pcl::visualization::PCLVisualizer;
    using pcl::visualization::PointCloudColorHandlerGenericField;
    //创建视窗对象,并给标题栏定义一个名称"3D Viewer",我们将它定义为boost::shared_ptr智能共享指针。
    //这样可以保证该指针在整个程序全局使用,而不引起内存错误,通常情况下,用户不需要这样做。
    boost::shared_ptr<PCLVisualizer> viewer(new PCLVisualizer("3D Viewer"));
    //视窗的背景色可以设为用户喜欢的任意RGB颜色,本例中,我们将它设置为蓝色。
    viewer->setBackgroundColor(0, 0, 255);
    // 按照z字段进行渲染
    PointCloudColorHandlerGenericField<PointXYZ> fildColor(cloud, "z"); 
    /*这是最重要的一行,我们将点云添加到视窗对象中,并定义一个唯一的字符串作为ID号,
    利用此字符串保证在其他成员方法中也能标识引用该点云,多次调用addPointCloud(),
    可以实现多个点云的添加,每调用一次就创建一个新的ID号,如果想更新一个已经显示的点云,
    用户必须先调用removePointCloud(),并提供需要更新的点云的ID号。(注:PCL 的1.1及以上版本提供一个新的API,
    updatePointCloud(),通过该接口,不必手动调用removePointCloud(),就可实现点云的更新)。
    这是addPointCloud()函数诸多重载函数中最基本的一种,其他类型的函数用于处理不同类型的点云、显示法线等。*/
    viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");
    // 设置点云大小,用于改变显示点云的尺寸。用户可以利用该方法控制点云在视窗中的显示方式。
    viewer->setPointCloudRenderingProperties(visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud"); 
    /*查看复杂的点云经常会让用户感到没方向感,为了让用户保持正确的坐标判断,需要显示坐标系统方向,
    可以通过使用X(红色)、Y(绿色) 、Z(蓝色)圆柱体代表坐标轴的显示方式来解决,圆柱体的大小通过scale参数控制。本例中,
    我们将scale参数设置为1.0,该值也为缺省值,该方法的另一重载函数可实现对点云中的每个点的坐标方向进行显示。*/
    viewer->addCoordinateSystem(1.0);
    //每次调用spinOnce都给视窗处理事件的时间,这样允许鼠标键盘等交互操作,此外还有一种spin的重载方法,它只需调用一次。
    while (!viewer->wasStopped())
    {
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }

    return 0;

    
}
原文地址:https://www.cnblogs.com/hsy1941/p/11835366.html