header:
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/cloud_viewer.h>
PLY
// 读取ply文件
int readPLYcloud(pcl::PointCloud<pcl::PointXYZ>::Ptr mycloud, string filename) {
if (pcl::io::loadPLYFile<pcl::PointXYZ>(filename, *mycloud) == -1) {
cout << "Couldnot read file." << endl;
return -1;
}
cout << filename<<"cloud count:" << mycloud->points.size() << endl;
return 0;
}
PCD
// read PCD
if (pcl::io::loadPCDFile<pcl::PointXYZRGB>("testCloud.pcd", *cloud) == -1)
{
PCL_ERROR("Read file fail!\n");
return -1;
}
read obj
if (pcl::io::loadOBJFile<pcl::PointXYZ>("coati.obj", *cloud_source) == -1)
{
PCL_ERROR("Couldn't read the coati.obj\n");
return -1;
}
TXT read PointXYZ
// read PointXYZ
void CreateCloudFromTxt(const std::string& file_path, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud)
{
std::ifstream file(file_path.c_str());
std::string line;
pcl::PointXYZ point;
while (getline(file, line)) {
std::stringstream ss(line);
ss >> point.x;
ss >> point.y;
ss >> point.z;
cloud->push_back(point);
}
file.close();
}
TXT read PointXYZRGB
//根据文件格式选择输入方式 PointXYZRGB
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); //创建点云对象指针,用于存储输入
---------------读取txt文件-------------------
std::stringstream& operator>>(std::stringstream& str, uint8_t& num) {
uint16_t temp;
str >> temp;
/* constexpr */ auto max = std::numeric_limits<uint8_t>::max();
num = std::min(temp, (uint16_t)max);
if (temp > max) str.setstate(std::ios::failbit);
return str;
}
void CreateCloudFromTxt(const std::string& file_path )
{
std::ifstream file(file_path.c_str());//c_str():生成一个const char*指针,指向以空字符终止的数组。
std::string line;
pcl::PointXYZRGB point;
int index = 0;
while (getline(file, line)) {
std::stringstream ss(line);
ss >> point.x;
if (ss.peek() == ',')
ss.ignore();
ss >> point.y;
if (ss.peek() == ',')
ss.ignore();
ss >> point.z;
if (ss.peek() == ',')
ss.ignore();
ss >> point.r;
if (ss.peek() == ',')
ss.ignore();
ss >> point.g;
if (ss.peek() == ',')
ss.ignore();
ss >> point.b;
if (ss.peek() == ',')
ss.ignore();
point.a = 0;
//printf("%f,%f,%f=====%u,%u,%u\n", point.x, point.y, point.z, point.r, point.g, point.b);;
//std::uint8_t r = 255, g = 15, b = 15; // Example: Red color
std::uint32_t rgb = ((std::uint32_t)point.r << 16 | (std::uint32_t)point.g << 8 | (std::uint32_t)point.b);
point.rgb = *reinterpret_cast<float*>(&rgb);
cloud->push_back(point);
continue;
//printf("%f,%f,%f\n", point.x, point.y, point.z);
}
file.close();
printf("size %ld\n", cloud->size());
}
Save PCD file
const std::string path = "./test_write.pcd";
pcl::io::savePCDFileASCII(path, *cloud);
//保存
pcl::io::savePLYFile("result.txt", *cloud);
// save poly
pcl::io::savePolygonFile("24wenwu_result.stl", cloud_mesh);
Save PLY file
//写出点云图
pcl::PLYWriter writer;
writer.write("test.ply", *cloud, true);
void pclSaveTxt(pcl::PointCloud<PoinT>::Ptr cloud )
{
std::fstream fs;
fs.open("save_data.txt", std::fstream::out);
//打开文件路径,没有则创建文件
for (size_t i = 0; i < cloud->points.size(); ++i) //points.size表示点云数据的大小
{
//写入数据
fs << cloud->points[i].x << ","
<< cloud->points[i].y << ","
<< cloud->points[i].z << ","
<< (int)(cloud->points[i].r) << ","
<< (int)(cloud->points[i].g) << ","
<< (int)(cloud->points[i].b) << "\n";
//<< cloud->points[i].z << "\n";
}
fs.close();//关闭
}
//从ply转pcd
pcl::io::vtkPolyDataToPointCloud(newData, *Newcloud);
//保存pcd文件
pcl::io::savePCDFileASCII("outNew.pcd", *Newcloud);