目录
前言
点云的一些预处理操作
一、头文件及声明
#include <pcl/point_cloud.h> // 点的集合
#include <pcl/point_types.h> // PCL中支持的点类型头文件
#include <pcl/io/ply_io.h> // PLY读写类相关的头文件
#include <pcl/io/pcd_io.h> // PCD读写类相关的头文件
#include <pcl/visualization/pcl_visualizer.h> // 可视化
using namespace std;
using PointT = pcl::PointXYZ;
using CloudP = pcl::PointCloud<PointT>;
using PointN = pcl::PointNormal;
using CloudN = pcl::PointCloud<PointN>;
using PointL = pcl::PointXYZL;
using CloudL = pcl::PointCloud<PointL>;
二、新建、填充、保存、显示点云
1、新建点云
新建点云指针并分配内存
CloudP::Ptr cloud; // 空指针 cloud.reset(new CloudP); // 给指针分配内存
新建点云数据
CloudP::Ptr cloud(new CloudP); cloud->width = 1000; cloud->height = 1; // 无序点云 cloud->is_dense = false; cloud->points.resize(cloud->width * cloud->height);
is_dense(bool) ——指定points中的数据是否全部是有限的,此时为true;当数据集中包含有Inf/NaN等值时,此时为false
points.resize(int) ——需要resize,否则实际空间没有分配
vtkOutputWindow::SetGlobalWarningDisplay(0) ——去除警告信息
2、填充点云
方式一
for (auto& point : *cloud) { point.x = 1024 * rand() / (RAND_MAX + 1.0f); point.y = 1024 * rand() / (RAND_MAX + 1.0f); point.z = 1024 * rand() / (RAND_MAX + 1.0f); }
方式二
for (size_t i = 0; i < cloud->points.size(); ++i) { cloud->points[i].data[0] = 1024.0f * rand() / (RAND_MAX + 1.0f); // x cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f); cloud->points[i].data[2] = 1024.0f * rand() / (RAND_MAX + 1.0f); // z }
3、保存点云
方式一
pcl::io::savePCDFile("test.pcd", *cloud); // ASCII压缩,文件方便查看 pcl::io::savePCDFileASCII("testASCII.pcd", *cloud); // ASCII压缩,文件方便查看 pcl::io::savePCDFileBinary("testBinary.pcd", *cloud); // 二进制压缩,体积较小 pcl::io::savePCDFileBinaryCompressed("testBinaryCompressed.pcd", *cloud); // 有损压缩
方式二
// 写数据,创建不同形式 pcl::PCDWriter writer; writer.writeASCII("rabbitXYZ.pcd", cloud); writer.writeBinary("rabbitXYZbin.pcd", cloud); writer.writeBinaryCompressed("rabbitXYZbinc.pcd", cloud); pcl::io::savePCDFileBinaryCompres