Python las 读取可以参考之前的博客,用laspy 或者 pylas
今天主要解决Python、C++ 的las转pcd文件
1. Python .las转.pcd
# -*- coding: utf-8 -*-
# 读取las文件 并保留为 XYZI格式的pcd文件
import pcl # 调用pcl保留pcd文件
from laspy.file import File # las文件读取
import numpy as np # np数组处理
import time # 计算耗时
# las读取转为 pcd的cloud形式,只保留 XYZI
def getCloud():
file = r"D:/pcd/1001140020191217.las"
f = File(file, mode='r')
inFile = np.vstack((f.x, f.y, f.z, f.intensity)).transpose()
cloud = pcl.PointCloud_PointXYZI()
cloud.from_array(np.array(inFile, dtype=np.float32))
f.close()
return cloud
def main():
end1 = time.time()
cloud = getCloud()
pcl.save(cloud, r"D:/pcd/1001140020191217_las2pcd.pcd")
end2 = time.time()
print("las2pcd 耗时:%.2f秒" % (end2 - end1))
print('-------endl----------')
if __name__ == '__main__':
main()
2. C++ .las转.pcd
用到liblas库,需要安装好PCL1.8.1
start las2pcd.exe D:/pcd/1001140020191217.las D:/pcd/1001140020191217_las2pcd.pcd
#include <iostream>
#include <cstdlib>
#include <liblas/liblas.hpp>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
using namespace std;
int main (int argc, char** argv)
{
std::ifstream ifs(argv[1], std::ios::in | std::ios::binary); // 打开las文件
liblas::ReaderFactory f;
liblas::Reader reader = f.CreateWithStream(ifs); // 读取las文件
unsigned long int nbPoints=reader.GetHeader().GetPointRecordsCount();//获取las数据点的个数
pcl::PointCloud<pcl::PointXYZI> cloud;
cloud.width = nbPoints; //保证与las数据点的个数一致
cloud.height = 1;
cloud.is_dense = true;
cloud.points.resize (cloud.width * cloud.height);
int i=0;
/* uint16_t r1, g1, b1;
int r2, g2, b2;
uint32_t rgb; */
while(reader.ReadNextPoint())
{
// 获取las数据的x,y,z信息
cloud.points[i].x = (reader.GetPoint().GetX());
cloud.points[i].y = (reader.GetPoint().GetY());
cloud.points[i].z = (reader.GetPoint().GetZ());
cloud.points[i].intensity = (reader.GetPoint().GetIntensity());
//获取las数据的r,g,b信息
/*r1 = (reader.GetPoint().GetColor().GetRed());
g1 = (reader.GetPoint().GetColor().GetGreen());
b1 = (reader.GetPoint().GetColor().GetBlue());
r2 = ceil(((float)r1/65536)*(float)256);
g2 = ceil(((float)g1/65536)*(float)256);
b2 = ceil(((float)b1/65536)*(float)256);
rgb = ((int)r2) << 16 | ((int)g2) << 8 | ((int)b2);
cloud.points[i].rgb = *reinterpret_cast<float*>(&rgb);*/
i++;
}
pcl::io::savePCDFileASCII (argv[2], cloud);//存储为pcd类型文件
return (0);
}