将二进制激光雷达数据 (.bin) 转换为点云数据 (.pcd) 格式
Conversion of binary lidar data (.bin) to point cloud data (.pcd) format
我有使用 Velodyne-128 以 .bin 格式收集的激光雷达数据。我需要将它转换成 pcd 格式。我使用 NVIDIA Driveworks 进行数据处理,但没有将激光雷达二进制数据转换为 pcd 的工具。
所以,有没有办法将二进制激光雷达数据转换成pcd格式?
我从github找到了一段代码(参考如下):
import numpy as np
import struct
from open3d import *
def convert_kitti_bin_to_pcd(binFilePath):
size_float = 4
list_pcd = []
with open(binFilePath, "rb") as f:
byte = f.read(size_float * 4)
while byte:
x, y, z, intensity = struct.unpack("ffff", byte)
list_pcd.append([x, y, z])
byte = f.read(size_float * 4)
np_pcd = np.asarray(list_pcd)
pcd = geometry.PointCloud()
pcd.points = utility.Vector3dVector(np_pcd)
return pcd
这是将激光雷达数据(.bin 格式)转换为 .pcd 格式的片段
with open ("lidar_velodyne64.bin", "rb") as f:
byte = f.read(size_float*4)
while byte:
x,y,z,intensity = struct.unpack("ffff", byte)
list_pcd.append([x, y, z])
byte = f.read(size_float*4)
np_pcd = np.asarray(list_pcd)
pcd = o3d.geometry.PointCloud()
v3d = o3d.utility.Vector3dVector
pcd.points = v3d(np_pcd)
根据示例here,您可以将其保存到文件中,如下所示:
import open3d as o3d
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
尽管所有其他解决方案可能都是正确的,但我一直在寻找一个简单的numpy-only 版本。这是:
import numpy as np
import open3d as o3d
# Load binary point cloud
bin_pcd = np.fromfile("lidar_velodyne64.bin", dtype=np.float32)
# Reshape and drop reflection values
points = bin_pcd.reshape((-1, 4))[:, 0:3]
# Convert to Open3D point cloud
o3d_pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(points))
# Save to whatever format you like
o3d.io.write_point_cloud("pointcloud.pcd", o3d_pcd)
我有使用 Velodyne-128 以 .bin 格式收集的激光雷达数据。我需要将它转换成 pcd 格式。我使用 NVIDIA Driveworks 进行数据处理,但没有将激光雷达二进制数据转换为 pcd 的工具。
所以,有没有办法将二进制激光雷达数据转换成pcd格式?
我从github找到了一段代码(参考如下):
import numpy as np
import struct
from open3d import *
def convert_kitti_bin_to_pcd(binFilePath):
size_float = 4
list_pcd = []
with open(binFilePath, "rb") as f:
byte = f.read(size_float * 4)
while byte:
x, y, z, intensity = struct.unpack("ffff", byte)
list_pcd.append([x, y, z])
byte = f.read(size_float * 4)
np_pcd = np.asarray(list_pcd)
pcd = geometry.PointCloud()
pcd.points = utility.Vector3dVector(np_pcd)
return pcd
这是将激光雷达数据(.bin 格式)转换为 .pcd 格式的片段
with open ("lidar_velodyne64.bin", "rb") as f:
byte = f.read(size_float*4)
while byte:
x,y,z,intensity = struct.unpack("ffff", byte)
list_pcd.append([x, y, z])
byte = f.read(size_float*4)
np_pcd = np.asarray(list_pcd)
pcd = o3d.geometry.PointCloud()
v3d = o3d.utility.Vector3dVector
pcd.points = v3d(np_pcd)
根据示例here,您可以将其保存到文件中,如下所示:
import open3d as o3d
o3d.io.write_point_cloud("copy_of_fragment.pcd", pcd)
尽管所有其他解决方案可能都是正确的,但我一直在寻找一个简单的numpy-only 版本。这是:
import numpy as np
import open3d as o3d
# Load binary point cloud
bin_pcd = np.fromfile("lidar_velodyne64.bin", dtype=np.float32)
# Reshape and drop reflection values
points = bin_pcd.reshape((-1, 4))[:, 0:3]
# Convert to Open3D point cloud
o3d_pcd = o3d.geometry.PointCloud(o3d.utility.Vector3dVector(points))
# Save to whatever format you like
o3d.io.write_point_cloud("pointcloud.pcd", o3d_pcd)