精华内容
下载资源
问答
  • 立体匹配理论与实战

    2020-08-02 21:55:22
    主讲嘉宾: ...1.立体匹配理论概述 2.立体匹配实战入门 直播课件: 在「3D视觉工坊」公众号后台,回复「立体匹配」,获得本场直播PPT。 【3D视觉工坊】第八期公开课:立体视觉之立体匹配理论与实战

    主讲嘉宾:

    武汉大学摄影测量学博士,现为某科技公司算法主管与技术合伙人,主要研究基于影像的立体匹配和三维重建,包括立体匹配、点云融合、网格构建、网格处理等,「3D视觉从入门到精通」星球嘉宾

    课程大纲:

    1.立体匹配理论概述

    2.立体匹配实战入门

    直播课件:

    在「3D视觉工坊」公众号后台,回复「立体匹配」,获得本场直播PPT。

    【3D视觉工坊】第八期公开课:立体视觉之立体匹配理论与实战

    展开全文
  • 路网匹配理论简介

    千次阅读 2019-09-18 22:55:35
    路网匹配理论简介 知识需要沉淀也需要分享,今天写博客简单介绍一下路网匹配方面的一些基础理论和算法模型.说起来研究这一块,主要是因为前段时间一直在做自动识别相关的工作,这方面可能涉及到很多匹配和比对的算法,...

    路网匹配理论简介

    知识需要沉淀也需要分享,今天写博客简单介绍一下路网匹配方面的一些基础理论和算法模型.说起来研究这一块,主要是因为前段时间一直在做自动识别相关的工作,这方面可能涉及到很多匹配和比对的算法,之前虽然写过一些相似性评价的一些代码,主要是基于主观理解和表面化的分析,不成熟不系统. 地图匹配应该是地图数据处理方面非常基础且重要的理论,特别是道路数据相关的业务一定就避不开路网匹配的应用.今天给大家简单介绍一下这方面一 些应用.理论性的东西比较多,如果想深入了解的话,可以私下@我.

    1.路网匹配定义及常见应用场景

    1.1定义

    路网匹配实际上是地图匹配理论的一个子集,通俗讲就是两幅地图A和地图B,在没有唯一ID关联的情况下,怎么确定地图A上的一条路是B上的一条路的过程. 如果是做交通轨迹或者地图数据融合方面的研究,比如交通做大数据热力,或者轨迹挖掘,或者影像识别,或者采集资料什么方面的数据融合,那么地图匹配你一定会遇到,因为要进行后续研究,必须要做的工作之一就是地图匹配.

       

    172725_ka9j_2407751.png

    地图匹配 Map Matching:不同条件下获取的同一物景的地图之间的配准关系

    路网匹配是刨除了点和面状匹配之外的线状要素匹配理论,点和面匹配的画可能做POI研究会更关心.道路的话就是路网,实际上也是研究最多应用最广的一部分, 利用路网数据,采用适当算法,将目标定位映射到实际道路上的方法

    ü  地图匹配理论的首要子集

    ü  针对矢量拓扑道路数据的匹配模式

    ü  异源道路数据融合的关键

    ü  导航定位精度改善的重要手段

    1.2应用

    172819_3ogg_2407751.png

    最常见的应用场景

    路网匹配最直观和最普及应用的地方,就是我们的地图导航.我们知道手机自带GPS的定位精度大概在10米上下,而单车道的宽度一般是2-3米范围,实际上手机定位不足以精确判断车辆行驶的实际位置,但是导航的时候大家会发现一般情况下定位还是非常准确的,导航过程中地图就知道你在某某道路上而不再附近的小区或者什么沟什么河里面,实际上客户端是有算法在计算GPS位置和导航路线或者路网之间的匹配关系,导航一直在纠偏,这个也是提高地图定位精度的重要手段之一.大家也会经常发现同一个手机上一些第三方客户端的api调用定位效果比高德地图查了很远,刨除硬件因素实际上这里面有一个算法水平的差异.

     

    2.空间距离和评价曲线相似性的一般方法.

    2.1离散点集匹配


    路网匹配实际中有两方面的应用,第一方面是离散点集匹配路网,这个其实很简单,离散点没有形状和拓扑关系,用欧氏距离作一个简单的吸附就行了.比如离散热力图

    172841_KseX_2407751.png

    欧式距离是唯一评价要素

    2.2曲线拟合

    但实际中更有应用价值的是曲线拟合匹配关系, 比如轨迹和路网,GPS序列和导航路的相似性.

    172853_fyAE_2407751.png

    曲线信息更多,这方面比离散点集有更多的评价要素,也有更高的复杂度.评价曲线相似性的一般要素有长度,形状/曲率,拓扑关系,方向比如正向逆向,距离,属性例如交通规则不能左转不能右转,禁行等信息.

    2.3算法分类

    172901_tfwA_2407751.png

    曲线匹配方法分类

    基于几何信息的匹配算法考虑,形状,角度等常规要素,属于早期的一些算法, 实现最简单,准确度最低.基于拓扑信息的算法加入的拓扑关系的考虑,准确度比几何方法大大提升,应用最广.基于概率预测的算法,实现比较困难,实际上应用不多.目前有一些比较高级的算法理论,包括隐马模型等等,在实际应用中准确度是相对最高的.

    实时算法主要用于在线导航,时间和空间复杂度低,离线算法用于数据处理离线计算,算法复杂,追求最高准确度.

    2.4空间距离

    线要素的匹配,主要通过几何、拓扑或语义相似度来进行识别,其中通过空间距离来进行要素匹配是常用的方式

    ü 闵可夫斯基距离(Minkowski Distance)

    ü 欧氏距离(Euclidean Distance)

    ü 曼哈顿距离(Manhattan Distance)

    ü 切比雪夫距离(Chebyshev Distance)

    ü 汉明距离(Hamming distance)

    ü 杰卡德相似系数(Jaccard similarity coefficient)

    ü 豪斯多夫距离(Hausdorff Distance)

    ü 弗雷歇距离(Fréchet距离)

    172911_4Fwy_2407751.png

    曼哈顿距离,又称出租车距离

    172918_5iZ1_2407751.png

    豪斯多夫距离: maximum distance of a set to the nearest point in the other set

    豪斯多夫主要用于点集之间的相似性检测,在图像检测或者人脸识别方面是很基础的理论.

     

    3.最常使用的评价方式-弗雷歇距离.

    3.1什么是弗雷歇距离?

    Fréchet distance(弗雷歇距离)是法国数学家Maurice René Fréchet在1906年提出的一种路径空间相似形描述定义

    172928_HDVO_2407751.png

    Maurice René Fréchet

    弗雷歇距离就是以他的名字命名,鼻祖级的人物,伟大的法国数学家.所以题外话,搞这种基础理论研究方面的东西数学一定得学好.

    172934_G0gr_2407751.png

    狗绳距离

    弗雷歇距离通俗的讲就是狗绳距离, 人和狗之间有一条狗绳约束.主人走路径A,狗走路径B,各自走完这两条路径过程中所需要的最短狗绳长度就是弗雷歇距离.

    172942_V3mz_2407751.png

    最大距离最小化

    设定 t是时间点,该时刻,曲线A上的采样点为A(t), 曲线B上采样点为B(t). 如果使用欧氏距离,则容易定义d (A(t),B(t)) . 在每次采样中t离散的遍历区间[0,1], 得到该种采样下的最大距离. 弗雷歇距离就是使该最大距离最小化的采样方式下的值.

    3.2K-WALK和弗雷歇排列

    给定一个有n点的路链P =〈p1 , p2 , … , pn 〉, 一个沿着P 的k 步分割成为k 个不相交的非空子集 {Pi }i=1 , …, k ,使得Pi =〈pni -1 +1 , …, pni 〉和 0=n0 <n1<… <nk =n,称该非空子集为P的 K-Walk

    给定两个路链A =〈a1 , …, am 〉, B =〈b1 , …, bn 〉,一个沿着A和B的组合步(Paired Work)是A的k-walk {Ai}i =1 …k 和一个沿着B的k-walk {B i}i =1 …k 组成, 使得对于1 ≤i ≤k , 要么|Ai|=1, 要么|Bi|=1.

    链A 和B 间的离散Fréchet 距离(discrete Fréchet distance)就是一个沿着链A 和B 的组合步W ={(Ai ,Bi)}的最小花费,这个组合步称为链A 和B 的Fréchet 排列(Fréchet alignment). 计算弗雷歇距离的过程实际上就是不断的遍历计算,尝试找出最佳组合步的过程.

    3.2利用平均弗雷歇距离评价曲线相似性

    采用平均Fréchet距离代替离散Fréchet距离,是因为前者是从顶点距离集合中选取的一个距离,易受到局部变形较大点的影响.

    基于离散Fréchet距离识别曲线上点与点之间最短路径的方法,平均Fréchet距离通过计算离散要素点集之间的最短距离的平均值,来度量线要素间的相似性.

    172953_Eo75_2407751.png

    3.4全局算法

    两条曲线之间的匹配研究的是1:1的关系,实际应用中GPS轨迹比较长的时候面临全局择优的问题.进行全局路线匹配时, 需要考虑1:N的情况来确定整体路径,代表性的算法使用弗雷歇距离来衡量待匹配序列和候选路段序列的匹配度,并作为路段的权重, 由此构建网络图, 通过计算最短路径得到最佳匹配结果.

    173000_t16E_2407751.png

    Dijkstra求解全局最短路径,Frechet Distance计算局部相似度

     

    4.最准确的算法-隐式马尔科夫模型.

    4.1定义

    除了弗雷歇距离外,介绍一种更高级的算法,也是目前应用中准确度最高的一种算法—隐式马尔科夫模型.

    20 世纪60 年代,Leonard E. Baum 和其它作者在一系列的统计学论文中描述了隐马尔可夫模型。它最初的应用之一是语音识别,80 年代成为信号处理的研究重点,现已成功地用于故障诊断、行为识别、文字识别、自然语言处理以及生物信息等领域。如果做语音识别,信号处理或者自然语言处理方面的东西,对这个模型会非常熟悉.

    4.2核心特征

    隐式马尔科夫模型五要素: 2 个状态集合和3 个概率矩阵

    a)          隐含状态S:马尔可夫模型中实际所隐含的状态,通常无法通过直接观测得到。这些状态之间满足马尔可夫性质

    b)         可观测状态O:可以通过直接观测而得到的状态,在隐马尔科夫模型中与隐含状态相关联。

    c)          状态转移概率矩阵A:描述隐马尔可夫模型中各个状态之间的转移概率

    d)         观测状态概率矩阵B:表示在t 时刻隐含状态是Sj 条件下,其可观测状态为Ok 的概率。

    e)          初始状态概率矩阵π:表示隐含状态在初始时刻t=1 的概率矩阵

    4.3解决三类问题

    173011_sKHE_2407751.png

    路网匹配问题实际是一个解码问题,基于HMM 的路网匹配算法实际上是在一系列观察的前提下,寻找最有可能产生这个观察序列的隐含状态序列.一系列GPS位置点集合是可观测状态,寻找最有可能产生位置点集合的路网隐藏序列.

    4.4基于隐马尔科夫模型的路网匹配过程

    173018_gyXr_2407751.png

    173036_1guq_2407751.png

    173044_J1I6_2407751.png

    说实话,没看懂,看懂的可以交流一下

    4.5衍生算法集合

    173104_YRvP_2407751.png

    重点关注一下STM算法,稳定健壮,实现简单,实用性强. 有非常成熟的研究和开源实现,不建议重复造轮子.但是做一些这方面的理论研究还是很可以的.万一不做地图,也把思想可以用到其他方面工作中.

    4.6ACM SIGSPATIAL Cup

    介绍一下算法的威力, 2012 年ACM SIGSPATIAL Cup是由ACM主办的全球范围内的关于地图匹配算法的科技竞赛,这次科技竞赛吸引了来自全球31 支专业级的参赛队伍。所有算法当中匹配准确率最高的两个都是基于HMM 的匹配算法

    173111_1Woc_2407751.png

     

    5.更多应用场景

    比如不同来源数据的融合,轨迹数据的挖掘,交通数据的躲避拥堵分析,城市规划中的指导意义….

    173126_hg5j_2407751.png

    173137_1GWY_2407751.png

    173144_Nil3_2407751.png

    173151_9TS9_2407751.png

    6.结语

    最新的一些路网匹配研究方向包括机器学习和人工神经网络等,地图匹配是地图研发领域很基础的算法,有比较广泛的应用,在实际研发中早晚会遇到地图匹配的问题.而路网匹配又是重中之重.研发过程中不要闭门造车,要不断开阔视野,这里是为抛砖引玉的一些理论探讨工作.

    转载于:https://my.oschina.net/Bai1991/blog/1580000

    展开全文
  • 一、opencv灰度匹配cv::MatchTemplate 1)cv::MatchTemplate是灰度匹配,该函数的优点是精度高,因为是一个个像素点的比较;缺点是计算时间长,因为要计算的点比较多,一个个比较花费时间长。如果从图像金字塔的...

           

    一、opencv灰度匹配cv::MatchTemplate

           1)cv::MatchTemplate是灰度匹配,该函数的优点是精度高,因为是一个个像素点的比较;缺点是计算时间长,因为要计算的点比较多,一个个比较花费时间长。如果从图像金字塔的角度,把模板和图像都降低分辨率来匹配,这样时间上可以提高一个数量级。但问题又来了,分辨率要降低到多少是合适的,如果看一个东西,缩小到什么时候辨认不出是什么的时候,就是分辨率的最小极限了。

          2)cv::MatchTemplate需要由于是逐个像素点的匹配,需要模板图像的大小与待匹配区域的大小一致方能匹配。如果模板图像的大小过大或过小都会导致匹配紊乱,有一篇关于Multi-scale Template Matching文章可用来解决这个问题:https://www.pyimagesearch.com/2015/01/26/multi-scale-template-matching-using-python-opencv/。文章也提到,如果待匹配图像中如果存在模板旋转或者非仿射变换,opencv的cv::MatchTemplate是行不通的,可接跳转至特征点匹配的方法。

          3)如果受光照因素比较大,用cv::MatchTemplate也是行不通的,因为模板的像素与待匹配图像存在一定灰度距离,此时可以考虑计算模板和待匹配图像灰度梯度边缘后再进行匹配。

         

    二、形状匹配

            opencv中使用cv::MatchShapes,这个就是形状匹配,函数本身写的不错,但是熟练使用此函数的人不多,若优化的好,许多工业应用就不需要再买其他软件了。

     

     

    (借鉴:https://blog.csdn.net/mr_vision/article/details/3999662

    展开全文
  • 我将在写Tracking.cc的博客前,先写一下ORBextractor.cc...三 特征提取和匹配 1. 理论知识  特征点由关键点(Key-point)和描述子(Descriptor)两部分组成。ORB特征点(Oriented FAST and Rotated BRIEF)是由O...

    欢迎交流,本人邮箱jinbo666888@qq.com

    我将在写Tracking.cc的博客前,先写一下ORBextractor.cc、ORBmatcher.cc和Frame.cc。

    三 特征提取和匹配

    1. 理论知识

        特征点由关键点(Key-point)和描述子(Descriptor)两部分组成。ORB特征点(Oriented FAST and Rotated BRIEF)是由Oriented FAST角点和 BRIEF (Binary Robust Independent Elementary Features)描述子构成,其计算速度是sift特征点的100倍,是surf特征点的10倍。

    a.Fast 角点提取

    FAST 是一种角点,主要检测局部像素灰度变化明显的地方,以速度快著称。它的思 想是:如果一个像素与它邻域的像素差别较大(过亮或过暗), 那它更可能是角点。相比于 其他角点检测算法,FAST 只需比较像素亮度的大小,十分快捷。

    提取步骤:

    1. 在图像中选取像素 p,假设它的亮度为 Ip。

    2. 设置一个阈值 T(比如 Ip 的 20%)。

    3. 以像素 p 为中心, 选取半径为 3 的圆上的 16 个像素点。

    4. 假如选取的圆上,有连续的 N 个点的亮度大于 Ip + T 或小于 Ip −T,那么像素 p 可以被认为是特征点 (N 通常取 12,即为 FAST-12。其它常用的 N 取值为 9 和 11, 他们分别被称为 FAST-9,FAST-11)。

    5. 循环以上四步,对每一个像素执行相同的操作。

    为了提高效率,可以采用额外的加速办法。具体操作为,对于每个像素,直接检测邻域圆上的第 1,5,9,13 个像素的亮度。至少有3个和候选点的灰度值同时大于 Ip + T 或小于 Ip −T 时,当前像素才有可能是一个角点,否则应该直接排除。为了提高比较的效率,通常只使用N个周边像素来比较,也就是大家经常说的FAST-N,其中Fast-9,Fast-12使用最多。


    Fast角点本不具有方向,但是由于特征点匹配需要,ORB对Fast角点进行了改进,,改进后的 FAST 被称为 Oriented FAST,具有旋转和尺度的描述。

    尺度不变性是由构建图像金字塔,并在金字塔的每一层上检测角点来实现,这在SLAM十四讲中并没有具体介绍。这里进行介绍。

    高斯金字塔构建:

    •  对图像做不同尺度的高斯模糊

    为了让尺度体现其连续性,高斯金字塔在简单降采样的基础上加上了高斯滤波。将图像金字塔每层的一张图像使用不同参数做高斯模糊,使得金字塔的每层含有多张高斯模糊图像,将金字塔每层多张图像合称为一组(Octave),金字塔每层只有一组图像,组数和金字塔层数相等,使用下列公式计算,每组含有多张(也叫层Interval)图像。另外,降采样时,高斯金字塔上一组图像的初始图像(底层图像)是由前一组图像的倒数第三张图像隔点采样得到的。

    其中M,N为原图像的大小,t为塔顶图像的最小维数的对数值。如,对于大小为512*512的图像,金字塔上各层图像的大小如表3.1所示,当塔顶图像为4*4时,n=7,当塔顶图像为2*2时,n=8。

    • 对图像做降采样(隔点采样)

     

    总结:

    设置一个比例因子scaleFactor(opencv默认为1.2)和金字塔的层数nlevels(pencv默认为8)。将原图像按比例因子缩小成nlevels幅图像。缩放后的图像为:I’= I/scaleFactork(k=1,2,…, nlevels)。nlevels幅不同比例的图像提取特征点总和作为这幅图像的oFAST特征点。

    特征的旋转是由灰度质心法(Intensity Centroid)实现的。下面介绍灰度质心法。

    灰度质心法:

    1. 在一个小的图像块 B 中,定义图像块的矩为: 

    2. 通过矩可以找到图像块的质心:

    3. 连接图像块的几何中心 O 与质心 C,得到一个方向向量 \vec{OC},于是特征点的方向可以定义为: 

    上面公式摘自高翔《视觉SLAM14讲》。但是如果看程序可能还是不懂,来个更直观的公式

     

    其中,图片大小为M*N,(x_{0}y_{0})表示质心,x_{i}表示第i行的坐标,y_{j}表示第j列的坐标,f(i,j)表示第i行第j列的像素值。 

    b.ORB特征匹配

    我们将Fast角点提取出来后,要描述它。否则我们无法进行匹配。ORB采用BRIEF算法来计算一个特征点的描述子。其核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。

    步骤:(此处参考了https://www.cnblogs.com/zjiaxing/p/5616653.html
    1.以关键点P为圆心,以d为半径做圆O。
    2.在圆O内某一模式选取N个点对。这里为方便说明,N=4,实际应用中N可以取512.
    假设当前选取的4个点对如上图所示分别标记为:

    3.定义操作T

    4.分别对已选取的点对进行T操作,将得到的结果进行组合。
    假如:

    则最终的描述子为:1011

    ORB特征点匹配用的是汉明距离,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如1011101 与 1001001 之间的汉明距离是 2。当两个特征点的汉明距离小于设定的阈值时,可以认为匹配。

        与ORB特征的提取和匹配相比SIFT要复杂的多,但是SIFT效果要更好。

    2.代码实现

    ORB-SLAM2中提取ORB特征是由ORBextractor.cc实现的。我们先来看看主要函数。

    static float IC_Angle(const Mat& image, Point2f pt,  const vector<int> & u_max)
    
    //计算特征点的方向,采取的就是我们上面讲的质心法公式
    static void computeOrbDescriptor(const KeyPoint& kpt, const Mat& img, const Point *pattern,uchar* desc)计算ORB描述子
    ORBextractor::ORBextractor(int _nfeatures, float _scaleFactor, int _nlevels,
             int _iniThFAST, int _minThFAST)//提取ORB特征,我写具体点
    {
    
    //定义尺度大小
        mvScaleFactor.resize(nlevels);
        mvLevelSigma2.resize(nlevels);
        mvScaleFactor[0]=1.0f;
        mvLevelSigma2[0]=1.0f;
        for(int i=1; i<nlevels; i++)
        {
            mvScaleFactor[i]=mvScaleFactor[i-1]*scaleFactor;
            mvLevelSigma2[i]=mvScaleFactor[i]*mvScaleFactor[i];
        }
    
        mvInvScaleFactor.resize(nlevels);
        mvInvLevelSigma2.resize(nlevels);
    
        //计算逆尺度大小
        for(int i=0; i<nlevels; i++)
        {
            mvInvScaleFactor[i]=1.0f/mvScaleFactor[i];
            mvInvLevelSigma2[i]=1.0f/mvLevelSigma2[i];
        }
    
        mvImagePyramid.resize(nlevels);
    
    
        mnFeaturesPerLevel.resize(nlevels);
        float factor = 1.0f / scaleFactor;
        //每层要包含的特征点数
        float nDesiredFeaturesPerScale = nfeatures*(1 - factor)/(1 - (float)pow((double)factor, (double)nlevels));
    
        int sumFeatures = 0;
        for( int level = 0; level < nlevels-1; level++ )
        {
            //对上层所包含的特征点数进行求整
            mnFeaturesPerLevel[level] = cvRound(nDesiredFeaturesPerScale);
            //特征点总数
            sumFeatures += mnFeaturesPerLevel[level];
            //下一层所含有的特征点数
            nDesiredFeaturesPerScale *= factor;
        }
        //最大层需要的特征点数=需要的特征点数-其他所有层的特征点总合
        mnFeaturesPerLevel[nlevels-1] = std::max(nfeatures - sumFeatures, 0);
    
        //复制训练的模板
        const int npoints = 512;
        const Point* pattern0 = (const Point*)bit_pattern_31_;
        std::copy(pattern0, pattern0 + npoints, std::back_inserter(pattern));
    
        //This is for orientation
        // pre-compute the end of a row in a circular patch
        // 定义一个vector,用来保存每个v对应的最大坐标u
        umax.resize(HALF_PATCH_SIZE + 1);
    
        // 将v坐标划分为两部分计算,为了确保计算特征主方向的时候,x,y方向对称
        int v, v0, vmax = cvFloor(HALF_PATCH_SIZE * sqrt(2.f) / 2 + 1);
        int vmin = cvCeil(HALF_PATCH_SIZE * sqrt(2.f) / 2);
        const double hp2 = HALF_PATCH_SIZE*HALF_PATCH_SIZE;
        for (v = 0; v <= vmax; ++v)
            umax[v] = cvRound(sqrt(hp2 - v * v)); //勾股定理
    
        // Make sure we are symmetric
        for (v = HALF_PATCH_SIZE, v0 = 0; v >= vmin; --v)
        {
            while (umax[v0] == umax[v0 + 1])
                ++v0;
            umax[v] = v0;
            ++v0;
        }
    
    }
    tatic void computeOrientation(const Mat& image, vector<KeyPoint>& keypoints, const vector<int>& umax)//计算每个关键点的角度
    void ExtractorNode::DivideNode(ExtractorNode &n1, ExtractorNode &n2, ExtractorNode &n3, ExtractorNode &n4)//很多时候图像的容易集中在某个局部,另外有很大一部区域角点很稀疏,这样计算出
    //来的描述子很不理想,为了让角点分布更均匀合理,这里运用四叉树算法对角点进行再分布。将图像以中
    //点为远点划分为四个象限然后分别查看每个象限里面包含的特征点数,如果特征点数大于1,
    //则在该象限继续划分,直到特征点数为1,这样自然会有很多没有特征点的叶子,
    //直接去掉,然后将特征点重新进行分配
    vector<cv::KeyPoint> ORBextractor::DistributeOctTree(const vector<cv::KeyPoint>& vToDistributeKeys, const int &minX,const int &maxX, const int &minY, const int &maxY, const int &N, const int &level)///计算FAST选出来的特征点是否合格
    void ORBextractor::ComputeKeyPointsOctTree(vector<vector<KeyPoint> >& allKeypoints)对影像金字塔中的每一层图像进行特征点的计算。具体计算过程是将影像网格分割成小区域,每一
    //个小区域独立使用FAST角点检测
    //检测完成之后使用DistributeOcTree函数对检测到所有的角点进行筛选,使得角点分布均匀
    //计算描述子
    static void computeDescriptors(const Mat& image, vector<KeyPoint>& keypoints, Mat& descriptors, const vector<Point>& pattern)//计算描述子
    
    
    void ORBextractor::ComputePyramid(cv::Mat image)//建立金字塔,这个我写具体点
    {
        // 计算n个level尺度的图片
        for (int level = 0; level < nlevels; ++level)
        {
            //获取尺度
            float scale = mvInvScaleFactor[level];
            //获取当前尺度下图片的尺寸,根据金字塔模型,层数越高,尺度越大,scale是取的逆尺度因子
            // 所以层数越高,图片尺寸越小
            Size sz(cvRound((float)image.cols*scale), cvRound((float)image.rows*scale));
            Size wholeSize(sz.width + EDGE_THRESHOLD*2, sz.height + EDGE_THRESHOLD*2);
            Mat temp(wholeSize, image.type()), masktemp;
            //图片的初始化
            mvImagePyramid[level] = temp(Rect(EDGE_THRESHOLD, EDGE_THRESHOLD, sz.width, sz.height));
    
            // Compute the resized image
            if( level != 0 )
            {
                resize(mvImagePyramid[level-1], mvImagePyramid[level], sz, 0, 0, INTER_LINEAR);
                // 在图像周围以对称的方式加一个宽度为EDGE_THRESHOLD的边,便于后面的计算
                copyMakeBorder(mvImagePyramid[level], temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD,
                               BORDER_REFLECT_101+BORDER_ISOLATED);            
            }
            else
            {
                //第一张为原图分辨率,无需缩放
                copyMakeBorder(image, temp, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD, EDGE_THRESHOLD,
                               BORDER_REFLECT_101);            
            }
        }
    
    }

    一起看ORBmatcher.cc。。。算了,写下一篇吧,不然太长了!

     

     

     

     

    展开全文
  • 双目视觉——立体匹配基本理论

    万次阅读 2018-06-19 17:35:22
    转载自:https://blog.csdn.net/tanmengwen/article/details/7423067如果空间景物...求取左右像平面之间对应点的过程就是立体匹配。1.视差理论 在计算三维信息坐标时,视差d 的计算具有重要的意义。视差估计在立体...
  • SemiGlobalMatching(SGM),立体匹配经典算法,理论详解教学!
  • SemiGlobalMatching(SGM),立体匹配经典算法,理论详解教学!
  • SemiGlobalMatching(SGM),立体匹配经典算法,理论详解教学!
  • Morse理论:拓扑不变性特征匹配原理

    千次阅读 2016-12-21 13:26:11
    微分拓扑的一个重要分支。通常是指两部分内容:一部分是微分流形上可微函数的莫尔斯理论,即临界点理论;另一部分是变分问题的莫尔斯理论,即大范围变分法。
  • best matches 就是每一张样例的最匹配图片要正确,换言之,输入马,你的最匹配图片也要是马就对了,以此类推  2. retrieved images 就是每一次能匹配到的正确图片数量有提高就可以达到这个要求  3. ...
  • 理论---<url pattern> 匹配规则

    千次阅读 2017-05-16 14:07:02
    在利用servlet或filter进行url请求的匹配时, 很关键的一点是匹配规则, 但是servlet容器中的匹配规则既不是简单的通配 也不是正则表达式 而是有自己的规则 比较容易混淆 绝对路径和相对路径 当浏览器发起...
  • 传输理论指出,通常情况下,传输线传输的电压或电流是由该点的入射波和反射波叠加而成的,或者说是由行波和驻波叠加而成的。 在由信号源及负载组成的微波系统中,如果传输线和负载不匹配,传输线上将形成驻波。有了...
  • 最近总有一个困惑,论文或者说研究中的立体匹配算法和OpenCV中实现的立体匹配算法有什么对应关系,特别是经常看到资料中一谈到OpenCV立体匹配函数,就是BM、SGBM和GC成套的出现,那么这三个算法的理论来源是什么,...
  • AD-Census,立体匹配经典算法,效率高,效果好!
  • ·二分图匹配给定一个二分图G, M为二分图G边集的一个子集, 如果M满足当中的任意一条边都不依附于同一个顶点, 那么层M是G的一个匹配。 · · ·二分图的最大匹配二分图G的众多匹配子图M1, M2, …………Mn中, ...
  • SemiGlobalMatching(SGM),立体匹配经典算法,理论详解教学!
  • 匹配滤波

    千次阅读 2020-09-23 20:45:27
    匹配滤波(matched filtering...从上面的理论推导可以看到,当输出信噪比为最大值的时候,滤波器的传递函数与输入信号的频谱函数满足特定的关系,式2.10就反映了这个关系。满足这种关系的线性滤波器,称之为匹配滤波...
  • PatchMatchStereo,立体匹配经典算法,效果出色!
  • PatchMatchStereo,立体匹配经典算法,效果出色!
  • AD-Census,立体匹配经典算法,效率高,效果好!
  • kinect深度图与彩图匹配

    千次阅读 2017-08-20 13:29:47
    kinect深度图与彩图匹配理论部分参数说明 p_rgb,p_ir分别为彩图、深度图的像素坐标 P_rgb,P_ir分别为彩色摄像头、深度摄像头对应的相机坐标系下的三维点坐标矩阵P=[X,Y,Z]’ X_rgb,Y_rgb,Z_rgb表示彩色摄像头下...
  • 立体匹配

    千次阅读 2019-08-13 10:33:25
    立体匹配是立体视觉研究中的关键部分。其目标是在两个或多个视点中匹配相应像素点,计算视差。通过建立一个能量代价函数,对其最小化来估计像素点的视差,求得深度。 概述 点P和Q,映射到左相机OR像面上的同一点p...
  • 地图匹配实例-几何匹配

    千次阅读 2021-03-14 20:22:50
    由于苦心钻研了好久才弄明白,所以选择了对知识的收费,货真价实:效果图如下...说一下地图匹配的性质,我这个方法是对点的最近的线进行的几何性质的匹配,也就是说垂直映射到最近的线上,不需要的可以无需购买。 ...
  • 1、前两种都是属于模板匹配的方法,这些概念是在《数字图像处理高级应用》里的,其是移动匹配与向量匹配很像,只是移动匹配对灰度变换的鲁棒性不好。 这里说的移动匹配:就是把模板图像在原图像上进行移动,让后计算...
  • opencv 中的暴力匹配和FLANN匹配

    千次阅读 2019-07-06 09:54:09
    最近看图像匹配的内容,特地比较了暴力匹配和基于FLANN的匹配方法,按照理论上讲,FLANN更快一些,但是程序结果显示暴力匹配的方法更快,由于我只用了两幅图像,可能是实验样本太少的缘故吧,代码如下: #include<...
  • PatchMatchStereo,立体匹配经典算法,效果出色!
  • 文章目录一、理论介绍二、代码 一、理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,865
精华内容 63,946
关键字:

匹配理论