import os
import struct
import numpy as np
import open3d as o3d
def bin2pcd(in_file, out_file):
points = []
with open(in_file, 'rb') as f:
while True:
data = f.read(3 * 4 + 4) # Assuming 3 floats for XYZ and 1 float for intensity
if not data:
break
values = struct.unpack('fff f', data)
point = [values[0], values[1], values[2], values[3]]
points.append(point)
# Convert to numpy array
points_array = np.array(points, dtype=np.float32)
# Create Open3D PointCloud
pc = o3d.geometry.PointCloud()
pc.points = o3d.utility.Vector3dVector(points_array[:, :3])
pc.colors = o3d.utility.Vector3dVector(np.full((len(points_array), 3), 255.0)) # White color for simplicity
# Save to PCD file
o3d.io.write_point_cloud(out_file, pc)
def batch_bin2pcd(input_dir, output_dir):
# Create output directory if it doesn't exist
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# Get a list of all bin files in the input directory
bin_files = [f for f in os.listdir(input_dir) if f.endswith('.bin')]
for bin_file in bin_files:
bin_path = os.path.join(input_dir, bin_file)
pcd_file = os.path.join(output_dir, os.path.splitext(bin_file)[0] + '.pcd')
bin2pcd(bin_path, pcd_file)
# Example usage
input_directory = 'D:\\Lidar_data\\data_bin'
output_directory = 'D:\\Lidar_data\\data_pcd'
batch_bin2pcd(input_directory, output_directory)
print("转换完成!")
使用时只需要修改最后的输入目录和输出目录即可,其他内容不需要改变