Python点云数据处理(二)文件读写与工具

您所在的位置:网站首页 open3d保存点云 Python点云数据处理(二)文件读写与工具

Python点云数据处理(二)文件读写与工具

#Python点云数据处理(二)文件读写与工具| 来源: 网络整理| 查看: 265

本文接上一篇文章《Python与点云数据处理/点云工具箱(一)功能介绍》,主要介绍点云工具箱软件中文件读写及部分小工具的实现。

一、文件读写

1.1 文件格式说明

点云工具箱软件目前支持的主要文件读写格式包括*.pcd、*.txt、*.asc、*.obj以及*.ply。其中*.pcd、*.txt、*.asc通常为点云数据格式,而*.obj以及*.ply通常为曲面数据格式。点云数据包含点的三维空间坐标、色彩、强度等信息,而曲面则包含曲面顶点、各曲面顶点索引号等。

1.2 pcd格式读写

pcd格式的读写操作借助Open3d库实现,Open3d库目前已更新至0.12.0版本,软件完成所基于的是0.10.0版本,Open3d近几次更新主要针对的方向是深度学习在图像及点云中的功能,深度学习也是今后图像及点云发展的主要热门方向,可以说Open3d真的是一个很不错的三方库了,推荐大家深入学习。Open3d库的安装同其他第三方库一样,cmd命令行下:

pip install open3d # 指定Open3d版本,以0.10.0为例 pip install open3d==0.10.0 # 解决下载慢的问题需要切换下载源 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple open3d==0.10.0 # 上述为清华源,以下列出部分常用下载源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣:http://pypi.douban.com/simple/

安装完Open3d后如下代码可实现pcd格式文件的读取与输出:

import open3d as o3d # 读取文件 pcd = o3d.io.read_point_cloud(path) # path为文件路径 # 保存文件 o3d.io.write_point_cloud(path, pcd) # path为文件路径

1.3 txt/asc格式读写

import numpy as np # 读取文件 pc = np.loadtxt(path, delimiter = ',') # delimiter参数可指定各列数据的分隔符,默认为空格 # 保存文件 np.savetxt(path, pc)

1.4 ply格式读写

# 读取文件 ply = o3d.io.read_triangle_mesh(path) # 三角网格式曲面数据 # 保存文件 o3d.io.write_triangle_mesh(path, ply)

1.5 obj格式读写

obj格式曲面数据通过第三方库vispy实现,安装过程同Open3d。

import vispy # 读取文件 obj = vispy.io.read_mesh(path) # 除了obj格式外,函数也支持其他几种格式曲面读取 # 保存文件 vispy.io.write_mesh(path, vertices, triangles) # vertices为所有顶点坐标,triangles为所有三角形对应的顶点索引二、工具

2.1 计算两点云间均方根误差

通常均方根误差计算用于两站配准后的点云,可以度量配准误差的大小。

pcd_source = o3d.io.read_point_cloud(path) pcd_template = o3d.io.read_point_cloud(path) rmse = np.mean(np.asarray(pcd_source.compute_point_cloud_distance(pcd_template))**2)**0.5

2.2 计算点云近似密度

pcd = o3d.io.read_point_cloud(path) point = np.asarray(pcd.points) kdtree = o3d.geometry.KDTreeFlann(pcd) point_size = point.shape[0] dd = np.zeros((point_size)) for i in range(point_size): [_, idx, dis] = kdtree.search_knn_vector_3d(point[i], 2) dd[i] = dis[1] density = np.mean(dd)

2.3 添加高斯噪声

高斯分布,也称正态分布,又称常态分布,记为N(μ,σ^2),其中μ,σ^2为分布的参数,分别为高斯分布的期望和方差。当有确定值时,p(x)也就确定了,特别当μ=0,σ^2=1时,X的分布为标准正态分布。所谓高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声。

pcd = o3d.io.read_point_cloud(path) point = np.asarray(pcd.points) signal = point SNR = value # value为指定噪声强度 noise = np.random.randn(signal.shape[0], signal.shape[1]) noise = noise - np.mean(noise) signal_power = np.linalg.norm(signal) ** 2 / signal.size noise_variance = signal_power / np.power(10, (SNR / 10)) noise = (np.sqrt(noise_variance) / np.std(noise)) * noise signal_noise = noise + signal Ps = (np.linalg.norm(signal - signal.mean())) ** 2 Pn = (np.linalg.norm(signal - signal_noise)) ** 2 pcd_noise = o3d.geometry.PointCloud() pcd_noise.points = o3d.utility.Vector3dVector(signal_noise)

2.4 点云归一化

这里的点云归一化指的是将量级较大或较小的点云坐标缩放至(-1,1)之间。

pcd = o3d.io.read_point_cloud(path) point = np.asarray(pcd.points) xmax = max(point[:, 0]) ymax = max(point[:, 1]) zmax = max(point[:, 2]) coormax = max([xmax, ymax, zmax]) point[:, 0] = point[:, 0] / coormax point[:, 1] = point[:, 1] / coormax point[:, 2] = point[:, 2] / coormax pcd_normalization = o3d.geometry.PointCloud() pcd_normalization.points = o3d.utility.Vector3dVector(point)

后续内容持续更新,欢迎点赞收藏关注三连~~~



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3