将KITTI数据集中.bin文件通过Matlab生成.pcd文件,解决由Matlab生成的.pcd文件无法在pcl正常显示的问题。
初学点云处理是用PCL入门的,以至于现在对任何点云的处理都想在PCL下搞,后来想着接触一些点云量大的贴近生活,就从KITTI下载,但是这里面点云数量大的惊人,在CloudComapre根本运行不起来,还是决定将此在PCL下运行。仅以此记录点云学习过程。
一、KITTI数据集下载
KITTI数据集作为自动驾驶领域的经典数据集之一,比较适合新手入门。网址如下:http://www.cvlibs.net/datasets/kitti/eval_object.php?obj_benchmark=3d 现在直接从KITTI官网好像不能下,有个小技巧就是下载一个xun雷,通过xun雷进入网址课正常下载。前提还需要注册一下。其他人下载的都是那个29G的object,但我感觉现在用不着,就选择了如下图中的文件。
是以.bin存储的
二、.bin 2 .pcd
我试了其他的各种软件,还是感觉matlab最靠谱。
function bin2Pcd()
clear;
files = dir("E:\Livox\data_road\KITTI\training\bin2pcd"); % 获取当前文件夹中的所有文件
len = length(files); % 文件数量
name=[];
for ii=1:len % 依次遍历所有的bin文件,将其转换为pcd格式
if (strcmp(files(ii).name, '.') == 1) ... % 跳过.以及..文件夹
|| (strcmp(files(ii).name, '..') == 1)
continue;
end
file1D=fopen("E:\Livox\data_road\KITTI\training\bin2pcd\"+files(ii).name,"rb"); %获取当前文件
[a,count]=fread(file1D,'float32') % a 文件内容。矩阵a中存储了全部的点(481072行 * 1列。每个数据占一行,每4个数据为一组);count 文件数量
x = a(1:4:end); %获取矩阵a中所有的x点。第1行开始,步数为4,直到最后一行
y = a(2:4:end); % 获取矩阵a中所有的y点。第2行开始,步数为4,直到最后一行
z = a(3:4:end); % 获取矩阵a中所有的z点。第3行开始,步数为4,直到最后一行
intensity= b(4:4:end); % 强度(反射值)。第4行开始,步数为4,直到最后一行
data = pointCloud([x y z],'intensity',intensity); %根据xyz坐标和强度值,转换为一个点云
pcshow(data); %显示点云
%hh = [files(ii).name(1:end-4),'.ply'] 文件名
%pcwrite(data,[files(ii).name(1:end-4),'.ply'],'PLYFormat','ascii'); %将点云对象存储到 当前文件名.ply文件
%img=pcread([files(ii).name(1:end-4),'.ply']); % 读取ply或pcd格式的文件
%pcshow(img); %显示点云
pcwrite(data,[files(ii).name(1:end-4),'22.pcd']); %将点云对象存储到 当前文件名.pcd文件
end
end
这种方式是可以生成.pcd文件的,但是确无法在pcd_viewer正常显示,几十万个点只显示几个。后来发现是因为找不到xyz导致的。
查资料了解到是因为Matlab生成的.pcd文件是双精度的,而PCL默认接受的是单精度的,只需要在上方的代码中修改一个地方。
b = single(a);
x = b(1:4:end); %获取矩阵a中所有的x点。第1行开始,步数为4,直到最后一行
y = b(2:4:end); % 获取矩阵a中所有的y点。第2行开始,步数为4,直到最后一行
z = b(3:4:end); % 获取矩阵a中所有的z点。第3行开始,步数为4,直到最后一行
intensity= b(4:4:end); % 强度(反射值)。第4行开始,步数为4,直到最后一行
三,pcd_viewer可视化KITTI数据
pcl_viewer um_00001.pcd
完美显示。