需要用到的第三方库
import numpy as np
import os
import laspy
import traceback
设置getallfile()方法来读取某个文件夹下的全部.pts格式点云数据
#读取文件夹下的文件
def getallfile(path):
L = []
for root, dirs, files in os.walk(path): # 获取所有文件
for file in files: # 遍历所有文件名
if os.path.splitext(file)[1] == '.pts':
L.append(os.path.join(root, file)) # 拼接处绝对路径并放入列表
# print(L)
print('总点云数目:', len(L))
return L
设置creat_numpy()方法来读取.pts点云文件的全部点生成矩阵
def creat_numpy(filename,path):
print(f"->正在加载点云... {filename}")
point_cloud_file_ls=[]
point_cloud_ls=[]
point_clouds_ls=[]
#读取点云文件
#pts格式点云文件第一行为点云数量需要跳过
point_cloud_file_ls=open(f"{path}/{filename}",'r').readlines()[1:]
for point_cloud in point_cloud_file_ls:
point_cloud_ls = point_cloud.strip('\n').split(' ')
point_cloud_ls=[float(i) for i in point_cloud_ls]
point_clouds_ls.append(point_cloud_ls)
# 将点转换为numpy数组
point_cloud_np=np.array(point_clouds_ls)
return point_cloud_np
格式 | 描述 |
xyz | 每一行包含[x, y, z],其中x, y, z是三维坐标 |
xyzn | 每一行包含[x, y, z, nx, ny, nz],其中nx, ny, nz是法线 |
xyzrgb | 每行包含[x, y, z, r, g, b],其中r, g, b在[0, 1]范围内取值 |
pts | 第一行是一个整数,表示点数。后续行遵循以下格式之一:[x, y, z, i, r, g, b], [x, y, z, r, g, b], [x, y, z, i]或[x, y, z], 其中x, y, z, i属于类型double,r, g, b属于类型uint8 |
ply | 请参阅多边形文件格式,层文件可以包含点云和网格数据 |
pcd | 查看点云数据 |
caculate_max_min()方法计算点云矩阵的最大最小值
def caculate_max_min(point_cloud_np):
#新建字典存储计算得点云最大最小值
point_cloud_frame={}
#计算x坐标最大最小值
x=point_cloud_np[:,0]
point_cloud_frame['x_max']=x.max()
point_cloud_frame['x_min']=x.min()
#计算y坐标最大最小值
y=point_cloud_np[:,1]
point_cloud_frame['y_max']=y.max()
point_cloud_frame['y_min']=y.min()
#计算z坐标最大最小值
z=point_cloud_np[:,2]
point_cloud_frame['z_max']=z.max()
point_cloud_frame['z_min']=z.min()
return point_cloud_frame
修改输入文件夹(dir)即可
# 设置输入文件夹
dir=r'E:\ZJL\Point_Cloud\AI_Project\01_PointCloud'
# 读取输入文件夹存在的文件(可添加代码为
cloud_ls=getallfile(dir)
# 记录数据日志
save_txt='result.txt'
errorlog='errorlog.txt'
if os.path.exists(save_txt):
os.remove(save_txt)
if os.path.exists(errorlog):
os.remove(errorlog)
success_num=0
NameError_num=0
BigSize_num=0
fail_num=0
for file in cloud_ls:
try:
#完成一次隔行方便观察
print('\n')
print(file)
#分离文件名
filepath, filename= os.path.split(file)
#创建numpy数组
point_cloud_np=creat_numpy(filename,filepath)
#计算最大最小值
point_cloud_frame=caculate_max_min(point_cloud_np)
print(point_cloud_frame)
with open(save_txt,'a+') as ru:
ru.write(f'{file}\n{point_cloud_frame}\n')
success_num+=1
print(time.time()-start_time)
except:
with open('errorlog.txt','a+') as fh:
fh.write(traceback.format_exc())
fh.write(f'{file}\n')
fail_num+=1
pass
print(f'totle num success_num:{success_num},fail_num:{fail_num},name_error_num:{NameError_num},BigSize_num:{BigSize_num}')
总代码:
import numpy as np
import os
import laspy
import traceback
#读取文件夹下的文件
def getallfile(path):
L = []
for root, dirs, files in os.walk(path): # 获取所有文件
for file in files: # 遍历所有文件名
if os.path.splitext(file)[1] == '.pts':
L.append(os.path.join(root, file)) # 拼接处绝对路径并放入列表
# print(L)
print('总点云数目:', len(L))
return L
def creat_numpy(filename,path):
print(f"->正在加载点云... {filename}")
point_cloud_file_ls=[]
point_cloud_ls=[]
point_clouds_ls=[]
#读取点云文件
#pts格式点云文件第一行为点云数量需要跳过
point_cloud_file_ls=open(f"{path}/{filename}",'r').readlines()[1:]
for point_cloud in point_cloud_file_ls:
point_cloud_ls = point_cloud.strip('\n').split(' ')
point_cloud_ls=[float(i) for i in point_cloud_ls]
point_clouds_ls.append(point_cloud_ls)
# 将点转换为numpy数组
point_cloud_np=np.array(point_clouds_ls)
return point_cloud_np
def caculate_max_min(point_cloud_np):
#新建字典存储计算得点云最大最小值
point_cloud_frame={}
#计算x坐标最大最小值
x=point_cloud_np[:,0]
point_cloud_frame['x_max']=x.max()
point_cloud_frame['x_min']=x.min()
#计算y坐标最大最小值
y=point_cloud_np[:,1]
point_cloud_frame['y_max']=y.max()
point_cloud_frame['y_min']=y.min()
#计算z坐标最大最小值
z=point_cloud_np[:,2]
point_cloud_frame['z_max']=z.max()
point_cloud_frame['z_min']=z.min()
return point_cloud_frame
# 设置输入文件夹
dir=r'E:\ZJL\Point_Cloud\AI_Project\01_PointCloud'
# 读取输入文件夹存在的文件(可添加代码为
cloud_ls=getallfile(dir)
# 记录数据日志
save_txt='result.txt'
errorlog='errorlog.txt'
if os.path.exists(save_txt):
os.remove(save_txt)
if os.path.exists(errorlog):
os.remove(errorlog)
success_num=0
fail_num=0
for file in cloud_ls:
try:
#完成一次隔行方便观察
print('\n')
print(file)
#分离文件名
filepath, filename= os.path.split(file)
#创建numpy数组
point_cloud_np=creat_numpy(filename,filepath)
#计算最大最小值
point_cloud_frame=caculate_max_min(point_cloud_np)
print(point_cloud_frame)
with open(save_txt,'a+') as ru:
ru.write(f'{file}\n{point_cloud_frame}\n')
success_num+=1
print(time.time()-start_time)
except:
with open('errorlog.txt','a+') as fh:
fh.write(traceback.format_exc())
fh.write(f'{file}\n')
fail_num+=1
pass
print(f'totle num success_num:{success_num},fail_num:{fail_num}')