OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
未找到匹配项
BRIEF(二进制鲁棒独立基本特征)

目标

本章内容

  • 我们将了解BRIEF算法的基础知识。

理论

我们知道SIFT使用128维向量作为描述符。由于它使用浮点数,因此基本上需要512字节。类似地,SURF也至少需要256字节(对于64维)。为数千个特征创建这样的向量需要大量的内存,这对资源受限的应用程序(尤其是嵌入式系统)来说是不可行的。内存越大,匹配所需的时间就越长。

但是,所有这些维度对于实际匹配可能并非都是必需的。我们可以使用多种方法(如PCA、LDA等)对其进行压缩。甚至可以使用LSH(局部敏感哈希)等其他方法将这些浮点数的SIFT描述符转换为二进制字符串。这些二进制字符串用于使用汉明距离进行特征匹配。这提供了更好的加速,因为查找汉明距离只需要应用异或和位计数,这在具有SSE指令的现代CPU中非常快。但是在这里,我们需要先找到描述符,然后才能应用哈希,这并没有解决我们最初的内存问题。

BRIEF此时就派上用场了。它提供了一种快捷方式来直接查找二进制字符串,而无需查找描述符。它采用平滑的图像块,并以独特的方式(在论文中解释)选择一组\(n_d\)个(x,y)位置对。然后对这些位置对进行一些像素强度比较。例如,让第一个位置对为\(p\)和\(q\)。如果\(I(p) < I(q)\),则其结果为1,否则为0。这将应用于所有\(n_d\)个位置对,以获得一个\(n_d\)维位串。

这个\(n_d\)可以是128、256或512。OpenCV支持所有这些,但默认情况下它为256(OpenCV以字节表示它。因此值将为16、32和64)。一旦得到这个,就可以使用汉明距离来匹配这些描述符。

需要注意的是,BRIEF是一种特征描述符,它不提供任何查找特征的方法。因此,您必须使用其他特征检测器,如SIFT、SURF等。论文建议使用CenSurE,它是一种快速的检测器,并且BRIEF对于CenSurE点甚至比对于SURF点略好。

简而言之,BRIEF是一种更快的特征描述符计算和匹配方法。除非存在较大的平面内旋转,否则它也能提供较高的识别率。

OpenCV中的STAR(CenSurE)

STAR是从CenSurE派生的特征检测器。然而,与CenSurE使用正方形、六边形和八边形等多边形逼近圆形不同,STAR使用两个重叠的正方形模拟圆形:一个直立的和一个旋转45度的。这些多边形是双层级的。它们可以看作具有粗边框的多边形。边框和封闭区域具有相反符号的权重。这比其他尺度空间检测器具有更好的计算特性,并且能够实现实时处理。与在子采样像素处查找极值的SIFT和SURF相反,CenSurE使用金字塔中所有尺度的全空间分辨率创建特征向量。

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', cv.IMREAD_GRAYSCALE)
# 初始化FAST检测器
star = cv.xfeatures2d.StarDetector_create()
# 初始化BRIEF提取器
brief = cv.xfeatures2d.BriefDescriptorExtractor_create()
# 使用STAR查找关键点
kp = star.detect(img,None)
# 使用BRIEF计算描述符
kp, des = brief.compute(img, kp)
print( brief.descriptorSize() )
print( des.shape )
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
从文件加载图像。

函数`brief.getDescriptorSize()`给出以字节为单位的\(n_d\)大小。默认值为32。下一个是匹配,这将在另一章中进行。

更多资源

  1. Michael Calonder, Vincent Lepetit, Christoph Strecha, and Pascal Fua, "BRIEF: Binary Robust Independent Elementary Features", 11th European Conference on Computer Vision (ECCV), Heraklion, Crete. LNCS Springer, September 2010.
  2. LSH(局部敏感哈希)维基百科。