KITTI数据集接口已经提供了matlab接口,本篇将说明详细说明其应用并与PCL进行对接。PCL为C++点云处理语言库,详情可见:http://pointclouds.org/

程序可以从官网下载,也可以从我的github上下载https://github.com/ZouCheng321/fusion_kitti,为运行本代码,必须先编译make.m文件。

关于激光相机的demo为 run_demoVelodyne.m

本例以读取 2011_09_26_drive_0005_sync场景,读取第一帧,为例

首先设置读取路径和基本信息

if nargin<
base_dir = './data/2011_09_26_drive_0005_sync';%场景路径
end
if nargin<
calib_dir = './data/2011_09_26';%标定文件路径
end
cam = ; % 第二个相机
frame = ; % 帧数

读取标定文件:

% load calibration
calib = loadCalibrationCamToCam(fullfile(calib_dir,'calib_cam_to_cam.txt'));
Tr_velo_to_cam = loadCalibrationRigid(fullfile(calib_dir,'calib_velo_to_cam.txt')); % compute projection matrix velodyne->image plane
R_cam_to_rect = eye();
R_cam_to_rect(:,:) = calib.R_rect{};
P_velo_to_img = calib.P_rect{cam+}*R_cam_to_rect*Tr_velo_to_cam; %内外参数

其中P_velo_to_img 为上文所释的投影矩阵:KRTcl。 Tr_velo_to_cam 为RTcl矩阵,R_cam_to_rect为相机畸变矫正矩阵,calib.P_rect{cam+1}为相机内参。

接下来读取图像和激光数据,并删除在相机平面后面的激光点:

% load and display image
img = imread(sprintf('%s/image_%02d/data/%010d.png',base_dir,cam,frame));
fig = figure('Position',[ size(img,) size(img,)]); axes('Position',[ ]);
imshow(img); hold on; % load velodyne points
fid = fopen(sprintf('%s/velodyne_points/data/%010d.bin',base_dir,frame),'rb');
velo = fread(fid,[ inf],'single')';
velo = velo(::end,:); % remove every 5th point for display speed
fclose(fid); % remove all points behind image plane (approximation
idx = velo(:,)<;
velo(idx,:) = [];

最后就是投影过程:

velo_img = project(velo(:,:),P_velo_to_img);

在图像上显示,距离用颜色表示:

cols = jet;
for i=:size(velo_img,)
col_idx = round(*/velo(i,));
plot(velo_img(i,),velo_img(i,),'o','LineWidth',,'MarkerSize',,'Color',cols(col_idx,:));
end

下面我将为大家说明获取保存为彩色点云,为后续算法做准备。

首先去除投影到图像外界的点:

X_plane=round(velo_img(:,));
Y_plane=round(velo_img(:,));
cloud=velo(:,:);
indice=find(X_plane>size(img,));
X_plane(indice)=[];
Y_plane(indice)=[];
cloud(indice,:)=[];
indice=find(X_plane<);
X_plane(indice)=[];
Y_plane(indice)=[];
cloud(indice,:)=[];
indice=find(Y_plane>size(img,));
X_plane(indice)=[];
Y_plane(indice)=[];
cloud(indice,:)=[];
indice=find(Y_plane<);
X_plane(indice)=[];
Y_plane(indice)=[];
cloud(indice,:)=[];

然后获取图像每个点的RGB值:

R=img(:,:,);
G=img(:,:,);
B=img(:,:,); induv=sub2ind(size(R),X_plane,Y_plane); cloud(:,)=double(R(induv))/+;
cloud(:,)=double(G(induv))/+;
cloud(:,)=double(B(induv))/+;

最后将点云保存为pcd格式,借助了外部文件savepcd.m:

savepcd('color_cloud.pcd',cloud');

接下开用pcl库显示点云,请确保电脑已经安装pcl:

cd view
mkdir build
cd build
cmake ..
make
./cloud_viewer ../../color_cloud.pcd

可以看见融合后的彩色点云:

至于如何利用所以帧建立地图将在后面的博客中介绍。

激光相机数据融合(4)--KITTI数据集中matlab接口说明及扩展的更多相关文章

  1. DataPipeline丨新型企业数据融合平台的探索与实践

    文 |刘瀚林 DataPipeline后端研发负责人 交流微信 | datapipeline2018 一.关于数据融合和企业数据融合平台 数据融合是把不同来源.格式.特点性质的数据在逻辑上或物理上有机 ...

  2. SLAM+语音机器人DIY系列:(三)感知与大脑——2.带自校准九轴数据融合IMU惯性传感器

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  3. 数据融合(data fusion)原理与方法

    数据融合(data fusion)原理与方法 数据融合(data fusion)最早被应用于军事领域.     现在数据融合的主要应用领域有:多源影像复合.机器人和智能仪器系统.战场和无人驾驶飞机.图 ...

  4. 激光相机数据融合(3)--KITTI数据集

    KITTI数据集提供了双目图像,激光数据,和imu/gps位置信息,其中还包括了大量的算法.下载地址为:http://www.cvlibs.net/datasets/kitti/raw_data.ph ...

  5. 数据质量、特征分析及一些MATLAB函数

    MATLAB数据分析工具箱 MATLAB工具箱主要含有的类别有: 数学类.统计与优化类.信号处理与通信类.控制系统设计与分析类.图像处理类.测试与测量类.计算金融类.计算生物类.并行计算类.数据库访问 ...

  6. reshape2 数据操作 数据融合 (melt)

    前面一篇讲了cast,想必已经见识到了reshape2的强大,当然在使用cast时配合上melt这种强大的揉数据能力才能表现的淋漓尽致. 下面我们来看下,melt这个函数以及它的特点. melt(da ...

  7. Atitit 数据融合merge功能v3新特性.docx

    Atitit 数据融合merge功能v3新特性.docx 1.1. 版本历史1 1.2. 生成sql结果1 1.3. 使用范例1 1.4. 核心代码1 1.1. 版本历史 V2增加了replace部分 ...

  8. eas之数据融合

    1.如何进行自由融合自由融合无须指定区域,KDTable将根据指定的融合模式,融合相邻且值相等的单元.// 自由行融合table.getMergeManager().setMergeMode(KDTM ...

  9. CarbonData:大数据融合数仓新一代引擎

    [摘要] CarbonData将存储和计算逻辑分离,通过索引技术让存储和计算物理上更接近,提升CPU和IO效率,实现超高性能的大数据分析.以CarbonData为融合数仓的大数据解决方案,为金融转型打 ...

随机推荐

  1. thinking in java 随笔

    初始化顺序 在一个类里,初始化的顺序是由变量在类内的定义顺序决定的.即使变量定义大量遍布于方法定义的中间,那些变量仍会在调用任何方法之前得到初始化--甚至在构建器调用之前.例如: class Tag ...

  2. Spring MVC 过滤静态资源访问

    过滤的必要性 一般来说,HTTP 请求都会被映射到 DispatcherServlet,进而由具体的类来承接处理,但对于类似 js 或者 css 这样的静态资源则没必要这样,因为对资源的获取只需返回资 ...

  3. iOS代码处理横屏问题

    借助通知来控制界面的横竖屏切换.还是整个App中大部分界面都是竖屏,某个界面可以横竖屏切换的情况. 首先,在[General]-->[Device Orientation]设置仅支持竖屏,lik ...

  4. Linux-问题集锦(1)

    一. 某用户只读特定文件夹 只读目录 :  /home/www/yqz/logs 1.  创建用户        useradd ReadOnly        passwd ReadOnly 2. ...

  5. 奥利奥好吃吗?Android 8.0新特性适配测试报告来啦!

    WeTest 导读 谷歌2017 I/O开发者大会上发布了Android 8.0的正式版, 其官方代号为Oreo(奥利奥).网上关于Android8.0新功能特性的介绍已铺天盖地,新功能特性会对程序应 ...

  6. Linux下PHP连接MS SQLServer的办法

    Linux下PHP连接MS SQLServer的办法分析问题 本来PHP脚本读写SQLServer是没有什么问题的,在Apache for windows和Windows IIS下可以工作的很好,一般 ...

  7. Docker中搭建zookeeper集群

    1.获取官方镜像 从dockerhub获取官方的zookeeper镜像: docker pull zookeeper 2.了解镜像内容 拉取完镜像后,通过 docker inspect zookeep ...

  8. JavaBean编辑器的简单介绍

    引言 Sun所指定的JavaBean规范很大程度上是为IDE准备的--它让IDE能够以可视化的方式设置JavaBean的属性.如果在IDE中开发一个可视化的应用程序,则需要通过属性设置的方式对组成应用 ...

  9. IDEA + Maven + JavaWeb项目搭建

    前言:在网上一直没找到一个完整的IDEA+Maven+Web项目搭建,对于IDEA和Maven初学者来说,这个过程简单但是非常痛苦的,对中间的某些步骤不是很理解,导致操作错误,从而项目发布不成功,一直 ...

  10. PHP开发框架之YII框架学习——碾压ThinkPHP不是梦

      前  言 JRedu 程序猿是一种慵懒的生物!能少敲一行代码,绝对不会多敲一个字符!所以,越来越多的开发框架应运而生,在帮助我们完成功能的同时,极大程度上也帮我们节省了人力物力,而且也提高了系统的 ...