城市 LIDAR 场景通常由数百万个点组成,对在整个场景中提取最有效的特征比较耗时。 在识别街道设施(即灯柱、消火栓、路缘石)的场景中,绝大多数点(例如路面、人行道等)与任务无关,有没有一种分割算法可以有效区分不同尺度结构的点? 这里介绍这样一个算法,但在描述算法之前,先介绍尺度空间和表面处理的概念。

背景

DoG算法广泛运用于图像处理,作为边缘检测器,最著名是高斯差分金字塔保证目标识别中的尺度不变性

下面介绍了一种DoG功能和效率与相似的算子,用于点云或网格形式的无组织距离数据。同时它展示了 3D 数据中的 3D 边缘检测和基于比例分割的应用。同时它展示了 3D 数据中的 3D 边缘检测和基于比例分割的应用

高斯差

信号处理(以及图像处理)中使用的 DoG 算子由从窄高斯中减去宽高斯。 在以原点为中心的连续二维情况下,可定义为:
其中,u,vu,vu,v是2维坐标,σ1<σ2\sigma_1<\sigma_2σ1​<σ2​是两个高斯分布的标准差

DoG 是高斯的拉普拉斯算子的近似值,即高斯函数的二阶导数。 实际上是一个带通滤波器,带通滤波器仅将信号/图像中的频率保留在某个窄频带中。

表面处理

计算机视觉倾向于将局部数据简单地视为具有 3D 空间坐标的点的集合。正如 2D 图像可以被认为是 3D(两个空间坐标,一个强度),局部数据作为 3D 表面的离散采样,可以被认为是 (3 + n) 维(3 个空间坐标, n 维表面描述符向量)。

在表面处理中,通常考虑的每个点 p 处的单位法线 n^p\hat n_pn^p​ 作为表面描述符,这些法线与点坐标一起形成法线贴图,即每个点都由 6 维向量描述,该向量类似于 2D 图像的像素图的方式进行处理。

图像处理和表面处理不同是:

  • 图像只有一个非空间元素(即像素)。表面被描述为一个矢量图,任何表面处理结果也是一个矢量图。

    在使用法线作为表面描述符的情况下,每个空间坐标都将关联一个 3D 向量

  • 2D 图像通常高像素网格,而点云数据是无组织的。

    激光雷达扫描仪的采样密度取决于目标表面与扫描仪的距离。且大多数任何重要尺寸的 LIDAR 场景都是多次扫描配准,因此密度变化不规则且经常突然变化,甚至在单个扫描特征之间也是如此。

在 2D 图像中,尽管光照条件、对象边界和尺度转换会产生很大的变化,但现实世界图像中相邻像素的变化是有界的。而现实世界的range data,法线与其空间坐标之间的耦合要高得多,因为采样点之间的表面变化受连续光滑表面上点之间的距离限制(即有限表面曲率)

尺度空间

在 2D 计算机视觉中,尺度空间常用于分割和目标识别。尺度不变性对于 2D 目标识别至关重要。
在 3D 计算机视觉中,尺度通常是被忽视。 由于 3D 传感器保留了尺度(取而代之的是采样密度、噪声特性等随物体距离而变化),无需特殊处理即可发现场景中物体的比例。事实上,在3D 物体识别算法要避免尺度不变性,由于range data中不同大小的物体具有不同的尺度。 3D 计算机视觉研究中遇到的典型场景是由几个大小大致相似物体组成的杂乱场景,而城市 LIDAR 场景由许多不同尺度的物体组成。
在2D图像中运用高斯金字塔进行尺度分割城市场景,原理为:

  • 高斯金字塔是通过对图像重复应用具有固定标准偏差的高斯滤波器生成的,同时在每层level对图像进行二次采样到一半大小。生成的金字塔以不同的比例隔离场景中的对象。随着高斯的反复应用,比如汽车等小规模结构很快就会消失,而道路等大规模结构,最终只能看到土地使用情况(即铺面与非铺面)。
    二维图像中的大尺度结构是低频的,而小尺度结构是高频的。高斯是一个低通滤波器,因此在高斯金字塔的每个尺度上,图像中的较高频率被移除

4.2 法线算子的差异

4.2.1 法线作为表面的尺度空间

利用 3D 点云的法线估计方法,可以简单定义range data的尺度空间算法。法线一般用支撑半径(或相应地在结构化数据中固定数量的邻居)来估计。 支撑半径决定了法线所代表的最小比例表面结构。 对于用小支撑半径估计的法线,它们将受到噪声和小尺度表面结构影响。另一方面,用大支撑半径估计的法线受噪声和小尺度结构的影响较小,而受大尺度结构的影响更大。 下图说明了这种效果。


图:城市场景中支撑半径对估计法线的影响的图示。 较大的支撑半径 (r3) 平均了信号中的小尺度变化(高频),而较小的支撑半径 (r1) 更受小尺度变化的影响

假设我们为表面定义一个比例算子,
L(p,r)=n^(p,r)L(p,r)=\hat n(p,r)L(p,r)=n^(p,r)

法线对点云采样表面的影响是抑制表面中特征尺寸小于 r 的大部分结构,随着尺度参数 r 值的增加,细尺度表面结构越来越受到抑制。上式方程并不满足 Witkin 等人最初提出的全尺度空间公理。满足这些公理(在连续情况下)的唯一滤波器是高斯滤波器。

为满足全尺度空间公理,表面尺度空间算子的实现,可以通过给定支持半径中的法线的加权和,来平滑隐式表面,其中权重是从连续高斯函数中采样的。由于采样高斯核不满足这种实现的尺度空间公理,后引入了离散高斯核,定义满足全尺度空间公理的无组织范围图像,采样表面的尺度算子为

I‖p−x‖I_{‖p−x‖}I‖p−x‖​表示整数阶的修正贝塞尔函数。

法线差

large radius 估计出的法线向量表示的是大尺度,small radius估计出的法线向量代表的是小尺度。作者认为如果两个表面法线的方向几乎相同,那么表面的结构从第一个半径到第二个半径并没有显著变化。相比之下,如果一个中心点周围的较大邻域的结构与较小的邻域有显著不同,那么两个估计法线的方向可能会有较大的幅度变化。在这种情况下,两个半径之间的值通常代表了中心点附近的尺度。

用支撑半径估计的法线与尺度空间算法有一些相似,将两个不同支撑半径的法线相减可以近似一个带通滤波器,点云中的任一点 p 的DoN为:

DoN 可以通过将两个法线差减半来对其进行归一化,构造出场景中所有点的矢量法线差图。法线差可以根据幅度进行阈值化,即 Δn^(p)=‖Δn^(p)‖Δ_{ \hat n}(p) = ‖Δ_{\hat n}(p)‖Δn^​(p)=‖Δn^​(p)‖和或分量值,即 Δn^x(p)Δ_{ \hat n}^x(p)Δn^x​(p)和 Δn^y(p)Δ_{ \hat n}^y(p)Δn^y​(p)。归一化后,法线差被归一化幅度在 0 和 1 之间),阈值与场景无关。

range data近似法线

有许多方法估计点云的法线,只有使用固定支撑半径,而不是固定数量邻居,才适用于无序的点云,尤其当点云密度变化很大时。将基于固定数量邻居的方法应用于采样密度变化很大的点云,例如城市 LIDAR 数据,可能需要使用不同的支撑半径来计算每个法线,得到每个点其不同尺度表面的估计法线,这样的法线不适用于 DoN 计算。

我们通过围绕每个点的固定支撑半径,使用局部邻域的主成分方法找到切平面来估计法线。这个邻域可能包含任意数量的点。结果是场景中的所有法线都以相同的比例计算。然而,由于某些range data的采样密度/分辨率变化很大,不同场景的准确度可能有很大差异。

用支撑半径 r 估计每个点的法线单位为:
n^(p,r)=e^3\hat n(p,r)=\hat e_3n^(p,r)=e^3​

其中 e^3\hat e_3e^3​ 是与局部邻域的最小特征值相关的特征向量,即 PCA 发现的最小变化方向

这种方法复杂度由最近邻算法决定,使用 kd 树实现的最近邻需要 O(N log N ) 来构建 kd 树,查找时间复杂度 为O(log N ) ,其中 N是点集 P 中的点云数量,随着邻域半径的​​增加,该邻域内的点数呈指数增长,查找邻域内的点所需的时间也会增加。

法线歧义

不管支撑半径如何,一个特定点的表面法线都应该在同一象限内有一个方向角。但是,根据局部数据估计的任何法线都将在一个轴上表现出模糊性:对于一个点的任何切平面,都有两个相等但方向相反的法线,其中任何一个在数学上都是有效的。这种正常的歧义通常通过传感器上下文来解决。正确的法线始终是指向距离传感器的半球。只要该点的两个法线在同一方向上,法线的差异就不会受到影响。

本质上DoN只是一种前处理,应该算是一种比较先进的点云滤波算法。分割本质上还是由欧式分割算法完成的

实验总结

DON算法的动机是直接使用无组织点云的估计表面法线图来定义无组织点云的多尺度算子,在任何给定半径下估计的曲面法线反映了支撑半径范围内曲面的基础几何结构,法线总是通过支撑半径(或通过固定数量的邻域)进行估计。该支撑半径确定法线表示的曲面结构中的尺度。

作者通过实验经验得出,对尺度比 r2/r1r_2 / r_1r2​/r1​ 为10时进行的阈值处理,对过滤掉大尺度平面的大点具有较好的结果,所以作者对于不用尺度的值的选取都为10的比例。对于小尺度对应的DoN参数(例如在0.2−2m范围内),属于低尺度物体的点具有很强的响应。例如,在图(b),尺度结构响应最强是这些建筑道路路缘、窗台和建筑立面的细节。对于较大尺度(即2−20m),属于较大结构的点具有较强的响应。例如,在图(d)建筑点有很大的响应,但非常大规模的结构(即路面)仍然表现出很小的响应。

代码

void differenceNormalsSegmentation(const pcl::PointCloud<pcl::PointXYZ>::Ptr in_cloud_ptr,pcl::PointCloud<pcl::PointXYZ>::Ptr out_cloud_ptr)
{float small_scale = 0.5;float large_scale = 2.0;float angle_threshold = 0.5;pcl::search::Search<pcl::PointXYZ>::Ptr tree;if (in_cloud_ptr->isOrganized()){tree.reset(new pcl::search::OrganizedNeighbor<pcl::PointXYZ>());} else{tree.reset(new pcl::search::KdTree<pcl::PointXYZ>(false));}// Set the input pointcloud for the search treetree->setInputCloud(in_cloud_ptr);pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::PointNormal> normal_estimation;// pcl::gpu::NormalEstimation<pcl::PointXYZ, pcl::PointNormal> normal_estimation;normal_estimation.setInputCloud(in_cloud_ptr);normal_estimation.setSearchMethod(tree);normal_estimation.setViewPoint(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(),std::numeric_limits<float>::max());pcl::PointCloud<pcl::PointNormal>::Ptr normals_small_scale(new pcl::PointCloud<pcl::PointNormal>);pcl::PointCloud<pcl::PointNormal>::Ptr normals_large_scale(new pcl::PointCloud<pcl::PointNormal>);normal_estimation.setRadiusSearch(small_scale);normal_estimation.compute(*normals_small_scale);normal_estimation.setRadiusSearch(large_scale);normal_estimation.compute(*normals_large_scale);pcl::PointCloud<pcl::PointNormal>::Ptr diffnormals_cloud(new pcl::PointCloud<pcl::PointNormal>);pcl::copyPointCloud<pcl::PointXYZ, pcl::PointNormal>(*in_cloud_ptr, *diffnormals_cloud);// Create DoN operatorpcl::DifferenceOfNormalsEstimation<pcl::PointXYZ, pcl::PointNormal, pcl::PointNormal> diffnormals_estimator;diffnormals_estimator.setInputCloud(in_cloud_ptr);diffnormals_estimator.setNormalScaleLarge(normals_large_scale);diffnormals_estimator.setNormalScaleSmall(normals_small_scale);diffnormals_estimator.initCompute();diffnormals_estimator.computeFeature(*diffnormals_cloud);pcl::ConditionOr<pcl::PointNormal>::Ptr range_cond(new pcl::ConditionOr<pcl::PointNormal>());range_cond->addComparison(pcl::FieldComparison<pcl::PointNormal>::ConstPtr(new pcl::FieldComparison<pcl::PointNormal>("curvature", pcl::ComparisonOps::GT, angle_threshold)));// Build the filterpcl::ConditionalRemoval<pcl::PointNormal> cond_removal;cond_removal.setCondition(range_cond);cond_removal.setInputCloud(diffnormals_cloud);pcl::PointCloud<pcl::PointNormal>::Ptr diffnormals_cloud_filtered(new pcl::PointCloud<pcl::PointNormal>);// Apply filtercond_removal.filter(*diffnormals_cloud_filtered);pcl::copyPointCloud<pcl::PointNormal, pcl::PointXYZ>(*diffnormals_cloud_filtered, *out_cloud_ptr);
}

参考:基于法线微分的DoN算法

激光类雷达障碍物检测与追踪——DON点云滤波相关推荐

  1. 毫米波雷达障碍物检测算法介绍

    Radar系列文章 传感器融合是将多个传感器采集的数据进行融合处理,以更好感知周围环境:这里首先介绍毫米波雷达的相关内容,包括毫米波雷达基本介绍,毫米波雷达数据处理方法(测距测速测角原理,2D FFT ...

  2. 【自动驾驶】超声波雷达障碍物检测

    超声波(Ultrasound,又称超声波雷达)定位,即使用发射探头发出频率大于20KHz的声波和计算飞行时间来探测距离.常用的超声波频率有40KHz.48KHz和58KHz,其中最常用的频率是40KH ...

  3. 一文详解激光雷达的障碍物检测

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 激光雷达感知 自动驾驶中采用激光雷达做感知可以分为两个层次,低层次感知也叫作障碍物检测,只需要探测到前 ...

  4. 【激光雷达点云障碍物检测】综述

    文章和代码来源于知乎:https://zhuanlan.zhihu.com/p/128511171 自己从github上下载,并实现了代码:https://github.com/williamhyin ...

  5. 论文阅读——《基于卷积神经网络的车行环境多类障碍物检测与识别》

    近期学习了卷积神经网络相关的知识,在课余时间阅读了一篇有关障碍物检测的硕士生论文,不过就阅读的过程而言,感觉硕士论文有些冗杂,容易让读者抓不到重点,而且篇幅较多,耗费时间有些长,以后阅读论文可以直接从 ...

  6. 【radar】毫米波雷达动态障碍物检测相关论文汇总(聚类、分类、稀疏2D点、4D点、雷达成像、原始数据处理)(4)

    [radar]毫米波雷达动态障碍物检测相关论文汇总(聚类.分类.稀疏2D点.4D点.雷达成像.原始数据处理)(4) Detection of Dynamic Objects Clustering 20 ...

  7. 毫米波雷达、ADAS中的应用以及毫米波雷达的检测、测距、测速和角度测量

    毫米波雷达的检测.测距.测速和角度测量 毫米波(Millimeter-Wave,缩写:MMW),是指长度在1~10mm的电磁波,对应的频率范围为30~300GHz.根据波的传播理论,频率越高,波长越短 ...

  8. 基于双目视觉的目标检测与追踪方案详解

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者 | Aimme 出品 |  焉知智能汽车 一直想通过计算机视觉的角度好好地把其在自动驾驶视觉检测 ...

  9. 英伟达最新雷达工作:NVRadar:一种实时的雷达障碍检测和占位栅格预测方法

    NVRadar:一种实时的雷达障碍检测和占位栅格预测方法 文章目录 NVRadar:一种实时的雷达障碍检测和占位栅格预测方法 一.摘要 二.相关工作与主要贡献 三.模型结构 3.1 整体架构 3.2 ...

最新文章

  1. 拥有AI「变声术」,秒杀了多年苦练的模仿艺能
  2. RecyclerView导包
  3. svn提示out of date的解决方法
  4. 11月22日弹性计算跟您在广州不见不散
  5. TypeScript的类型断言,有点像ABAP的强制类型转换
  6. 在Ubuntu桌面上显示我的电脑等图标
  7. np.random.choice用法
  8. 虚数填补了数学的哪一个缺口?
  9. 挣值管理:PV,AC和EV
  10. java8 64x下载_jdk8 u102 64位下载
  11. 苹果进行iPhone问世后最重大转型:硬件时代转互联网服务
  12. One-Error多标签分类_深度学习:如何在多标签分类问题中考虑标签间的相关性?
  13. 大数据如何应用在企业人力资源管理
  14. vmare 如何与主机共享相应的文件
  15. Bean的装配方式之xml装配--(超详细,适合小白入门)
  16. elastic-Job配置参数详细解释
  17. 一键生成所有尺寸App Icon
  18. 手机文字转语音简单方法分享
  19. 初装vs2010旗舰版 遇到的错误
  20. 中国齿科粘接剂行业发展趋势及前景动态预测报告2022-2027年

热门文章

  1. microbit c语言编程软件,Micro:bit系列教程25:自定义Micro:bit软件包
  2. 项目经理应该如何提高团队执行力
  3. 黑夜给了我黑色的眼睛,我却用它研究CV【36kr报道】
  4. ajaxfileupload上传 拒绝访问
  5. win10系统开机停在请稍候解决教程【系统天地】
  6. 绿盟赛—ModelArts实现智能花卉识别
  7. JS的除法应用 求余,取整,进一法,四舍五入
  8. 【Axure高保真原型】日期时间选择器
  9. [附源码]JAVA毕业设计家庭记账系统(系统+LW)
  10. 迈向更灵活,贝壳 OLAP 平台架构演进历程