将激光雷达点云俯视图映射到二维图像
简介
本节讲解如何将激光雷达点云俯视图(仅考虑水平坐标)映射到二维图像中,其中涉及到激光雷达点云的地面部分滤除,和不同坐标范围下的数据的简单映射。本文主要侧重提供方法的参考,代码仅供参考,可根据实际使用场景的需要进行修改。
本文中采用的激光雷达数据来自KITTI数据集,使用Velodyne HDL-64E激光雷达采集得到,该激光雷达工作频率10Hz,每个周期可以采集大约10万个点。更多信息可参考KITTI数据集的传感器安装部分文档:http://www.cvlibs.net/datasets/kitti/setup.php
在KITTI数据集中,该激光雷达点云数据已经和一个前视摄像头进行了同步,本文使用的激光雷达数据采集到的场景近似于下方图片所示的场景。
实现方法
- 通过数据文件加载激光雷达点云数据,来自Kitti数据集。
- 初始化特定像素大小的图片(1000*2000)。
- 根据需要显示的激光雷达点云范围和图片像素范围,将激光雷达点云的横纵坐标映射到图片的特定像素中,其中激光雷达所处的世界坐标系遵循右手系,x轴对应前进方向,y轴对应左侧横向;而对于图像坐标系,x,y分别对应其图像的行索引和列索引,且图像左上角为原点。
具体处理方式参考如下代码:
//参考定义:CvSize cvSize( int width, int height );
cv::Size worldSize(10.0,20.0); //待显示的激光雷达点云在世界坐标系下的范围
cv::Size imageSize(1000.0,2000.0); //待显示的图片的像素范围(与世界坐标系等比例)
...
float xw=(*it).x;//世界坐标系下的激光雷达点云纵坐标
float yw=(*it).y;//世界坐标系下的激光雷达点云横坐标(车身左侧为正)
// x,y表示图片坐标系下的坐标点,分别对应图像的行索引和列索引。
//(如相关坐标系对应关系不同,可进行相应调整)
int x = (-yw * imageSize.height / worldSize.height) + imageSize.width / 2;
int y = (-xw * imageSize.height / worldSize.height) + imageSize.height;
转换后的显示效果如下图所示:
4. 可根据激光雷达相对地面的安装位置高度,设置恰当的阈值变量doulble minZ=-1.40
,只有该阈值以上的激光点云才进行上述映射操作,从而过滤掉激光点云中的地面反射目标。最终映射后的图片显示效果如下所示:
参考代码
实现以图片形式显示激光雷达点云俯视图的相关参考代码如下图所示,此为优达学城提供的参考代码,未经过本人实际测试,仅供参考: