PCL read write ply PCL 点云数据

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);

你可以使用CGAL和PCL库来进行带有法线的点云数据的转换。下面是一个简单的示例代码,展示了如何将CGAL中的点云数据转换为PCL库中的PointNormal类型的点云数据: ```cpp #include <CGAL/Exact_predicates_inexact_constructions_kernel.h> #include <CGAL/Point_with_normal_3.h> #include <CGAL/IO/read_xyz_points.h> #include <CGAL/property_map.h> #include <CGAL/IO/write_ply_points.h> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include <pcl/point_cloud.h> #include <pcl/features/normal_3d.h> typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel; typedef Kernel::Point_3 Point_3; typedef CGAL::Point_with_normal_3<Kernel> Point_with_normal_3; typedef std::vector< Point_with_normal_3 > PointList; int main() { // 读取带有法线的点云数据 PointList points; std::ifstream stream("input.xyz"); if (!stream || !CGAL::read_xyz_points(stream, std::back_inserter(points), CGAL::parameters::point_map(CGAL::First_of_pair_property_map<Point_with_normal_3>()). normal_map(CGAL::Second_of_pair_property_map<Point_with_normal_3>()))) { std::cerr << "Error: cannot read file!" << std::endl; return 1; } // 将点云数据转换为PCL库中的PointNormal类型的点云数据 pcl::PointCloud<pcl::PointNormal>::Ptr pcl_cloud(new pcl::PointCloud<pcl::PointNormal>); for (const auto& point : points) { pcl::PointNormal pcl_point; pcl_point.x = point.x(); pcl_point.y = point.y(); pcl_point.z = point.z(); pcl_point.normal_x = point.normal().x(); pcl_point.normal_y = point.normal().y(); pcl_point.normal_z = point.normal().z(); pcl_cloud->push_back(pcl_point); } // 保存PCL点云数据 pcl::io::savePLYFile("output.ply", *pcl_cloud); return 0; } ``` 上述代码将从"input.xyz"文件中读取带有法线的点云数据,并将其转换为PCL库中的PointNormal类型的点云数据。最后,将转换后的点云数据保存为"output.ply"文件。你可以根据自己的需求修改文件路径和名称。 请确保已正确安装和配置CGAL和PCL库,并将相关头文件和库文件包含到你的项目中。这样,你就可以使用上述示例代码将CGAL中的点云数据转换为PCL库中的PointNormal类型的点云数据了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值