基于点云的3D障碍物检测

描述

基于点云的3D障碍物检测

主要有以下步骤:

点云数据的处理

基于点云的障碍物分割

障碍物边框构建

点云到图像平面的投影

点云数据的处理

KITTI数据集

KITTI数据集有四个相机,主要使用第三个相机(序号为02)拍摄的图片、标定参数和标签文件。

点云数据一般表示为N行,至少三列的numpy数组。每行对应一个单独的点,所以使用至少3个值的空间位置点(X, Y, Z)来表示。 

激光光束

 
在KITTI数据中有一个附加值“反射率”,这是衡量激光光束在那个位置被反射回来了多少。所以在KITTI数据中,其点云数据就是N*4的矩阵。

三维点云的可视化

在MATLAB中可视化三维点云,如下图。 

激光光束

额外的工作:三维点云的可视化,可使用python中的mayavi来实现,它是一个专门画3D图的python工具。另外,在有的论文中常常用到点云的鸟瞰图和前视图(包含360度的全景柱面图)。

高精地图

ROI指定从高精地图检索到包含路面、路口的可驾驶区域。以下点云数据处理在高精地图的基础上进行点云处理,默认去除路边建筑物和树木等背景对象。

额外的工作:百度Apollo使用了高精地图ROI过滤器建立了网格,对网格中的点云数据特征进行CNN学习来实现障碍物分割聚类,之后使用了MinBox构建障碍物边框。

去除地平面

找到地面平面并移除地面平面点,使用RANSAC(随机采样一致)算法检测和匹配地面平面,最后结果如下图。 

激光光束

基于点云的障碍物分割

对点云数据进行预处理后,只留下路面上障碍物的点云,其余的背景障碍物以及地面已被移除。障碍物分割主要检测和划分单独的障碍物,将单独的车辆、行人等障碍物分割出来。

由于只是在二维图像中画出3D目标框,所以保留车辆前面的点(取x>5)。在剩下的点云中使用栅格法构建俯视图(即投影到x-y平面)2D网格,网格大小由点云的大小来决定。

通过建立网格,可以得到以下统计量:

网格中的点云个数

网格中的点云的最大、最小和平均高度

网格中的点云序号

基于以上统计量,寻找每个格子附近(3*9)领域的连通区域,每个连通区域为一个障碍物,达到了分割障碍物的目的。

额外的工作:使用KITTI的标签label文件来得到二维图像上的障碍物边界框,在此边界框中进行聚类分割前景障碍物和背景。

障碍物边框构建

从以上得到每个障碍物点云后,就需要画出每个障碍物的边界框。在这里使用最小凸包法求出包围点云的最小面积多边形边界框,如下图。 

激光光束

 
基于最小凸包法得到障碍物周围的点,在这些点的基础上求出包围最小面积的矩形,如下图。 

激光光束

 
可以看到黄色部分的点云求最小面积矩形边界框,会因为点云的稀疏,使得边界框不精确。

额外的工作:根据点云的x, y坐标找到x, y的最大值和最小值的点(共有4个点),根据这4个点画出矩形框。很显然,这样做是不行的,但是如果知道车辆的朝向,以朝向为轴找到距离轴最大最小的点,此方法画出的边界框更加精确。

点云到图像平面的投影

点云到图像平面的投影需要读取标定参数文件,得到三个参数(相机的内参矩阵、基于相机0的旋转矩阵、外参矩阵),三个参数的乘积也就是点云到图像的投影矩阵,结果如下图。 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分