如何在Python中让Open3D读取Pandas DataFrame并生成点云
Pandas DataFrame转Open3D点云的正确方法
问题场景
我通过以下代码从CSV文件提取XYZ坐标,得到Pandas DataFrame:
import pandas as pd import open3d as o3d import numpy as np data = pd.read_csv("./assets/landmarks_frame0.csv", header=None, usecols=range(1,4)) print(data)
数据正常,前三列对应x、y、z坐标。但尝试用o3d.io.read_point_cloud(data, format="xyz")生成点云时触发TypeError,因为该函数仅接受字符串类型的文件名参数,无法直接传入DataFrame。
解决方案
不需要通过文件中转,直接将DataFrame转换为numpy数组,再赋值给Open3D的PointCloud对象即可。完整代码如下:
# 读取CSV得到DataFrame data = pd.read_csv("./assets/landmarks_frame0.csv", header=None, usecols=range(1,4)) # 将DataFrame转换为numpy数组(推荐用to_numpy,替代旧的values属性) points_array = data.to_numpy(dtype=np.float32) # 初始化Open3D点云对象 pcd = o3d.geometry.PointCloud() # 将numpy数组转换为Open3D支持的点格式并赋值 pcd.points = o3d.utility.Vector3dVector(points_array) # 验证并可视化 print(pcd) print(np.asarray(pcd.points)) o3d.visualization.draw_geometries([pcd], zoom=0.3412, front=[0.4257, -0.2125, -0.8795], lookat=[2.6172, 2.0475, 1.532], up=[-0.0694, -0.9768, 0.2024])
关键说明
o3d.utility.Vector3dVector:负责将numpy数组转换为Open3D内部兼容的点数据结构,支持float64类型;如果需要用float32,可改用Vector3fVector。- 直接操作内存数据比写入再读取文件更高效,避免了IO开销。
内容的提问来源于stack exchange,提问作者EnshenZhu
相关产品推荐
相关产品推荐

