Advertisement

OpenCV基础教程——特征提取与描述(BRIEF、ORB )

阅读量:

BRIEF(Binary Robust Independent Elementary Features)


目标:

本章节你需要学习以下内容:

复制代码
    *我们将看到BRIEF算法的基础知识
    
    
      
    
    代码解读

1、理论

该系统采用SIFT算法,并基于128维向量进行特征描述;其中因为采用浮点数运算特性,因此每个特征单元占用512个字节存储空间;与之相比,SURF算法采用64维向量表示,并最少占用256个字节用于存储每个特征单元;构建一个包含数百甚至上千个特征单元的数据集将占用大量内存资源,在资源受限的应用场景中如嵌入式系统中这样的操作显得力不从心;在实际应用中匹配过程不仅会占用额外内存空间还会显著延长处理所需时间

在实际应用中,过多的维度往往显得多余.通过主成分分析(PCA)和线性判别分析(LDA)等技术手段可以实现降维.此外,在处理高维数据时,利用局部敏感哈希(LSH)将SIFT特征向量转换为二进制码更为高效.随后,在比较相似度时采用汉明距离来评估这些二进制码之间的差异程度.计算汉明距离的过程仅涉及XOR位运算和统计差异位的数量.然而,在这一过程中仍需先提取出特征描述符才能应用哈希方法;尽管如此仍无法从根本上解决初始阶段所面临的内存占用问题.

BRIEF 应运而生。它未进行计算而是直接定位了一组二进制字符串序列。这种算法基于预处理后的图像,在其中选取一系列像素点对 n_d(x,y)并对其进行对比操作。其对应的灰度值分别为 p 和 q;如果前者小于后者,则结果标记为1;反之则标记为0。

其中 n 和 d 的取值可以是 128、256 和 512;OpenCV 对于所有这些数值均提供相应的支持,在其默认设置中选择的是 256(因为 OpenCV 使用字节来表示其参数范围),因此对应的数值分别为不同的扩展程度;一旦我们获得了这些二进制字符串序列,则可以通过计算汉明距离来进行匹配处理。

一项关键要点是:BRIEF 被视为一种特征描述符,并不具备用于查找特定特征的方法。因此,在缺乏这一功能的情况下,默认情况下我们无法直接依赖这种方法来完成相关任务。鉴于此原因,在实际应用中通常会采用 SIFT 或者 SURF 这样的替代方案来完成类似的任务需求。值得特别指出的是,在学术界普遍建议采用 CenSurE 作为一种高效的算法来取代传统方法,并且该算法在处理这类问题时展现出显著的优势。值得注意的是,在描述准确性方面,在与 SURF 的关键点提取相比,在某些情况下表现更为突出。从简化的角度看,则是一种高效的关键点提取与匹配算法能够达到很高的识别精度,并且只有当出现平面内较大的旋转时才可能出现识别上的不足。

2、OpenCV中的BRIEF

这段代码展示了借助于CenSurE探测器来计算BRIEF描述符的过程。(需要注意括号内的内容是否需要改动)

请注意,你需要opencv contrib才能使用它。

复制代码
    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    
    img = cv.imread('simple.jpg',0)
    
    # Initiate FAST detector
    star = cv.xfeatures2d.StarDetector_create()
    
    # Initiate BRIEF extractor
    brief = cv.xfeatures2d.BriefDescriptorExtractor_create()
    
    # find the keypoints with STAR
    kp = star.detect(img,None)
    
    # compute the descriptors with BRIEF
    kp, des = brief.compute(img, kp)
    
    print( brief.descriptorSize() )
    print( des.shape )
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

该函数brief.getDescriptorSize()返回n_d值(用字节表示)。其默认值设置为32。该问题将在下一章进行解决。

ORB (Oriented FAST and Rotated BRIEF)


目标:

本章节你需要学习以下内容:

复制代码
    *我们将看到ORB算法的基础知识
    
    
      
    
    代码解读

1、理论

作为OpenCV粉丝而言,在选择算法时关键点在于其来源

OR-B结合了基于FAST的关键点检测与简短描述符的技术,并经过一系列优化措施来提升性能。首先采用FAST算法进行关键点定位后,在筛选出的关键点中应用Harris角点检测方法筛选出前N个关键点;随后又利用金字塔结构构建多分辨率特征金字塔以获取不同尺度下的表征信息;然而一个关键问题是该算法未考虑目标方向信息;这导致无法实现旋转不变性;为此作者提出了一系列改进措施

该算法通过加权平均的方法确定每个贴片的质量中心位置,并将其置于图像中心区域的一个角落。
向量从角点指向质量中心的位置即代表了物体朝向的方向。
为了提高旋转不变性特性,在计算各坐标轴矩时采用了局部区域的方法。具体而言,在每个贴片区域内选取一个半径为r的小圆作为积分范围。

目前,在描述符领域中

ORB通过将角度划分为每12度(即每2 \pi /30弧度)的不同增量,并生成预先计算出的简洁模板查找表。当关键点方向θ在各个视图中保持一致时,则会采用正确的点集S_\theta来计算其描述符。

BRIEF具備一个显著的特性,即每位特徵都显示出较高的方差,其平均值位於约0.5的位置。一旦朝著關鍵點方向定向,它的这种属性会被放弃,并且变得更为分散。高度的差异化增强了特徵的分辨能力,使其对输入产生不同的反应。另一个 advantageous characteristic is that the tests are uncorrelated, as each test has a distinct impact on the outcome results. To address these issues, ORB employs a greedy search algorithm within the realm of binary tests to identify the optimal combination of features characterized by high variance and an average value near 0.5, ensuring that these selected features are uncorrelated and collectively form rBRIEF

在描述符匹配领域中, 采用改进型的传统LSH算法实现多探测LSH技术. 研究表明, 在速度方面, ORB显著优于SURF. 与传统的SIFT描述符相比, ORB在表示能力上表现出明显优势. ORBFOW(Open Source Wendy)算法特别适合应用于低功耗设备如智能手机和平板电脑等场景下的全景拼接任务.

2、OpenCV中的ORB

如同以往般的情景下

下面是一个简单的代码,显示了ORB的用法。

复制代码
    import numpy as np
    import cv2 as cv
    from matplotlib import pyplot as plt
    
    img = cv.imread('simple.jpg',0)
    
    # Initiate ORB detector
    orb = cv.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 = cv.drawKeypoints(img, kp, None, color=(0,255,0), flags=0)
    plt.imshow(img2), plt.show()
    
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

结果如下图所示:

image20

全部评论 (0)

还没有任何评论哟~