LASlib库将PCL库点云类型数据转换为las格式保存

本文介绍了如何利用LASlib库将PCL(Point Cloud Library)中的点云数据,如pcl::PointXYZI类型,转换并保存为LAS格式。在处理点云数据时,PCL的PointCloud类模板用于存储点云信息,可以使用new初始化指针类型,也可直接声明对象。转换和保存到LAS格式是通过特定的代码实现的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       pcl 是一个命名空间,跟std类似,PointCloud是类模板,<pcl::PointXYZ>是模板类实例化的类型。

       在使用pcl::PointCloud<pcl::PointXYZI>::Ptr时需要使用new进行初始化,如下:

pcl::PointCloud<pcl::PointXYZI>::Ptr cloudxyzi(new pcl::PointCloud<pcl::PointXYZI>);

       在使用 pcl::PointCloud<pcl::PointXYZI> cloudxyzi时作为一个对象。

       两者可以相互转换,如下:

//PointCloud::Ptr—>PointCloud
pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);
cloud=*cloud_ptr;

//PointCloud->PointCloud::Ptr
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ> cloud;
cloud_ptr=cloud.makeShared();

        在实际的使用中,我们常常需要将pcl类型的数据保存为las格式。具体的代码如下所示:

	int pcl2las(const std::string &output_lasfile,
		const pcl::PointCloud<pcl::PointXYZI>::Ptr &cloud)
	{
		if (output_lasfile.empty() || output_lasfile.find_last_of(".") < 0)
		{
			//printf("   Error in lasread: input file is valid.");
			return 0;
		}

		int pos = output_lasfile.find_last_of(".");
		std::string ext = output_lasfile.substr(pos);
		if (ext != ".las")
		{
			//printf("   Error in laswrite: %s is not *.las file.\n", output_lasfile.c_str());
			return 0;
		}

		LASwriteOpener laswriteopener;
		laswriteopener.set_file_name(output_lasfile.c_str());
		if (!laswriteopener.active())
		{
			//printf("   Error in \"laswrite\": output lasfile is not specified.\n");
			return 0;
		}
		LASheader lasheader;
		lasheader.x_scale_factor = 1.0;
		lasheader.y_scale_factor = 1.0;
		lasheader.z_scale_factor = 1.0;
		lasheader.x_offset = 0.0;
		lasheader.y_offset = 0.0;
		lasheader.z_offset = 0.0;
		lasheader.point_data_format = 1;
		lasheader.point_data_record_length = 28;

		LASpoint laspoint;
		laspoint.init(&lasheader, lasheader.point_data_format, lasheader.point_data_record_length, 0);

		LASwriter* laswriter = NULL;
		laswriter = laswriteopener.open(&lasheader);
		if (laswriter == 0)
		{
			printf("   Error in \"laswrite\": could not open laswriter.\n");
			return 0;
		}
		
		// write points
		if (cloud->points.size() > 0)
		{
			for (size_t i = 0; i < cloud->points.size(); ++i)
			{
				double x, y, z;
				unsigned short intensity;
				x = (cloud->points[i].x - lasheader.x_offset) * lasheader.x_scale_factor;
				y = (cloud->points[i].y - lasheader.y_offset) * lasheader.y_scale_factor;
				z = (cloud->points[i].z - lasheader.z_offset) * lasheader.z_scale_factor;
				intensity = cloud->points[i].intensity;
				// populate the point
				laspoint.set_x(x);
				laspoint.set_y(y);
				laspoint.set_z(z);
				laspoint.set_intensity(intensity);
				/*laspoint.set_intensity((U16)i);
				laspoint.set_gps_time(0.0006*i);*/

				// write the point
				laswriter->write_point(&laspoint);

				// add it to the inventory
				laswriter->update_inventory(&laspoint);
			}
			// update the header
			laswriter->update_header(&lasheader, TRUE);

			laswriter->close();
			delete laswriter;
			laswriter = NULL;

			return 1;
		}
		else
		{
			printf("   Error in \"laswrite\": output pointset is empty.\n");
			return 0;
		}
	}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值