Advertisement

2019-9-6 opencv特征检测和描述8-ORB (Oriented FAST and Rotated BRIEF)-FAST特征点和BRIEF描述符的结合

阅读量:

官网参见https://docs.opencv.org/3.4.1/d1/d89/tutorial_py_orb.html

该研究采用基于FAST和BRIEF算法分别实现特征点的检测与描述过程。为了克服传统方法的局限性,在理论分析的基础上进行了实验研究。
通过实验发现,在相同的计算精度要求下,该方法相较于SIFT算法在速度方面提升了至少一个数量级,在性能方面也展现出显著优势。

属于CVT社区的一员(ORBFee),其核心技术源于OpenCV框架(OPENCV)。该算法于2011年首次提出(RBV),主要发表于《 orb: an efficient alternative to sift or surf 》论文中(RBV)。 orb 在计算效率方面显著优于sift/surf(rbv)。(rbv)值得注意的是,在实现上具有明显优势(rbv)。

ORB本质上是将FAST关键点检测与BRIEF关键点描述器相结合,并在此基础上进行了多项改进以提升性能。该方法首先利用FAST算法进行关键点检测,在此基础上通过Harris角点检测筛选出前N个候选关键点。为了更好地提取特征信息,在方法中采用了金字塔结构进行多尺度特征提取(所得特征具有尺度不变性特性)。然而一个主要问题是FAST算法本身无法计算方向信息。如何解决这一问题呢?在方法论部分作者进行了相应的改进与优化。

它确定(FAST检测出)角点所在小块区域(patch)的灰度加权质心位置,并通过从该质心指向角点的空间向量来表征其方向信息。为了增强旋转不变性特性,研究者们建议采用以目标角点为中心、半径设定为r值的圆形区域内各像素的空间矩特征,并据此进一步计算相应的统计量

目前主要采用的是基于关键点的特征描述方法,在本节中我们主要介绍其中一种有效的解决方案——ORB(Oriented FAST and Rotated BRIEF)。然而由于其旋转不稳定性问题,在实际应用中ORBFast算法通过利用关键点方向信息对BRIEF进行了改进。其中它通过在每个特征点(xi,yi)处进行n次二进制测试,并构造一个大小为2×n的矩阵(如图所示),最终得到S包含这些像素坐标的信息。

在这里插入图片描述

然后应用方向θ的小块(patch),从而获得其对应的旋转变换矩阵Rθ;接着进行旋转变换S后,我们就能获得相应的旋转变体版本Sθ

Sθ = RθS

ORB将角度分隔为2π/ 30(12度)等间距,并同时构建预存BRIEF模式对应的索引表。当关键点的方向θ在视图中一致时,则会采用正确的点集合Sθ来生成描述符。

BRIEF具有显著的特性,在每个特征中都表现出较大的方差,并且其均值接近0.5。一旦其沿着关键点方向确定后,则会失去这一特性并变得更为分散。较高的方差使得这些特征能够对输入做出高度敏感的反应。另一个优点是测试之间相互独立,在确定了方向之后每个测试都能为最终结果提供有效的信息支持。

为了应对一系列复杂问题,orb算法通过遍历所有可能的二进制测试并执行贪婪搜索算法,在满足方差和均值接近0.5的前提下筛选出一组不相关性较高的测试指标。这些指标被命名为rBRIEF

对于描述符匹配技术,在ORB算法中采用了经典的优化版本多探针LSH方法进行改进。实验数据显示,在ORB与SURF、SIFT算法相比时,在图像处理速度上具有显著优势;同时在描述特征的精确度方面ORBed算法也优于前两者。特别适用于移动设备环境下进行全景图像拼接应用时, 由于其低功耗特性以及高效的计算能力, ORBed算法表现出优异的性能表现

ORB在opencv中

通常在OpenCV中会调用cv.ORB()函数或通过Feature2D通用接口构造一个ORB对象。该类提供若干可选参数其中nFeature是最常用的一个,默认值设为500用于对特征进行排序的方法包括Harris和FAST(默认采用Harris方法)等另一个重要的参数是WTA_K在OROB(Oriented FAST and Rotated BRIEF)算法中用于确定每个oriented_BRIEF描述符所包含的像素点数量,默认设置为2在这种情况下进行特征匹配时,则应采用NORM_HAMMING范数计算距离当WTA_K设为3或4时则建议将匹配距离设定为NORM_HAMMING2

原文中代码如下

复制代码
    import cv2 
    import numpy as np
    from matplotlib import pyplot as plt
    
    img = cv2.imread('1.jpg',0)
    
    # Initiate ORB detector
    orb = cv2.ORB_create()
    
    # find the keypoints with ORB
    kp = orb.detect(img,None)
    
    # compute the descriptors with ORB
    kp, des = orb.compute(img, kp)
    
    # draw only keypoints location,not size and orientation
    img2 = cv2.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
    plt.imshow(img2), plt.show()
    
    img1 = cv2.drawKeypoints(img, kp, None, color=(255,0,0))
    cv2.imwrite('brief.png',img1)
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

最终结果

在这里插入图片描述

ORB 特征匹配会在后面介绍。

全部评论 (0)

还没有任何评论哟~