LASTools读取操作

LASTools可以读快速las数据,对于1.2版本包括点的r、g、b颜色属性,但是其取值在0-65535范围内(2的16)。需要将其转换成正常的0-255范围内,其示例如下:

#include "lasreader.hpp"
#include "laswriter.hpp"
#include<fstream>
#include<iostream>
#include<iomanip>
using namespace std;


void main()
{
	
	LASreadOpener lasreadopener;
	lasreadopener.set_file_name("G:\\点云数据\\points.las");
	LASreader* lasReader = lasreadopener.open();

	int majorVersion = lasReader->header.version_major;
	int minorVersion = lasReader->header.version_minor;
	int pointDataFormat = lasReader->header.point_data_format;
	int pointAmount = lasReader->header.number_of_point_records;
	double maxX = lasReader->header.max_x;
	double minX = lasReader->header.min_x;
	double maxY = lasReader->header.max_y;
	double minY = lasReader->header.min_y;
	double maxZ = lasReader->header.max_z;
	double minZ = lasReader->header.min_z;
	double deltaX = maxX - minX;
	double deltaY = maxY - minY;
	double deltaZ = maxZ - minZ;
	double xOffset = lasReader->header.x_offset;
	double yOffset = lasReader->header.y_offset;
	double zOffset = lasReader->header.z_offset;
	double xScale = lasReader->header.x_scale_factor;
	double yScale = lasReader->header.y_scale_factor;
	double zScale = lasReader->header.z_scale_factor;

	cout << "majorVersion = " << majorVersion << endl;
	cout << "minorVersion = " << minorVersion << endl;
	cout << "pointDataFormat = " << pointDataFormat << endl;
	cout << "number_of_point_records = " << pointAmount << endl;
	
	int Pnumber = 0;
	ofstream outfile("D:\\xyzrgb.txt", ios::out);

	while (lasReader->read_point())
	{
		LASpoint &pointReader = lasReader->point;
		outfile << fixed << setprecision(3) << pointReader.get_x() << " " << pointReader.get_y() << " " << pointReader.get_z() << " " <<
			fixed << setprecision(0) << (pointReader.get_R() * 255 / 65535) << " " << (pointReader.get_G() * 255 / 65535) << " " << (pointReader.get_B() * 255 / 65535) << endl;
		
	}
	outfile.close();

}

在这里插入图片描述
在这里插入图片描述
读取las获取点的属性:

//LASlib
#include "LASlib/inc/lasreader.hpp"
 
/* read las */
void TestLASlib::ReadLas(std::vector<xjPoint> &vPoints, const std::string &sLasPath)
{
	LASreadOpener lasReadOpener;
	//lasReadOpener.set_file_name(qstringLasPath.toLocal8Bit().toStdString().c_str());
	lasReadOpener.set_file_name(sLasPath.c_str());
 
	LASreader* lasReader = lasReadOpener.open(false);
 
#pragma region Las information
	int majorVersion = lasReader->header.version_major;
	int minorVersion = lasReader->header.version_minor;
	int pointDataFormat = lasReader->header.point_data_format;
	int pointAmount = lasReader->header.number_of_point_records;
	double maxX = lasReader->header.max_x;
	double minX = lasReader->header.min_x;
	double maxY = lasReader->header.max_y;
	double minY = lasReader->header.min_y;
	double maxZ = lasReader->header.max_z;
	double minZ = lasReader->header.min_z;
	double deltaX = maxX - minX;
	double deltaY = maxY - minY;
	double deltaZ = maxZ - minZ;
	double xOffset = lasReader->header.x_offset;
	double yOffset = lasReader->header.y_offset;
	double zOffset = lasReader->header.z_offset;
	double xScale = lasReader->header.x_scale_factor;
	double yScale = lasReader->header.y_scale_factor;
	double zScale = lasReader->header.z_scale_factor;
 
	ui.listWidget->addItem("majorVersion = " + QString::number(majorVersion));
	ui.listWidget->addItem("minorVersion = " + QString::number(minorVersion));
	ui.listWidget->addItem("pointDataFormat = " + QString::number(pointDataFormat));
	ui.listWidget->addItem("number_of_point_records = " + QString::number(pointAmount));
	ui.listWidget->addItem("maxX = " + QString::number(maxX, 'f', 5) +
		", minX = " + QString::number(minX, 'f', 5) +
		", deltaX = " + QString::number(deltaX, 'f', 5));
	ui.listWidget->addItem("maxY = " + QString::number(maxY, 'f', 4) +
		", minY = " + QString::number(minY, 'f', 4) +
		", deltaY = " + QString::number(deltaY, 'f', 4));
	ui.listWidget->addItem("maxZ = " + QString::number(maxZ, 'f', 4) +
		", minZ = " + QString::number(minZ, 'f', 4) +
		", deltaZ = " + QString::number(deltaZ, 'f', 4));
	ui.listWidget->addItem("xOffset = " + QString::number(xOffset, 'f', 4));
	ui.listWidget->addItem("y_offset = " + QString::number(yOffset, 'f', 4));
	ui.listWidget->addItem("z_offset = " + QString::number(zOffset, 'f', 4));
	ui.listWidget->addItem("x_scale_factor = " + QString::number(xScale, 'f', 4));
	ui.listWidget->addItem("y_scale_factor = " + QString::number(yScale, 'f', 4));
	ui.listWidget->addItem("z_scale_factor = " + QString::number(zScale, 'f', 4));
#pragma endregion
 
	int pNumber = 0;
	while (lasReader->read_point())
	{
		LASpoint& pointReader = lasReader->point;
 
		xjPoint p;
		p.x = pointReader.get_x();
		p.y = pointReader.get_y();
		p.z = pointReader.get_z();
		p.intensity = pointReader.get_intensity();
		p.pointSourceID = pointReader.get_point_source_ID();
		p.GPStime = pointReader.get_gps_time();
		p.r = pointReader.get_R();
		p.g = pointReader.get_G();
		p.b = pointReader.get_B();
		p.classification = pointReader.get_classification();
 
		vPoints.push_back(p);
		pNumber++;
 
#pragma region point information
		if (pNumber < 5)
		{
			QString pointInfo = QString::number(p.x, 'f', 4) + ", " +
				QString::number(p.y, 'f', 4) + ", " + QString::number(p.z, 'f', 4) + ", ";
			pointInfo += QString::number(p.intensity) + ", " +
				QString::number(p.pointSourceID) + ", " + QString::number(p.GPStime, 'f', 4) + ", ";
			pointInfo += QString::number(p.r) + ", " +
				QString::number(p.g) + ", " + QString::number(p.b) + ", ";
			pointInfo += QString::number(p.classification);
			ui.listWidget->addItem(pointInfo);
		}
#pragma endregion
	}
 
	lasReader->close();
	delete lasReader;
	lasReader = nullptr;
}

保存las:

//LASlib
#include "LASlib/inc/laswriter.hpp"
 
/* write las */
bool TestLASlib::WriteLas(std::vector<xjPoint> &vPoints, const std::string & sResultPath)
{
	// init
	LASwriteOpener lasWriterOpener;
    //lasWriterOpener.set_file_name(qstringResPath.toLocal8Bit().toStdString().c_str());
    lasWriterOpener.set_file_name(sResultPath.data());
 
	// init header
	LASheader lasHeader;
	lasHeader.x_scale_factor = 0.0001;
	lasHeader.y_scale_factor = 0.0001;
	lasHeader.z_scale_factor = 0.0001;
	lasHeader.x_offset = (int)vPoints.at(0).x;
	lasHeader.y_offset = (int)vPoints.at(0).y;
	lasHeader.z_offset = (int)vPoints.at(0).z;
	lasHeader.point_data_format = 3;
	lasHeader.point_data_record_length = 34;
	//lasHeader.number_of_point_records = vPoints.size();
 
	// open laswriter
	LASwriter* lasWriter = lasWriterOpener.open(&lasHeader);
 
	// init point
	LASpoint lasPoint;
	lasPoint.init(&lasHeader, lasHeader.point_data_format, lasHeader.point_data_record_length, 0);
 
	// write points
	double minX = DBL_MAX, minY = DBL_MAX, minZ = DBL_MAX;
	double maxX = -DBL_MAX, maxY = -DBL_MAX, maxZ = -DBL_MAX;
	for (int i = 0; i < vPoints.size(); i++)
	{
		// populate the point
		lasPoint.set_x(vPoints.at(i).x);
		lasPoint.set_y(vPoints.at(i).y);
		lasPoint.set_z(vPoints.at(i).z);
		lasPoint.set_intensity(vPoints.at(i).intensity);
		lasPoint.set_point_source_ID(vPoints.at(i).pointSourceID);
		lasPoint.set_gps_time(vPoints.at(i).GPStime);
		lasPoint.set_R(vPoints.at(i).r);
		lasPoint.set_G(vPoints.at(i).g);
		lasPoint.set_B(vPoints.at(i).b);
		lasPoint.set_classification(vPoints.at(i).classification);
 
		// write the point
		lasWriter->write_point(&lasPoint);
 
		// add it to the inventory
		lasWriter->update_inventory(&lasPoint);
 
		//range
		double x = vPoints.at(i).x;
		double y = vPoints.at(i).y;
		double z = vPoints.at(i).z;
		if (x < minX) minX = x;
		if (x > maxX) maxX = x;
		if (y < minY) minY = y;
		if (y > maxY) maxY = y;
		if (z < minZ) minZ = z;
		if (z > maxZ) maxZ = z;
	}
 
	// update the boundary
	lasHeader.set_bounding_box(minX, minY, minZ, maxX, maxY, maxZ);
 
	// update the header
	lasWriter->update_header(&lasHeader, true);
 
	// close the writer
	lasWriter->close();
	delete lasWriter;
	lasWriter = nullptr;
}
#include <iostream>
#include "lasreader.hpp"
#include "laswriter.hpp"
void WriteLasFile()
{
	//保存LAS点云数据
	LASwriteOpener laswriteropener;
	laswriteropener.set_file_name("D:\\test.las");
	LASheader lasheader;
	lasheader.min_x = 0;
	lasheader.max_x = 9999999;
	lasheader.min_y = 0;
	lasheader.max_y = 9999999;
	lasheader.min_z = 0;
	lasheader.max_z = 9999999;
	lasheader.x_scale_factor = 0.001;
	lasheader.y_scale_factor = 0.001;
	lasheader.z_scale_factor = 0.001;
	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 pt;
	pt.init(&lasheader, lasheader.point_data_format, lasheader.point_data_record_length, 0);
	LASwriter *laswriter = laswriteropener.open(&lasheader);
	for (int i = 0; i < 100; i++)
	{
		int x = 100 * rand() / (RAND_MAX + 1.0f);
		int y = 100 * rand() / (RAND_MAX + 1.0f);
		int z = 100 * rand() / (RAND_MAX + 1.0f);
		pt.set_X((x- lasheader.x_offset) / lasheader.x_scale_factor);
		pt.set_Y((y-lasheader.y_offset) / lasheader.y_scale_factor);
		pt.set_Z((z-lasheader.z_offset) / lasheader.z_scale_factor);
		laswriter->write_point(&pt);
		laswriter->update_inventory(&pt);
	}
	laswriter->update_header(&lasheader, TRUE);
	laswriter->close();
	delete laswriter;
}

int main()
{
	//ReadLasFile();

	WriteLasFile();

	std::cout << "Hello World!\n";
	system("pause");
}

参考博客:
https://blog.csdn.net/xinjiang666/article/details/105865499

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

点云实验室lab

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值