我正在尝试对点云进行下采样。我对我的数据的不同部分有两种数据格式。.bin文件没有问题,但是当我试图对.e57文件进行下采样时,我遇到了一个奇怪的问题。下面是我要做的:
import numpy as np
import open3d
pointfile = "path/to/file.e57"
pcd_data = np.fromfile(point_file, dtype=np.float32)
pcd_data = velo_data.reshape(-1, 4)
pcd_points = velo_data[:, :3]
pcd = open3d.geometry.PointCloud()
pcd.points = open3d.utility.Vector3dVector(pcd_points)
pcd_down = pcd.voxel_down_sample(voxel_size=0.8)
res = np.asarray(pcd_down.points)
它在.bin上工作得很好,但是当我尝试.e57时,我得到了错误:
RuntimeError: [Open3D ERROR] [VoxelDownSample] voxel_size is too small.
无论我使用的voxel_size是0.005、0.80、1005000还是1000000000000000。
我尝试了较早的open3d版本:
pcd_down = open3d.geometry.voxel_down_sample(voxel_size=0.8)
至少它不会抛出错误,但我的下采样点云包含0个点(从~350000)。
由于文件的结构应该是具有4个特征的点,文件似乎被正确读取(这适用于我的任何文件),因为重塑工作很好。
有什么想法吗?
发布于 2021-04-27 17:12:15
我仍然对最初的错误一无所知,但是我通过使用pye57:https://github.com/davidcaron/pye57和这个可能出现的问题的解决方案成功地解决了这个问题:https://github.com/davidcaron/pye57/issues/6#issuecomment-803894677
使用下面的代码
import numpy as np
import open3d
import pye57
point_file = "path/to/file.e57"
e57 = pye57.E57(point_file)
data = e57.read_scan_raw(0)
assert isinstance(data["cartesianX"], np.ndarray)
assert isinstance(data["cartesianY"], np.ndarray)
assert isinstance(data["cartesianZ"], np.ndarray)
x = np.array(data["cartesianX"])
y = np.array(data["cartesianY"])
z = np.array(data["cartesianZ"])
pcd_points = np.concatenate((x, y), axis=0)
pcd_points = np.concatenate((pcd_points, z), axis=0)
pcd_points = velo_points.reshape(-1, 3)
pcd = open3d.geometry.PointCloud()
pcd.points = open3d.utility.Vector3dVector(pcd_points)
pcd_down = pcd.voxel_down_sample(voxel_size=0.0035)
我终于得到了一个下采样的点云。
https://stackoverflow.com/questions/67278360
复制相似问题