一淘模板给大家带来了关于Python的相关知识,主要介绍了Python如何用NumPy读取和保存点云数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下。
前言
最近在学习点云处理的时候用到了Modelnet40
数据集,该数据集总共有40
个类别,每个样本的点云数据存放在一个TXT
文件中,每行的前3个数据代表一个点的xyz
坐标。我需要把TXT
文件中的每个点读取出来,然后用Open3D
进行显示。怎么把数据从TXT
文件中读取出来呢?NumPy
提供了一个功能非常强大的函数loadtxt
可以非常简单地实现这个功能。来看一下代码:
import open3d as o3dimport numpy as np def main(): points_data = np.loadtxt("airplane_0001.txt", delimiter=",", dtype=np.float32) pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points_data[:, :3]) o3d.visualization.draw_geometries([pcd]) if __name__ == '__main__': main()
从上面的代码可以看到,只需要一行代码就可以把TXT
文件中的点云数据读取进来了,接下来就可以调用Open3D
的接口进行显示了。在介绍loadtxt
函数的用法之前,
顺便看一下Open3D的显示效果:
loadtxt函数的用法
基本用法
在上面的例子中,由于TXT
里面每一行的数据是用逗号分割的,所以在调用loadtxt
函数的时候除了设置文件路径外,还需要设置参数delimiter=","
。另外,该函数默认的数据类型为float64
,如果是其他数据类型的话还需要设置dtype
为对应类型。
points_data = np.loadtxt("airplane_0001.txt", delimiter=",") #没有指定数据类型print('shape: ', points_data.shape)print('data type: ', points_data.dtype)
结果:
shape: (10000, 6)
data type: float64
指定每一列的数据类型
假如我们有一个CSV
文件:
x,y,z,label,id-0.098790,-0.182300,0.163800,1,10.994600,0.074420,0.010250,0.2,20.189900,-0.292200,-0.926300,3,3-0.989200,0.074610,-0.012350,4,4
该文件前面3列的数据类型是浮点型,后面2列的数据类型为整型,那么按照前面的方式设置dtype
来读取就不合适了。不过没关系,loadtxt
函数可以设置每一列数据的数据类型,只不过稍微复杂一点,来看一下代码:
data = np.loadtxt("test.txt", delimiter=",", dtype={'names': ('x', 'y', 'z', 'label', 'id'), 'formats': ('f4', 'f4', 'f4', 'i4', 'i4')}, skiprows=1)print('data: ', data)print('data type: ', data.dtype)
这段代码的重点是dtype={}
里面的内容,'names'
用来设置每一列数据的名称,'formats'
则用来设置每一列数据的数据类型,其中'f4'
表示float32
,'i4'
表示int32
。另外,CSV
文件中的第一行不是数据内容,可以设置参数skiprows=1
跳过第一行的内容。
输出结果:
data: [(-0.09879, -0.1823 , 0.1638 , 1, 1) ( 0.9946 , 0.07442, 0.01025, 0, 2)
( 0.1899 , -0.2922 , -0.9263 , 3, 3) (-0.9892 , 0.07461, -0.01235, 4, 4)]
data type: [('x', '
发表评论
共有[ 0 ]人发表了评论