一、简介

一般的线匹配的方法分为两种:基于个体的和基于小组的。简单来说就是一次匹配一个还是一次匹配一组。

对于基于个体的匹配方法,主要是光度信息,这种方法主要都是基于匹配的线段之间都会存在一定的重叠部分这个假设,当然这个假设也会让一些重叠部分不足的线段匹配失败,在这种匹配方法下,一次匹配两张图中的一对线,一般会利用周围的环境信息或者利用周围的特征点组成点线对进行匹配。当然,在低纹理场景下,会因为提取到的特征点的数目不足而导致匹配效果的下降,问题主要还是出现在点提取的效果上。
而对于基于小组的匹配,是用线组成线对,是一次匹配两张图中的一组线,利用的是线组之间的相对几何关系,包括线组内部的交点、角度以及投影距离,利用变换过程中的相对几何关系的不变性,相当于扩展了线的特征内容,从而提高匹配效果。

这篇论文提出的算法同时整合了基于个体的方法和基于小组的方法,从而让匹配的效果更加出色。

二、初始LJL匹配对的生成

确定两条线在3d场景下的是否是共面的是一个比较困难的问题,但是临近的线段由于空间相似性,共面的可能性明显要高,所以在这里论文提出了一中利用邻近区域去筛选共面线的方法。

对于一条线,论文规定了一个矩形的影响区域,如下图所示:

对于一条长度为|l1|的线段l1,以其中点为中心,构建一个长为|l1|+2w,宽为2w的矩形区域,这个区域就表示直线的影响区域,对于临近的线,我们认为满足下面两个条件的线段是和l1共面的:
①临近线段至少有一个端点落在l1的影响区域内
②临近线段与l1的延长线的交点落在l1的影响区域内
根据这两个条件,上面图中的l2都符合条件,所以认为l1l2是共面的,l3不满足交点的限制,l4不满足交点和端点的限制,所以都被舍弃掉。对于匹配的每对线,都可以视为一个LJL。

现在,对于已经判断为共面的两条线段,细分之下可以分为两种情况:

左图表示交点位于两条线段中的一条上,而右图表示交点落在线段的延长线上,这两种情况中,左图的情况下其实可以将l1拆开,构成两个独立的LJL。

构建好LJL对之后,就需要用一定的描述方法去描述这个LJL,描述的方法与SIFT的描述方法类似,拿上图中交点落在延长线上的情况为例,构建下面这样一个区域:

首先,以交点o为圆心,构建两个同心圆,他们的半径分别为r和2r,根据两条线段及其延长线,我们可以将这两个同心圆拆分为八个部分:内部的四个扇形区域和外部的四个环型区域,再对环型区域做划分,每个环形部分拆分为三部分,这样做的目的是为了让拆分后每个部分的面积与内部对应的扇形区域的面积相等。
经过划分之后,我们一共得到了16个区域,接下来对于每个区域,计算落入其中的像素的梯度方向和梯度值,将梯度值根据梯度方向,拆分到八个梯度上,累积之后得到了这个区域内部八个梯度方向上的梯度值,也就是说一个区域就需要用八个数值进行描述,所以对于一个LJL来说,总共需要128个值,也就是一个128维的向量去描述。
此外,从这个描述方法来看也能看出,当交点落在两条线段中的一条上的时候,就没有办法直接去按照这种描述方法进行描述,所以论文说了要将两个部分拆开去描述。

描述好之后就可以进行初步的匹配,首先,对于两个正确匹配的LJL对,其交叉角不应该有太大的偏差,也就是说上图中∠AOB在两张图中偏差不能太大,偏差太大的就被舍弃掉。
角度的筛选之后,就进入描述子距离的筛选。由于LJL是一个基于固定大小窗口去构建的,所以没有办法处理尺度变化,因此在计算描述子距离的时候,需要去采用一定的方法弥补尺度变化。论文使用高斯金字塔的方法,建立了四层的高斯金字塔,每层包括两个子层,之后,暴力匹配这两张图中LJL的八层描述子距离:

取其中的最小值作为两个LJL对的描述子距离。不难看出,这个方法和LBD的方法是类似的,主要是因为描述子的描述方法不支持尺度变化,所以采用高斯金字塔去人为模仿尺度变化,通过跨层的距离计算,来表示恢复到同一个尺度下之后的描述子距离,从而让计算结果更加准确。

对于计算好的描述子距离,一般认为小于一定阈值的LJL对是候选匹配的。

三、LJL的扩展匹配

经过上一步,我们得到了LJL的候选匹配对,这其中存在一些误匹配,也存在一些匹配的但是没有加入进去的,需要进一步进行处理。

首先,我们使用RANSAC去提出候选匹配对中的误匹配。
之后,论文提出了一种拓扑分布的限制去进一步筛选,对于一对LJL,其线段的交点为O和O‘,对于周围的LJL,计算交点到O和O’的距离,取其中最近的n个LJL的交点,记为M和M‘,对于正确匹配的LJL对,应该满足下面两个要求:
①M和M’的重叠部分的比例应该大于一定的阈值,也就是说,O和O’附近的LJL应该保持一定的匹配关系
②已经匹配的LJL的交点应该有较大比例落在待检测的LJL的同一个象限里

可以看出,一个LJL相当于将整个二维空间划分成了四部分,上面的两个要求是说,首先O附近的点和O’附近的点必须保证有匹配的交点,另外一个是说匹配的交点落在四个象限必须是保持一致的。

经过RANSAC之后,我们现在相当于得到了三部分的LJL,首先是已经匹配的LJL对,这部分记为ML,剩下的不匹配的LJL根据图的来源,分为UL和UL’,现在我们在扩展匹配的过程中,就是要添加可能被忽略的,同时筛去误匹配的。
首先用暴力匹配的方法,找出UL和UL’中符合条件的潜在匹配,条件有三个:
①交点到极线的距离应该小于阈值
②描述子距离要小于阈值
③满足上面介绍的拓扑分布的限制
满足这三个条件的LJL对,就会被当作候选对加入到ML中,这可能会导致ML中一些原来符合拓扑分布限制的LJL对现在不符合了,那么就需要将他们从ML中剔除。

重复这个操作,直到没有新的LJL加入ML或者迭代的次数超过了五次。经过这部分的扩展匹配,我们相当于又一次筛选了误匹配,而且将一些落下的LJL匹配对给找了回来。至此基于小组的匹配就结束了,后面转而进行基于个体的匹配。

四、基于个体的线段匹配

这部分主要是针对那些构不成LJL的线段,后面我简称为孤线,对于一条孤线,查找所在图周围的已经匹配的LJL,计算LJL的交点到孤线的距离,根据距离,筛选最近的u个LJL,将这些孤线划分到这u个LJL的范围下,按照这种划分方式,一张图中所有的匹配的LJL都可以分配到0个到多个孤线。
之后,对于每个已经匹配的LJL,我们要对落入其势力范围内的孤线再做一次划分,前面提到了根据交点和两条线段,一个LJL相当于被拆分成了四个类坐标系的区域,现在,对于在一个LJL区域内一条孤线,如果它的两个端点都落在了区域内的一个象限,那么就将这条孤线分配到这个象限里,也就是下面的表示:


上面的q表示的是第几个象限,而n和m则表示是第几个LJL,现在对于已经划分好的孤线,我们要借助临近的LJL来进行孤线的匹配,当然,只有在同一个匹配的LJL的同一个区域内才能进行匹配的检测,也就是当m=n且q=p的情况下,才会检测两条孤线是否是匹配的。

检测两条孤线是否匹配首先是要检测旋转角度,也就是比较孤线的角度变化、LJL中两条线的角度变化这三个角度的差距:

满足上面条件则认为通过了角度的限制,之后利用单应矩阵进行筛选。关于单应矩阵的计算,也就是论文的4.2节,全是数学公式,这里不再记录了,直接用给出的计算方法来计算单应矩阵。

在SLAM十四讲里面也有提到,单应矩阵是在存在大量共面的点的时候才计算的矩阵,平时情况下计算的是基础矩阵或者关键矩阵,论文论述了一下使用单应矩阵去检测合理性,首先我们在分配时利用了空间的局部相似性,从而保证了LJL的两条线和孤线这三条线有很大的概率是共面的,其次,我们划分时并不是一对一的分配,而是一条孤线分配给了三个LJL,采用这个方法也可以很大程度上保证共面的线不被误分配。
回到检测本身,对于一对孤线,如果是匹配的,根据单应矩阵处理端点,投影前后的关系应该是保持较小误差的,具体来说首先是检测投影点的位置,根据单应矩阵,将两条孤线的端点投影到另一张图上,然后看孤线的影响区域,筛掉投影后与影响区域没有交点的孤线。对于保留下来的孤线对,计算距离偏差:


由于在孤线匹配过程中,极容易出现相邻的平行线误匹配的情况,也就是下图所示的情况:

对于这种情况,论文引入了线的侧的概念,也就是计算孤线两侧的平均灰度值,由此来指定线的两端,从而在匹配的时候就可以消除临近平行线产生的影响。

经过上面的步骤,匹配的孤线里面可能会存在重复匹配,这时候就用上前面计算的距离偏差值E,选择偏差值最小的孤线对,筛除掉其余的孤线对。

Hierarchical line matching based on Line–Junction–Line structure相关推荐

  1. Command line is too long. Shorten command line for Application---微服务升级_SpringCloud Alibaba工作笔记0067

    今天打开idea项目,启动的时候,无法启动报错: 15:19    Error running 'Application': Command line is too long. Shorten com ...

  2. Command line is too long. Shorten command line for Doc.generateAsciiDocs or

    Intellij IDEA启动项目报Command line is too long. Shorten command line for XXXApplication or also for 解决方法 ...

  3. 项目启动报错 Error running ‘xxxApplication‘;Command line is too long,Shoerten command line for........

    springboot启动项目报错 启动项目的时候,一直启动不了,报启动类名字太长.如下图所示 Error running'XxxApplication': Command line i stoo lo ...

  4. IDEA启动main函数时,Command line is too long Shorten command line for XXX or also问题解决

    巧了,最近起了一个挺长的类名,启动main函数的时候,idea返回了一个Command line is too long Shorten command line的报错,请教研究之后,解决方法如下 方 ...

  5. Matlab 双击或右键打开.m文件出现 error using open (line 146) 或error using edit (line 66)

    Matlab 打开文件出错 一.问题描述: 二.解决方法: 一.问题描述: Matlab 双击或右键打开.m文件出现 error using open (line 146) 或error using ...

  6. Idea报错:Command line is too long. Shorten command line for className

    问题描述 使用Idea运行项目在项目启动时报错: Command line is too long. Shorten command line for XXXApplication or also f ...

  7. Error running Command line is too long. Shorten command line for

    Error running 'xxxxxxxxApplication': Command line is too long. Shorten command line for xxxxxxx? 使用网 ...

  8. 【idea】Command line is too long. Shorten command line for XXXApplication

    Command line is too long. Shorten command line for XXXApplication or also for Spring Boot default- 问 ...

  9. Command line is too long. Shorten command line for

    问题 今天在idea中运行一个hbase jdbc项目时无法启动,提示如下: Command line is too long. Shorten command line for SystemAppl ...

最新文章

  1. R语言读取CSV文件
  2. Equinox P2的学习
  3. const 是个类型修饰符号。
  4. 微软职位内部推荐-Software Engineer II-Office Incubation
  5. android6.0 wifi流程,[RK3288][Android6.0] WiFi之从Linkspeed看获取流程
  6. zabbix工作流程(自定义添加监控项目)
  7. 2-29 while
  8. c++ 多个线程操作socket要同步吗_基础知识深化:NIO优化原理和Tomcat线程模型
  9. mysql 当前时间戳_kettle教程-mysql数据增量抽取-无需时间戳无需标识
  10. Go语言11-日志系统客户端相关组件
  11. 微信公众号插入公式介绍
  12. 使用ADO控件连接“文件DSN”
  13. built a JNCIS LAB系列:Chapter 4 BGP
  14. MFC CFile输出文本文件乱码
  15. How long have you been studying English(第一节)
  16. android 实现微信分享
  17. 如何使用Dareboost改善网站性能(和转化)
  18. netty传输html页面,java 文件传输(netty) 实例源码
  19. 宝可梦世界无限极服务器密码,宝可梦世界无极限启动器
  20. 用jupyter notebook卸载Python第三方库

热门文章

  1. CentOS6上安装Flash Player
  2. acm的ubuntu (ubuntu16.04 安装指南,chrome安装,vim配置,git设置和github,装QQ)
  3. 解决ArcGIS安装之后出现的Windows installer configures问题
  4. 【Android】eclipse 时常报错java.lang.object cannot be resolved-解决
  5. Win32 的dll导入问题总结-------------
  6. Sql Server 2000 无法打开用户默认数据库。登录失败
  7. 如何实现插入数据时自动更新另外一个表的内容
  8. Eos的Wasm智能合约的局限性
  9. python3 + selenium 之窗口切换
  10. iOS小白之路...iOS中基础控件的使用