Python,C++中点云 .las转.pcd

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);
}

猜你喜欢

转载自blog.csdn.net/qq_40985985/article/details/106333359