




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Python如何用NumPy读取和保存点云数据目录前言loadtxt函数的用法基本用法指定每一列的数据类型结合生成器使用tofile和fromfile函数
前言
最近在学习点云处理的时候用到了Modelnet40数据集,该数据集总共有40个类别,每个样本的点云数据存放在一个TXT文件中,每行的前3个数据代表一个点的xyz坐标。我需要把TXT文件中的每个点读取出来,然后用Open3D进行显示。怎么把数据从TXT文件中读取出来呢?NumPy提供了一个功能非常强大的函数loadtxt可以非常简单地实现这个功能。来看一下代码:
import
open3d
as
o3d
import
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)
datatype:float64
指定每一列的数据类型
假如我们有一个CSV文件:
x,y,z,label,id
-0.098790,-0.182300,0.163800,1,1
0.994600,0.074420,0.010250,0.2,2
0.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)]
datatype:[(x,f4),(y,f4),(z,f4),(label,i4),(id,i4)]
可以看到,通过这样的方式设置dtype,读取的每一行数据变成了一个tuple类型。
结合生成器使用
从NumPy的文档中可以知道,loadtxt函数的第一个参数可以是文件对象、文件名或者生成器。传入生成器有什么用呢?我们来看几个例子。
处理多个分隔符
假如我们的文件内容是这样的,每一行数据有3个分隔符,,/和-:
9.87,1.82,1.63,1/11-1
9.94,7.44,1.02,1/11-2
1.89,2.92,9.26,1/11-3
0.98,7.46,1.23,1/11-4
这种情况下不能通过delimiter参数设置多个分隔符,这时候就可以通过生成器来进行处理:
def
generate_lines(file_path,
delimiters=[]):
with
open("test.txt")
as
f:
for
line
in
f:
line
=
line.strip()
for
d
in
delimiters:
line
=
line.replace(d,
"
")
yield
line
delimiters
=
[",",
"/",
"-"]
generator
=
generate_lines("test.txt",
delimiters)
data
=
np.loadtxt(generator)
print(data)
这段代码构建了一个生成器将文件中每一行的分隔符全部替换成loadtxt函数默认的空格分隔符,然后把生成器传入loadtxt函数,这样loadtxt函数就能成功解析文件中的数据了。
输出结果:
[[9.871.821.631.11.1.]
[9.947.441.021.11.2.]
[1.892.929.261.11.3.]
[0.987.461.231.11.4.]]
读取指定的行
在某些情况下,我们需要读取指定几行的数据,那么也可以通过生成器来实现。还是上面的文件内容,我们通过生成器来读取第2行和第3行:
def
generate_lines(file_path,
delimiters=[],
rows=[]):
with
open("test.txt")
as
f:
for
i,
line
in
enumerate(f):
line
=
line.strip()
for
d
in
delimiters:
line
=
line.replace(d,
"
")
if
i
in
rows:
yield
line
delimiters
=
[",",
"/",
"-"]
rows
=
[1,
2]
generator
=
generate_lines("test.txt",
delimiters,
rows)
data
=
np.loadtxt(generator)
print(data)
输出结果:
[[9.947.441.021.11.2.]
[1.892.929.261.11.3.]]
通过上面的例子可以知道,loadtxt函数结合生成器使用可以实现很多的功能。
tofile和fromfile函数
从TXT文件中读取到点云数据后,我想把数据保存到二进制文件中,需要怎么操作呢?NumPy的ndarray类提供了tofile函数可以非常方便地将数据保存到二进制文件中。把数据以二进制文件保存后又怎么读进来呢?NumPy还提供了一个fromfile函数用于从文本文件和二进制文件中读取数据。
import
open3d
as
o3d
import
numpy
as
np
def
main():
points_data
=
np.loadtxt(
"airplane_0001.txt",
delimiter=",",
dtype=np.float32)
bin_file
=
'airplane_0001.bin'
points_data
=
points_data[:,
:3]
points_data.tofile(bin_file)
pc
=
np.fromfile(bin_file,
dtype=np.float32)
pc
=
pc.reshape(-1,
3)
pcd
=
o3d.geometry.PointCloud()
pcd.points
=
o3d.utility.Vector3dVector(pc)
o3d.visualiza
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 私人转让汽车合同协议书
- 2024年视听周边设备:耳机项目资金需求报告代可行性研究报告
- 二手车中间人合同协议书
- 2024年力与变形检测仪项目资金申请报告代可行性研究报告
- 品牌项目合同协议书范本
- 楼房出租合同协议书图片
- 合同协议书心得
- 作业托管合同协议书
- 房子主页合同协议书
- 消费安全协议书合同
- 中职ps期末考试试卷及答案
- 高温下质子交换膜燃料电池密封垫泄漏机理分析
- 2025-2030年中国科技金融行业前景预测及投资战略规划研究报告
- 美育课程中的跨学科融合教学实践
- 2024年湖北省竹溪县事业单位公开招聘医疗卫生岗笔试题带答案
- 浙江省台州市十校联盟2024-2025学年高二下学期期中联考技术试题(含答案)
- 2024年广东大亚湾开发区招聘公办学校教师笔试真题
- 四川2025年四川美术学院招聘辅导员笔试历年参考题库附带答案详解
- 江苏交控笔试试题及答案
- JJF1033-2023计量标准考核规范
- 颈椎病课件完整版
评论
0/150
提交评论