提取.pts格式点云数据的坐标最大最小值

需要用到的第三方库

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}')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值