需要包含的头文件包括
//标准c++
#include <string>
//liblas库
#include <liblas/liblas.hpp>
#include <liblas/point.hpp>
#include <liblas/version.hpp>
//pcl库
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
读las文件
bool readLasFile(string filename){
//pcl点云
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
//打开las文件
std::ifstream ifs;
ifs.open(filename, std::ios::in | std::ios::binary);
if (!ifs.is_open())
return false;
liblas::ReaderFactory f;
//使用ReaderFactory从stream中构造Reader而不是直接调用Reader构造函数,因为las可能是压缩的
liblas::Reader reader = f.CreateWithStream(ifs);
liblas::Header const& header = reader.GetHeader(); //读取文件头
int pointsNum = header.GetPointRecordsCount(); //读取点数
//初始化cloud
cloud->width = pointsNum;
cloud->height = 1;
cloud->resize(pointsNum);
//读取相关信息
vector<uint8_t> pclassification(pointsNum); //记录类别信息
vector<liblas::Color> pcolor(pointsNum); //记录颜色信息
vector<uint16_t> pintencity(pointsNum); //记录强度信息
for (int i = 0; i < pointsNum; i++) //这里用for比wihle安全
{
reader.ReadNextPoint();
const liblas::Point& p = reader.GetPoint();
float px = (float)p.GetX();
float py = (float)p.GetY();
float pz = (float)p.GetZ();
(*cloud)[i].x = px;
(*cloud)[i].y = py;
(*cloud)[i].z = pz;
pclassification[i] = p.GetClassification().GetClass();
pcolor[i] = p.GetColor();
pintencity[i] = p.GetIntensity();
}
ifs.close(); //关闭文件
return true;
}
写las文件
bool writeLasFile(string filename, liblas::Header header, pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) {
//写文件头
std::ofstream ofs(filename.c_str(), ios::out | ios::binary);
liblas::Writer writer(ofs, header);
writer.WriteHeader();
int pointsNum = cloud->size(); //获取点数
//记录数据范围
float minx = 99999999;
float miny = 99999999;
float minz = 99999999;
float maxx = -99999999;
float maxy = -99999999;
float maxz = -99999999;
//读取并写点
liblas::Point p(&header);
for (int i = 0; i < pointsNum; i++) {
float tx = cloud->at(i).x;
float ty = cloud->at(i).y;
float tz = cloud->at(i).z;
minx = minx > tx ? tx : minx;
miny = miny > ty ? ty : miny;
minz = minz > tz ? tz : minz;
maxx = maxx < tx ? tx : maxx;
maxy = maxy < ty ? ty : maxy;
maxz = maxz < tz ? tz : maxz;
p.SetCoordinates(tx, ty, tz);
writer.WritePoint(p);
}
header.SetMax(maxx, maxy, maxz); //设置数据范围
header.SetMin(minx, miny, minz);
header.SetPointRecordsCount(pointsNum); //设置点数
//(若中间处理过程点数有变化的话,可以通过此方法进行修改)
//(若无变动,则可以在一开始就设置点数)
writer.SetHeader(header); //设置文件头
writer.WriteHeader(); //重写文件头
ofs.close(); //关闭文件
return true;
}