个人记录,不喜勿喷。
分享给有需要的人,代码质量勿喷。
一、头文件
#include <iostream> //标准C++库中的输入输出类相关头文件。
#include <pcl/io/pcd_io.h> //pcd 读写类相关的头文件。
#include <pcl/point_types.h> //PCL中支持的点类型头文件。
二、读点云
参考:从PCD文件中读取点云数据-PCL中国|点云库PCL|Point Cloud Library|点云|点云产学研资料-PCL中国 (pclcn.org)
/* 读点云 */
void ReadPCD(const std::string &xjFilePath)
{
//std::string xjFilePath = QString.toLocal8Bit().toStdString();
pcl::PointCloud<pcl::PointXYZRGBL>::Ptr xjPC(new pcl::PointCloud<pcl::PointXYZRGBL>);
if (pcl::io::loadPCDFile<pcl::PointXYZRGBL>(xjFilePath, *xjPC) == -1)
{
PCL_ERROR("Couldn't read file \n");
return;
}
for (int i = 0; i < xjPC->points.size(); i++)
{
//XYZ
float x = xjPC->points[i].x;
float y = xjPC->points[i].y;
float z = xjPC->points[i].z;
//RGB:0-255
int red = xjPC->points[i].r;
int green = xjPC->points[i].g;
int blue = xjPC->points[i].b;
//L:读取出来是0
int label = xjPC->points[i].label;
}
xjPC->clear();
xjPC = nullptr;
}
三、写点云
参考:向PCD文件写入点云数据-PCL中国|点云库PCL|Point Cloud Library|点云|点云产学研资料-PCL中国 (pclcn.org)
/* 写点云 */
void WritePCD(const std::string &xjFilePath, std::vector<std::vector<float>> &dataPC)
{
//std::string xjFilePath = QString.toLocal8Bit().toStdString();
pcl::PointCloud<pcl::PointXYZRGB>::Ptr resultPC(new pcl::PointCloud<pcl::PointXYZRGB>());
int pointCount = dataPC.size();
resultPC->resize(pointCount);
resultPC->width = 1;
resultPC->height = pointCount;
resultPC->is_dense = false;
for (int i = 0; i < pointCount; i++)
{
std::vector<float> point = dataPC[i];
/* XYZ */
resultPC->points[i].x = point[0];
resultPC->points[i].y = point[1];
resultPC->points[i].z = point[2];
/* RGB:0-255 */
resultPC->points[i].r = (int)point[3];
resultPC->points[i].g = (int)point[4];
resultPC->points[i].b = (int)point[5];
}
pcl::io::savePCDFileBinary(xjFilePath, *resultPC);
}