opencv 平面法向量_基于散乱地面激光扫描点云数据的复杂立面中平面的自动提取...-程序员宅基地

技术标签: opencv 平面法向量  

基于散乱地面激光扫描点云数据的复杂立面中平面的自动提取

【摘要】:目前,越来越多的应用如三维建模,竣工测量,存档,恢复和重建都需要人工建立三维模型,从而用最真实的效果去详尽描述物体细节特征信息。因此,在计算机视觉、摄影测量和遥感领域,三维建模是一个综合而复杂的研究问题。因为它包括:提取,检测,重建对象的部件,以及针对复杂对象海量三维数据的自动化处理。

在从复杂对象获取海量三维数据的过程中,一方面,地面激光雷达TLS(Terrestrial Laser Scanner)由于其快速,因此在三维建模数据的获取上有着巨大的潜力。另一方面,对于一般的复杂对象,由于很多因素例如分辨率、配准步骤,对象的颜色、粗糙程度以及测量误差的影响,TLS获取到的大量(高达几百万)无结构(随即分布的)三维点云的局部密度不尽相同,并且包含大量随机噪点。大多数情况下都不可能手动地去编辑处理海量的3维点云,因为这样会耗时很长,甚至当planner表面需要的时候也不能这样进行操作。因此,即使对象是一个平坦表面或者线状边缘,从点云中提取对象特征仍然不是一件容易的任务。因此这个过程是极其重要的,该研究课题对于从人造建筑物中的数字存档有着重要意义。

我们希望仅仅通过使用作为潜在数据的点云来创建人造对象的3维计算机模型,但是问题是如何处理大量的通过TLS获得的三维测量点,以此来正确提取对象的主要属性和细节,比如平面表面和边线。尽管这个问题同TLS获取的数据没有关联,但是它关系到处理那些搜集到的数据的专业程度。

在元素的提取过程中,分割是最重要的一步。在过去的十年中,很过算法被设计成通过使用分割的方法从点云中去提取平面曲面。通常情况下,我们使用如下三种不同方法中的一种来获取分割点:区域增长,属性集群和模型拟合方法(RANSAC和Hough变化算法)。尽管区域增长和属性集群方法为了对在点云数据中出现的同类地区进行分组,因而采用了几何标准,但是模型拟合方法则是基于拟合几何原始形状。在实际应用中,大部分的分割方法使用几何信息来分割三维点云。这些信息通常包括每个点的位置(X,Y和Z),局部预测到的平面法线和最佳拟合结果的残差。然而,这些信息可能会被噪点所影响,并最终影响到分割的结果,导致了坏的分割的发生(过度分割,分割不足或没有分割)。这最终会导致提取过程和创建三维模型的失败。

区域增长方法因为必须定义正确的种子表面,因而在使用上受到了很大的制约,因为如果种子表面的定义错了(特别是在现有大量噪点数据的情况下),那么错误就会增加并导致处理的失败。因此,可以考虑一种对噪点数据敏感的方法。同样,当它被用来分隔海量的无规则的点云数据时,同样会导致错误的分隔结果(或高,或低甚至出现没有分割的情况)。因此,区域增长算法有的时候不是非常的透明,另外也不能提供均匀的应用。

虽然聚类方法提供了整体和灵活的方式从数据中提取同类特征,并且不局限于仅提取某一特定类型的特征,然而从基于集群算法的海量无规则的3维点云中提取的属性数据可能并不能用在实际的应用中,尤其是当存在噪点和离群数据,因为计算海量数据的集群多维特征的成本非常高,而且处理海量数据需要从激光扫描仪那里获得点云数据[Sapkota,2008].另外,这个方法对于数据中的噪点非常敏感,而且会被周围数据的定义所影响。因此,我们需要一个更加健壮的方法方法来消除噪点和离群数据,目前对这种方法的研究还在进行中。

尽管RANSAC(random sample consensus)算法在包含噪声和异常值的情况下是有效的,但是它有一个缺点,就是是容易生成错误面,例如平行渐次的情况,例如楼梯。在这项研究中,我们通过一个实际的测试来评估RANSAC中的错误结果。楼梯提供了平行递增平面的理想例子。根据从RANSAC中获取的针对分隔平面表面的最终结果,错误的结果(斜曲面)非常明显。这些错误结果凸显出了通过RANSAC自动提取平面表面的一个障碍。另一方面,这些结果可以被视为一个明显的坏的分割案例(分隔不足或者是没有分割)。这个问题可能发生,因为即使平面表面通过迭代(MaxIterNo)得到了点的最大数目,RANSAC也同样会接受这个平面表面。而且,他仅仅使用点的位置,并且不能采用其他参数,比如考虑向量(NV)。因此,在平行平面表面,有MaxPointNo的面通常是倾斜面(错误的平面)。

最后,这篇博士论文的研究目的是要找到或是改进一种新方法,以最符合现实的方式正确的提取平面表面和解释线性属性,而这也是为了展现基于海量3维无规则点云(TLS点云)的人造对象的实际情况和条件。同样,这篇文章的研究也是为了实现从3维点云中直接自动创建3维模型。之前的主要目标可以分为如下几个方面和动机。

A.避免从RANSAC中得到的平行平面表面的错误面,比如楼梯

B.创造一个可以直接处理TLS中的三维点云的新方法

C.避免错误分割(比如,过度分割,分割不足或者是没有分割)

D.在目前已有的噪点数据中,正确地分割和提取最适合现实的最大的不同平面表面,以此来获得大量无规则3维数据的复杂对象

E.解读平面表面的线性特性(提取边界)

F.提高自动化和分割结果的可靠性

为了避免平行渐次的情况,本文提出了对RANSAC算法的改进,称为顺序法线向量RANSAC(Seq-NV-RANSAC).本算法检测点云和拟合的RANSAC平面之间的法线向量(NV)是否符合一个给定的阂值。因此,"Seq-NV-RANSA"可以自动地决定一个点是否可以加到这个表面的迭代中,并且通过这一项检查,可以保证不会从错误的面中得到MaxPointNo。得到第一个平面后,迭代上述过程直到在该阀值的条件下所有的平面都提取完全。这一过程导致:

避免了从RANSAC中获取的错误面

高效的计算,因为每一次RANSAC将会处理合适数量的点

在计算属性方面有质量的改进

提高了表面提取的自动化程度,因为结果完全是自动有序的获取的

另一方面,当从复杂正面的大量点云中遇到特殊的平面表面是,在一些分组中分割不足的问题可能会出现,比如两个或更多的平面表面有着相同的水平面和相同的向量方向。

同样,因为多种不同的原因,过度分割的问题也可能出现,比如在法线计算过程中噪声点会产生影响。

分割错误(比如欠分割或过分割)仍然是提取平面的最大障碍。因此,提出了一种方法扩展"SEQ-NV-RANSAC",通过运用拓扑信息和阀值来避免分割错误。首先,为了避免欠分割,检查由已经提出的"SEQ-NV-RANSAC"方法获取到的每一个面组来得到所有的欧氏距离小于阀值的邻接点,这个过程会被不断重复直到没有点再加入这个面组,然后对剩下的点创建新的面组来检查。然后,为了解决过分割的问题,提出了三种检查方法:法线相似性,垂直距离和使用包围盒检测的相交区域。修改后的"Seq-NV-RANSAC"方法有着如下可能的结果;

能够成功避免针对平面表面的坏的分割结果(分割不足和过度分割)

提高了最终结果的质量

使得提取的平面表面能够更好的拟合现实

尽管这些点云通过不同的数据源获得,比如ALS或图像匹配,但是算法仍旧被要求能够在此任何一种分割结果的基础上正常运行。因为通常情况下,数据源获得无规则的3维点云,而且我们所推荐的方法仅仅需要点云的坐标(X,Y,Z)和针对平面表面的初始群体

因此,可以实现从3维点云中直接自动生成3维模型,因为分割是3维建模过程中重要的一个步骤

针对平面分割结果的直线边缘提取,利用先前提取的多有平面,提出新的方法"Seq-RANSAC-Edges"来检测边界。首先,每一个被Seq-NV-RANSAC拒绝的点都回归到它真实的平面表面——除了噪点和没有作用的点。为了提取任意平面表面的边,我们首先要确定平面表面的输入数据包含所有边上所包含的点。在使用Seq-NV-RANSAC方法来分割平面表面之前,所有或者大部分用来表现每一个平面表面的边应该被舍弃掉。正如前面所介绍的,那是因为Seq-NV-RANSAC方法是基于聚集点云,使用各个点的向量来发挥作用的。通过该点周围的临近点来计算向量。因此,逻辑上来讲,边上的一个点通过现实中相交的两个不同的平面表面来获取临近点,因此该点所计算出来的向量应该能清楚表现该点向量同表面计算出来向量的差异。而且,不能将这个点加入到平面表面中(例如,大部分边上的点应该被加入到通过Seq-NV-RANSA方法获取的用来搜集被舍弃点的文件中)。第二,根据在所有平面之间创建的拓扑关系,使用边相交算法(IntEdges)来寻找属于两邻接平面之间相交的点云。那取决于3个阀值:θth:两个面的最大夹角,Lth:点和备选线之间的最大3维垂直距离,Wth:针对一条备选线的最小可接受的点数。然后,用自由边界点算法(FreeBoundaryPoints)来寻找将每一个平面封装成环的轮廓点。FreeBoundaryPoints算法可分为四个主要步骤,找到每个面上的旋转转换矩阵,产生2维不规则三角网(TIN),寻找使用2维TIN的面的自由边界点,最后,计算所有FreeBoundaryPoints的原始3维坐标。其次,为了避免在交叉时有重复边,使用顶点融合算法(MergeEdPos)融合前两个算法的结果。再次,使用Seq-RANSAC-Edges算法独立分割每一边上的点,并自动对所有平面使用拟合分割后的点提取所有边界线。为避免伪线(3D2P)阀值被添加到Seq-RANSAC-Edges,以此来检测位于两个相邻点之间的三维距离,其中这两个相邻点都位于同一条直线内。为了解释线性特征(分割边缘点和拟合边线),Seq-RANSAC-Edges方法的结果是一个估计的结果,因为:

即使一个组的点包含多个边,然而所有边缘都被成功解译为最符合实际的

避免杂散线

即使有噪点存在,仍旧能够正常发挥作用

提高表面提取的自动化程度,因为最终的结果全部都是自动和有序获得的

高效

另外一个优势是:使用者可以轻松地改变一个或多个阀值来从被舍弃的点中提取其他的线(如果需要的话)

作为两条或多条线的焦点,拐角点还不能被精确地定义。这是因为,如果在最初获取的数据中,该拐角点已经存在,那么这个拐角点就只会被一条边(第一条被提取的边)接受,因此,第二条提取的边就不能拥有该拐角点。

本文包括了所提到的全部方法,并介绍了大致的流程,通过流程图与方程对文中所提的方法进行了解释与证明。最后,给出论文所提出的方法的算法流程图,并使用实际数据对所提出的方法进行实验,实验结果证明了方法的有效性。其能够防止伪平面和伪边缘的产生,提高了面提取的质量和自动化程度。对于从海量散乱三维点云中直接获取三维模型具有较大的潜力。

最后,根据最终的研究结果和本文的研究动机,我们得出的结论是,本文提出的所有方法全部达到了这项研究的既定目标,研究的成果包括:

处理大规模的无规则3维点云的海量数据,其中,这些3维点云数据应当覆盖复杂正面对象的所有特征

剔除了由最初RANSAC算法得到的错误的数据成分(平面表面和边)

自动地从复杂人造对象中提取所有的平面表面,这其中包含从不同层次提取数据,比如楼梯,还可以从不同的向量方向提取数据,比如地面,不同深度的墙,方柱,带有不同坡度和方向的斜曲面,逐步递增的平行平面表面(楼梯),窗户等等。

成功地剔除了平面表面的坏的分割结果(分割不足和过度分割)

自动解译所有的线性特征(边)

提高了表面提取的自动化程度,因为这些结果全部都是自动及有序获得的

同样,尽管这些点云是在不同的数据源中获得的,比如ALS、图像匹配,我们仍旧需要其在任何一种分割结果中都运行正常

这篇论文包括如下八个章节:

第一章关于提取平面表面和解译线性特征的概要的介绍,这也是为了创建一个精确的和符合现实的3维模型,并且这个模型能够逼真的展现人造对象所处的环境和条件,还能够展现通过激光扫面仪器获得的点云数据及这些点云数据的主要属性。我们首先说明本论文的目的和意义,接着,说明论文组织的整体框架。

第二章对目前相关领域研究的一个回顾。这包括对三种不同分割算法所运用到的相关算法的回顾,通过一个实际测试对RANSAC算法的错误结果进行评估,其中对RANSAC算法的错误结果进行评估是本文将要解决的一个重要问题。为了分析之前的分割方法,我们将三钟不同方法进行两两对比,并且分别对相关方法的应用做了一个简要的概括。

第三章对本项研究中出现的问题做了一个简要的介绍,这其中包括:整体的研究目标,研究的出发点,所遇到的问题,以及提出的疑问。其中对本项研究提出的疑问分为许多类,并且是根据对问题不同的看法来分类的。比如数据的获取步骤,准备过程,解决主要问题的步骤和质量检测步骤。

第四章详细介绍了我们所提出的分割平面表面的有序向量RANSAC ("Seq-NV-RANSAC")方法,这一方法是基于RANSAC算法的改进版本,是为了更好的剔除无规则的3维点云中的错误面,尤其是在平行递增的平面表面中显得尤为重要,比如楼梯。首先,描述一个大概的工作流程,接着解释所有准备步骤的所采用的方法,其中,中间的工作包括寻找每一个点云的相邻组,基于聚类特征步骤的拟合和分割。最后,我们描述了主要的检测方案和实施过程,这种间所用到的流程图,数字和方程都用到了最初的RANSAC方法。

第五章介绍了研究领域目前的状况,对相关领域的介绍对于理解本论文有着极大地帮助,另外,还介绍了相关的领域成果,包括:仪器,工具和适应参数。接着对研究结果进行了分析(获取的数据),该分析涵盖了配准的步骤。我们对基于"Seq-NV-RANSAC"方法和基于原始的RANSAC算法获取的实验结果进行了比较实验,而且比较实验遵循将“Seq-NV-RANSAC'方法应用在三种不同实际数据上的原则,这样可以得到对人造对象不同案例的比较直观的结果(平行递进平面表面,平面表面的不同方向和大量点云的复杂正面)。这些比较展现了我们所推荐的"Seq-NV-RANSAC"方法在分割从大量无规则3维点云中截取的平面表面的优点和缺点。

第六章提出了修改有序法向量RANSAC方法的修改方案,作为"Seq-NV-RANSAC"方法的扩展,这样也是为了避免分割错误的情况(分割不足或者是过度分割),这一问题在从大量无规则3维点云中获取的复杂正面中尤其严重。首先,我们展示了一个一般的工作流程,然后通过流程图,数字和方程来解释分割不足和过度分割所采用的方法的问题。最后,我们比较了采用修改后的"Seq-NV-RANSAC"得到的结果和使用原先"Seq-NV-RANSAC"方法所得到的结果,这些实验数据都是通过"Seq-NV-RANSAC"方法获得,并且都有分割不足或是过度分割的问题。

第七章我们详细介绍了解译各条边的具体步骤,对所有已经提取的表面,通过使用有序RANSAC方法来提取"Seq-RANSAC-Edges"边,这是我们提出的一个新的处理方法。首先,显示一般工作流程,然后,通过展现流程图和方程来解释"Seq-RANSAC-Edges"所采用的新方法。最后,通过修正的"Seq-RANSAC-Edges"方法获取实际数据,并将"Seq-RANSAC-Edges"方法应用在这些实际的数据中,并且通过数字和评估结果来展现最后的研究成果。

第八章展示这项研究工作的主要成果并对下一步的研究提供建设性的建议。

最后因为最终的研究结果比之前预想的要好,所以我们可以肯定,这项研究还有非常大的发展空间,另外,因为实现了直接从3维点云中自动地创建3维模型,所以这项研究的主要目标成功的实现了。

未来的工作主要集中在如下几个方面:

阈值参数的自适应测定,

调整优化边线提取的最终结果,

提高平面表面提取和边线提取步骤的自动化程度,

通过深入挖掘本研究所取得的成果来建立CAD模型,

继续深入研究本论文所涉及的相关研究方法,不断提高算法效率,

将目前研究所得到的方法应用于其他数据源所获取的点云数据中。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39620662/article/details/111764876

智能推荐

class和struct的区别-程序员宅基地

文章浏览阅读101次。4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始。2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量。1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。2.class允许继承、被继承,struct不允许,只能继承接⼝。3.Struct有性能优势,Class有⾯向对象的扩展优势。3.class可以初始化变量,struct不可以。1.class是引⽤类型,struct是值类型。

android使用json后闪退,应用闪退问题:从json信息的解析开始就会闪退-程序员宅基地

文章浏览阅读586次。想实现的功能是点击顶部按钮之后按关键字进行搜索,已经可以从服务器收到反馈的json信息,但从json信息的解析开始就会闪退,加载listview也不知道行不行public abstract class loadlistview{public ListView plv;public String js;public int listlength;public int listvisit;public..._rton转json为什么会闪退

如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet-程序员宅基地

文章浏览阅读219次。如何使用wordnet词典,得到英文句子的同义句_get_synonyms wordnet

系统项目报表导出功能开发_积木报表 多线程-程序员宅基地

文章浏览阅读521次。系统项目报表导出 导出任务队列表 + 定时扫描 + 多线程_积木报表 多线程

ajax 如何从服务器上获取数据?_ajax 获取http数据-程序员宅基地

文章浏览阅读1.1k次,点赞9次,收藏9次。使用AJAX技术的好处之一是它能够提供更好的用户体验,因为它允许在不重新加载整个页面的情况下更新网页的某一部分。另外,AJAX还使得开发人员能够创建更复杂、更动态的Web应用程序,因为它们可以在后台与服务器进行通信,而不需要打断用户的浏览体验。在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种常用的技术,用于在不重新加载整个页面的情况下,从服务器获取数据并更新网页的某一部分。使用AJAX,你可以创建异步请求,从而提供更快的响应和更好的用户体验。_ajax 获取http数据

Linux图形终端与字符终端-程序员宅基地

文章浏览阅读2.8k次。登录退出、修改密码、关机重启_字符终端

随便推点

Python与Arduino绘制超声波雷达扫描_超声波扫描建模 python库-程序员宅基地

文章浏览阅读3.8k次,点赞3次,收藏51次。前段时间看到一位发烧友制作的超声波雷达扫描神器,用到了Arduino和Processing,可惜啊,我不会Processing更看不懂人家的程序,咋办呢?嘿嘿,所以我就换了个思路解决,因为我会一点Python啊,那就动手吧!在做这个案例之前先要搞明白一个问题:怎么将Arduino通过超声波检测到的距离反馈到Python端?这个嘛,我首先想到了串行通信接口。没错!就是串口。只要Arduino将数据发送给COM口,然后Python能从COM口读取到这个数据就可以啦!我先写了一个测试程序试了一下,OK!搞定_超声波扫描建模 python库

凯撒加密方法介绍及实例说明-程序员宅基地

文章浏览阅读4.2k次。端—端加密指信息由发送端自动加密,并且由TCP/IP进行数据包封装,然后作为不可阅读和不可识别的数据穿过互联网,当这些信息到达目的地,将被自动重组、解密,而成为可读的数据。不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相同的加密密文并被系统重新识别后,才能真正解密。2.使用时,加密者查找明文字母表中需要加密的消息中的每一个字母所在位置,并且写下密文字母表中对应的字母。_凯撒加密

工控协议--cip--协议解析基本记录_cip协议embedded_service_error-程序员宅基地

文章浏览阅读5.7k次。CIP报文解析常用到的几个字段:普通类型服务类型:[0x00], CIP对象:[0x02 Message Router], ioi segments:[XX]PCCC(带cmd和func)服务类型:[0x00], CIP对象:[0x02 Message Router], cmd:[0x101], fnc:[0x101]..._cip协议embedded_service_error

如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控件中的MFC类_vs添加mfc库-程序员宅基地

文章浏览阅读2.4k次,点赞9次,收藏13次。有时候我们在MFC项目开发过程中,需要用到一些微软已经提供的功能,如VC++使用EXCEL功能,这时候我们就能直接通过VS2019到如EXCEL.EXE方式,生成对应的OLE头文件,然后直接使用功能,那么,我们上篇文章中介绍了vs2017及以前的版本如何来添加。但由于微软某些方面考虑,这种方式已被放弃。从上图中可以看出,这一功能,在从vs2017版本15.9开始,后续版本已经删除了此功能。那么我们如果仍需要此功能,我们如何在新版本中添加呢。_vs添加mfc库

frame_size (1536) was not respected for a non-last frame_frame_size (1024) was not respected for a non-last-程序员宅基地

文章浏览阅读785次。用ac3编码,执行编码函数时报错入如下:[ac3 @ 0x7fed7800f200] frame_size (1536) was not respected for anon-last frame (avcodec_encode_audio2)用ac3编码时每次送入编码器的音频采样数应该是1536个采样,不然就会报上述错误。这个数字并非刻意固定,而是跟ac3内部的编码算法原理相关。全网找不到,国内音视频之路还有很长的路,音视频人一起加油吧~......_frame_size (1024) was not respected for a non-last frame

Android移动应用开发入门_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量-程序员宅基地

文章浏览阅读230次,点赞2次,收藏2次。创建Android应用程序一个项目里面可以有很多模块,而每一个模块就对应了一个应用程序。项目结构介绍_在安卓移动应用开发中要在活动类文件中声迷你一个复选框变量

推荐文章

热门文章

相关标签