使用liblas库读写las文件c++代码

需要包含的头文件包括
//标准c++
#include 
//liblas库
#include 
#include 
#include 
//pcl库
#include 
#include 
读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();    //读取点数//初始化cloudcloud->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;
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部