文献下载链接:https://download.csdn.net/download/m0_37957160/12543541

摘要:

本文提出了一种非常简单有效的算法,从大规模无序点云中进行3维线段的分割检测算法。与传统的方法先提取3D边缘点,然后再拟合三维线段的算法不同,我们提出了一种基于点云分割和2维线段检测为基础的能够快速实现3D线段检测的算法。在输入无序点云的情况下,对三维线段进行三步检测。首先,通过区域生长和区域合并将点云分割成3D平面。其次,对于每一个三维平面,将其自身所属的所有点投影到自身平面上形成二维图像,然后进行二维轮廓提取和最小二乘拟合得到二维线段。然后将这些二维线段重新投影到三维平面上,以获得相应的三维线段。最后,提出了一种剔除异常点和合并相邻三维线段的后处理方法,在多个公共数据集上的实验证明了该方法的有效性和鲁棒性。更多的结果和C++源代码的公开在https://github.com/xiaohulugo/3DLineDetection。

I. INTRODUCTION 

线段可以很好地代表场景,尤其是在城市中,那里有许多规则形状的人造结构。在过去的十年中,对2D图像的线段检测进行了深入研究,并提出了几种有效的算法[1] – [3],包括广泛使用的LSD [1]。但是,解决3D线段检测的工作仍然不足,一般可分为三类:基于点,基于平面和基于图像。

基于点的方法通常先检测最小边界点,然后通过最小二乘拟合法确定3D线段的边界点。给定输入点云,我们可以通过凸包方法[4],[5]获得边界点,或通过设计特征将整个点云分类为边界/非边界类别。原始的凸包算法可以有效地找到凸的边界点,但不适合提取凹轮廓。[6]改进了凸包,允许在提取的形状中有一些凹陷。但是,基于凸包的方法仍然“由于点云中的点分布不均匀而未被发现特别有用” [5]。另一方面,边界/非边界点云的分类具有多种特征,包括曲率或表面变化[7],高斯图[8],多尺度正态差异[9],基于特征值和特征向量[10]。在[9]的工作中,每个点的法线以不同的比例来计算,然后将法线差较大的法线归类为边界点。在最近的工作[10]中,使用二值分类器使用从该点的邻域中提取的一组特征来预测每个点的轮廓分数。给定提取的边界点,我们可以构建八叉树,然后通过区域增长和最小二乘拟合来拟合3D线段。这些基于点的方法的最大问题在于特征点本身,该特征点对噪声鲁棒性不强。

基于平面的方法也是合理的选择,因为3D线段也可以视为两个3D平面的交点。然而,基于平面的方法更常用于机载LiDAR [11]的建筑建模中,其中点通常不是很密集。例如,在[11]的工作中,首先将平面点与非平面点区分开,然后根据其法线将其聚集成单个屋顶段,最后检测相邻的段并将其与顶点和边界线段相交。在另一项工作中[12],将通过平面相交从点云中提取的3D线段与它们的2D对应线段组合起来,用来校准距离和图像传感器的外部参数。基于平面的方法的一个常见缺点是,通常很难确定相交线的端点,此外,这种方法不适用于小平面。

基于图像的方法首先将输入点云转换为图像,然后应用线段检测器提取图像上的2D线段,最后将这些2D线段重新投影到点云上来获得最终3D线段。将点云转换为图像是点云处理中经常使用的一种策略,例如,在最近的工作[13]中,将点云分割为多个横截面,然后将每个横截面中的点云投影到 特定平面,然后从不同的2D图像中提取特征点。在最近的工作[14]中,输入点云被转换为具有不同视点的投影图像的集合,这些具有不同视点的图像均匀地放置在围绕点云的球体上。然后,应用LSD算法[1]在这些投影图像的每一个上提取2D线段,再将其反投影到原始点云中以获得初始3D线段。这些基于图像的方法的关键问题在于图像生成策略,难以确定这些投影图像的数量,分辨率和视点。

本文提出的方法属于基于图像的类别。为了克服传统基于图像的方法的不足,我们提出了一种简单而有效的3D线段检测方法,该方法包含以下三个步骤:

(1)点云分割:通过区域生成的和区域合并的方法,将输入的点云分割成三维平面。

(2)基于平面的三维直线的检测:对于每个点云平面,所有属于该平面的点云投影到平面上形成二维图像,然后基于二维图像进行轮廓提取和最小二乘拟合,得到每个平面的二维线段。最后将这些二维线段重影映射到三维平面上,就可以获得三维线段点云数据。

(3)通过场景的三维结构信息,去除三维平面和三维线段的异常点云,最后合并所有三维线段点云数据。

II. ALGORITHM

A. Point Cloud Segmentation

分割是自动处理点云的最重要的预处理步骤之一,在过去的几十年中已经进行了深入研究。通常,所提出的点云分割方法可以分为三大类:基于边缘/边界,基于区域增长和混合(请参阅[15]以进行阅读)。为了从点云中获得平面分割,像[16]这样的传统方法仅在点云水平上执行区域增长会对参数过于敏感。(新的方法)一种鲁棒性很好的方法是先提取小的紧凑区域,然后合并这些区域以获得最终结果。基于此,我们的方法分三个步骤将输入点云分割成多个平面:法线计算,区域增长和区域合并。

法线计算:给定一些无序点云集,使用KNN(K Nearest Neighbour)算法去查找每一个点的近邻并使用PCA算法估计近邻表面的法线[17],首先通过使用nanoflann库建立k-d tree,然后对于每一个点我们使用下列公式计算他的协方差矩阵:

上式中Σ表示3x3的协方差矩阵,是临近的数据点,表示KNNs的平均向量(每一个P都是三维XYZ)。通过奇异值分解(SVD)求解以下标准特征值方程,最终可以得到该点的法线,该法线是在特征向量V矩阵中的第三个特征向量(此处应该是进行排序后的特征值所对应的特征向量)。

上式中V是特征向量矩阵,λ是特征值矩阵。需要注意的是矩阵λ中的表示点的曲率值,的值越小,对应该点的的曲率值就越小。此外,因为数据点的KNNs已经获得,我们能很简单估计在邻域范围内点的分布尺度,简单的来说,我们定义的尺度为和它的第三个近邻点之间的距离。(第三个近邻点)我们分别用表示法线、曲率、尺度和和点的KNNS点集。

区域生长:给定每一个点点Pi的{npi,λpi,spi,Ipi},区域增长过程旨在提取输入点云中的所有平面,其执行过程如下:(1)将所有点按照曲率进行升序排列。(2)从曲率最小的排在前边的未处理的点Ps开始,我们创建一个列表T来存储所有和Ps共面的点,其中Ps是第一个。在T中对于每一个未处理的点Pi,在他的邻域Ipi中我们遍历每一个未处理的点Pj,如果满足以下条件,将Pj添加到列表T中:


在上述式子中,θ=15°是一个常量角度阈值,tho=Sps是正交距离阈值,thp=50Sps是平行距离阈值。tho和thp都根据Ps的大小进行自适应。第一个和第二个条件确保Pj与Ps共面,而第三个条件确保区域紧紧围绕Ps(即该区域紧密的位于Ps周围。)一旦Ipi内所有的点都被遍历,我们将Pi标记为已处理。该区域逐点增长,直到处理了列表T中的所有点,其结果是一个平面区域,其所有点都存储在列表T中。(3)重复执行第二步,直到处理完所有点。 所获得的所有平面区域的集合表示为R。

        区域合并:提出的区域合并策略包含以下三步。(1)首先,对于每一个区域Ri如法线计算中所介绍的,我们以相同的方式使用其所有点为其拟合一个平面,法线,曲率,Ri的分布规模分别表示为npi,λpi,spi。另外,对于点云中的每个点,我们为其分配一个标签,这是它所属区域的一个索引。(2)之后,我们遍历每一个区域,来获得他的邻域区域。在一个区域Ri中的每一个点Pm,我们遍历该点的邻域IPm中的所有点。如果在Ipm中有一个点PN他的标签不同于Pm所属的标签(意思就是自己的邻域点标签跟自己的标签不同)(这里的标签怎么设置的),我们就认为Pn是一个边界点,把Pn所在的那个平面作为一个邻接区域Ri。按照这样的方式,对于R中的每一个区域,我们都获得他的临界区域。(3)最后,最后,类似于上面介绍的区域生长过程,我们尝试以相同的方式聚合共面区域,这与以前的区域生长过程在以下两个方面有所不同:(1)使用相邻区域而不是每个点的邻域;(2)第三个条件不再使用。 之后,我们以第一步中所介绍的,使用相同的方式为每个合并区域拟合一个平面。

点云分割程序的结果是个平面集合,其中平面的法线nΠ和每个平面中的所属点都可以获得。

B.基于平面的3D线段检测

给定提取的3D平面,我们执行以下三步来提取3D线段(如图2所示)。(1)3D到2D的投影:对于每一个平面,将属于他的点正射的投影到它自身的平面上,然后通过网格化过程将其平面所属点通过平面自身确定的自适应参数转换为二进制图像。(2)2D线段检测:首先从二值图像中提取轮廓,然后通过最小二乘法拟合线段。(3)2D-3D重新投影:将检测到的2D线段重新投影到3D平面上以获得对应的3D线段。(下面就是括号123的具体展开解释)

1)3D到2D的投影:对于在上述获得的3D平面Π,我们的目标旨在将其从3D转换为2D,以形成二进制图像,从中可以有效地检测2D线段。 3D-2D投影按以下方式进行,图3中也对此进行了说明。

首先,计算属于该平面的所有点的平均值作为平面Π的中心点Pc,然后在TΠ(属于平面Π的所有点)中我们投影第一个点(第一个点表示为P0)到平面上,并将相应的投影点表示为P0'。之后,我们将向量PcP0'设定为x轴,从Pc到P0'标记为正方向,x轴的正方向表示为Vx,这样y轴我们就可以计算出来,vy=vx x nΠ。具有了中心点,Pc,x轴和y轴的正方向,按照如下某一个点Pi在二维平面中的坐标就很容易计算出来:

对于TΠ中的每一个点,我们都可以通过公式4计算他的2D平面坐标,我们也能够获得这个平面的尺度SΠ,我们还可以得到平面的比例尺sΠ,根据经验将其定义为0.75 {Sp} 0.9,其中{Sp}是在TΠ中点升序排列的规模集合,{Sp} 0.9表示在这个集合中第90%的值。给定二维平面点{(xi,yi)}和平面规模,然后,我们可以通过网格化将这些点转换为二进制图像,方法如下。

对于一个平面,首先,可以获得所有2D平面点的x和y坐标的最小值和最大值,将其分别表示为xmin,xmax,ymin,ymax。然后我们可以用公式宽[(xmax-xmin)/SΠ]+1,公式高[(ymax-ymin)/SΠ]+1创建一个二值影像。可以通过以下计算每一个2D平面点(xi,yi)的像素坐标(ui,vi):

对于从2D平面点转换得到的像素,我们将灰度值设置为255,其余像素的灰度值设置为0。通过这种方式,我们实现了3D平面到2D二值影像转换的目标。在实际应用中,原始二值图像上可能会存在一些小孔,这是由于某些点之间的距离可能大于sΠ。增大sΠ的值可以在很大程度上消除这些孔,但是,这将降低二进制图像的分辨率。经过大量实验,我们发现一种更合理的方法是在原始二值图像上应用膨胀,然后使用默认的3×3内核进行腐蚀。 图2(a)显示了膨胀和腐蚀后的结果,它不仅保持了原始图像的分辨率,而且弥补了大多数孔洞。

2)2D线检测:像图2(a)一样给定二值影像,然后,我们可以使用线段检测器(例如LSD [1]和CannyLines [3])轻松地从中提取2D线段。 两者都可以产生良好的线段检测结果,但是,在实践中,我们发现外形轮廓检测后再进行最小二乘线段拟合程序是最灵活有效的方法。首先,对于线段拟合的误差可以调整。 此外,可以保留平面上线段之间的拓扑信息,这对于接下来的后期处理以消除线段离群值非常有用。 因此,我们通过以下步骤检测2D线段:

首先,通过调用OpenCV中的finndContours函数可以找到外形轮廓。然后,由于一些外形信息不可能含有有用的线段,因此将轮廓小于40像素的那些外形轮廓删除。之后,按照[3]中介绍的相同方式将每个有用的轮廓划分为直线段,然后通过最小二乘拟合方法进行拟合线段。图2(b)示出了图2(a)的线段检测结果,其中不同的线段以不同的颜色标记。

3)2D-3D的重新投影:给定从二进制图像中提取的2D线段,我们就可以通过2D-3D重新投影获得相应的3D线段,这是3D-2D投影的逆过程,包含以下两个步骤:(下面是从3D到2D,再从2D到pixel)(1)就是从图像Pixel到2D平面点:从图像像素到2D平面点:对于每个末端坐标为像素(ui,vi)的线段,我们通过等式5的逆过程将它们转换为2D平面坐标(xi,yi)。(3)从2D平面点到3D点:对于每一个2D平面点(xi,yi),我们可以通过公式4的逆过程计算2D点对应的3D点坐标,用这样的方法,我们就可以获得3D平面上的所有3D线段如图3(c)所示。最后,对每个3D平面执行此过程,我们可以在输入点云中获得所有3D线段。

C.后期处理

在上述过程中,为确保没有有用的场景信息丢失,(为确保有用的场景信息都被保留),在Section Ⅱ-B2中,只有短的外形轮廓被消除。因此,获得的初始3D线段包含许多离群值(因为只是删除了一些短的线段)。为了去除这些离群点,确保检测结果是完整的。因此本节将介绍鲁棒性和有效性的后处理程序。

正如我们上述所介绍的,对于2D线段的检测,我们首先提取外形轮廓,然后从每一个外形轮廓上拟合线段,来代替直接从输入图像上进行线段检测。这种策略保留了线段的拓扑结构信息,这种策略保留了线段的拓扑信息,也就是说,我们可以从平面→轮廓→线段获得层次关系。基于这个层次关系,我们提出了后处理策略,该策略比在单个线段上处理的方法要鲁棒性强大得多。 我们的后处理包含两个步骤:离群点去除和线段合并。

离群点去除:基于观察法线内点线段通常显示出例如平行度和正交性之类的结构信息,我们提出去利用局部结构信息来去除离群点,其操作如下。(1)首先,我们剔除3D平面的离群点。对于每一个3D平面Π,该平面内所有的3D线段根据他们的长度进行降序排列,最长线段被认为是第一个集群参考线。然后,从最前面的未聚类线段开始,如果他的参考线对于Li有一个10°以内的方向偏差,每个未聚类的3D线段(表示为Li)被认为属于该聚类。如果Li与任何参考线段之间的方向偏差都大于30°,则我们将创建一个新的聚类,并以Li作为其参考线段。重复执行此过程,直到平面Π上的所有3D线段都被处理。 计算每个聚类的线段长之和,然后用于对这些聚类进行降序排列。通常,如果3D平面是常规平面,例如建筑物的外墙和窗户,则会有很强的结构信息,例如平行度和正交性,而那些离群的平面(例如树和蔬菜)通常不会显示此类结构信息。 因此,我们提出了一个标准来轻松判断一个3D平面是否为外点:

在上述公式中,其中l(c1)和l(c2)分别是最前面的簇和第二个簇的线长之和,l(all)是在平面Π上所有的3D线段长度。应该注意的是,将最前边的和第二个聚类的方向定义为平面Π的结构方向。

(2)然后,我们通过3D线段所属的外形轮廓来去除其外点。我们的策略基于以下观察结果:如果轮廓是结构化的,那么丢弃异常值的长度阈值thl应该很小,否则如果非结构化应使用较大的长度阈值。因此,对于一个平面Π,首先,我们遍历其所有的3D线段来查找出结构线段,这些线段定义为方向相对于Π的任何一种结构方向都在误差(使用10°)范围内。然后,将轮廓外形的结构线比率t定义为结构线的长度除以轮廓外形上所有线的长度。给定结构线比t和平面的尺度(SΠ),我们的策略如下:

线段合并:建议使用线合并程序来合并彼此距离过近的3D线段,这样最终结果将更加清晰。线段合并步骤如下。 首先,按照asin(z)计算3D线段每个线段内点的纬度,其中z是线段的归一化方向还是法线方向的z分量。然后使用bin步长为6°为所有内点构建直方图。之后,所有的inlier根据它们的长度排序。从最前边的未经处理的3D线段Li开始,我们在Li bin中沿着左bin和右bin去遍历每个3D线段Lj去找到满足以下条件的线假设:

Ⅲ.实验结果

我还得回头再看看。

Paper2:Fast 3D Line Segment Detection From Unorganized Point Cloud相关推荐

  1. 【文献翻译】LSD: A Fast Line Segment Detector with a False Detection Control

    前言 博主译文水平不好,为了学习,所以进行论文翻译和研究,博文以译文为主.如果有翻译不对之处,还请各位指出,便于我修改. 文献信息 引用格式:Gioi R G V, Jakubowicz J, Mor ...

  2. 地面分割:Fast Segmentation of 3D Point Clouds for Ground Vehicles

    论文链接:Fast segmentation of 3D point clouds for ground vehicles | IEEE Conference Publication | IEEE X ...

  3. Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection)

    Python+OpenCV:图像快速角点检测算法(FAST Algorithm for Corner Detection) 理论 Feature Detection using FAST Select ...

  4. 三维目标检测论文阅读:PointPillars: Fast Encoders for Object Detection from Point Clouds

    PointPillars: Fast Encoders for Object Detection from Point Clouds code ID: https://github.com/nuton ...

  5. 复现 MonoEF:Monocular 3D Object Detection: An Extrinsic Parameter Free Approach

    复现 MonoEF:Monocular 3D Object Detection: An Extrinsic Parameter Free Approach 时间:2022年7月13日 代码连接: ht ...

  6. 点云 3D 目标检测 - CenterPoint:Center-based 3D Object Detection and Tracking(CVPR 2021)

    点云 3D 目标检测 - CenterPoint: Center-based 3D Object Detection and Tracking - 基于中心的3D目标检测与跟踪(CVPR 2021) ...

  7. 直线段检测算法(LSD:a Line Segment Detector)

    直线段检测算法(LSD:a Line Segment Detector) 1 简介 LSD是一种线段检测算法,该方法能在较短的时间内获得较高精度的直线段检测结果. LSD直线检测算法首先计算图像中所有 ...

  8. 消失点:Fast and Accurate Vanishing Point Detection in Complex Scenes

    消失点:Fast and Accurate Vanishing Point Detection in Complex Scenes 1.韦伯定律 1.1 WLD 1.2 WOD 算法实现 获得WOD ...

  9. ECCV2020超快车道线检测算法:Ultra Fast Structure-aware Deep Lane Detection

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:cfzd| 来源:知乎 https://zhuanlan.zhihu.com/p/1575307 ...

最新文章

  1. Python学习之For训练
  2. 菜鸟学习Spring——60s利用JoinPoint获取參数的值和方法名称
  3. UOS使用技能:修复无法引导WIN7的步骤!
  4. 罗马数字转整数(C实现)
  5. layer 弹出层 回调函数调用 弹出层页面 函数
  6. 自学前端,一天学4个小时左右,能到什么水平?
  7. Netty工作笔记0002---Netty的应用场景
  8. Spring-读取properties文件
  9. 医院计算机科学与技术笔试试题,医院信息科招收计算机科学与技术专业的笔试试题...
  10. CentOS虚拟机挂载U盘
  11. 张宇1000题高等数学 第十三章 多元函数微分学
  12. nmake下一些错误的解决办法
  13. ios沙箱软件_ios沙盒2存档-ios沙盒2最新版下载0.5.2苹果版-西西软件下载
  14. movielens 1m 的mysql_数据分析实例-MovieLens 1M 数据集
  15. 苹果移动设备(iPhone/iPad)分辨率汇总
  16. A Structure from Motion System
  17. 寻路算法1:A星寻路和navmesh寻路的技巧和优化
  18. 数字内容产业的产业链结构
  19. java打印超市消费小票_Java-超市购物小票案例-详细介绍
  20. 关于点焊,你知道多少

热门文章

  1. Python find方法与rfind方法的使用
  2. Word文档以两列的格式打开,类似于书本那样
  3. C++ 笔记(12)— 判断(if/if...else/switch、条件运算符)
  4. MailKit帮助类
  5. 160630、五句话搞定JavaScript作用域
  6. 20150411--Dede二次开发-01
  7. dedecms 财付通接口
  8. UNICODE使用的一些知识和技巧
  9. C++排序算法实现(更新中)
  10. linux启用日志记录功能,Linux下启用Open vSwitch的日志功能以便调试和排障