OpenCV 4.10.0
开源计算机视觉
|
本章中
我们知道 SIFT 使用 128 维向量来表示描述符。由于它使用浮点数,因此它基本占用 512 字节。同样地,SURF 也至少占用 256 字节(对于 64 维)。为数千个特征创建这样一个向量会占用大量内存,对于资源受限的应用程序而言,这是不可行的,尤其对于嵌入式系统而言。内存越大,匹配所需的时间就越长。
但是所有这些维度可能都不需要实际匹配。我们可以使用多种方法(如 PCA、LDA 等)压缩它。甚至其他方法,如使用 LSH(局部敏感哈希)的哈希,用于将浮点数表示的这些 SIFT 描述符转换成二进制字符串。这些二进制字符串用于通过汉明距离匹配特征。这提供了更好的速度提升,因为查找汉明距离只是应用 XOR 和位计数,这在具有 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 是一种更快的特征描述符计算和匹配方法。它还提供高识别率,除非存在较大的平面旋转。
STAR 是一个源自 CenSurE 的特征检测器。然而,与 CenSurE 使用正方形、六边形和八边形等多边形来逼近一个圆不同,Star 使用 2 个重叠的正方形来模拟一个圆:1 个直立的和 1 个旋转了 45 度的。这些多边形是双层的。它们可以被看作带有粗边框的多边形。边框和封闭区域的权重符号相反。这比其他尺度空间检测器具有更好的计算特性,并且能够实时实现。与 SIFT 和 SURF 相比,SIFT 和 SURF 找到在较大的尺度上会影响精度的子采样像素处的极值,而 CenSurE 在金字塔中使用所有尺度的完整空间分辨率创建特征向量。
下面的代码展示了在 CenSurE 检测器的帮助下计算 BRIEF 描述符。
注意,您需要 opencv contrib) 才能使用此功能。
函数 brief.getDescriptorSize() 给出了以字节为单位使用的 \(n_d\) 大小。默认情况下,它是 32。下一个是匹配,将在另一章节中完成。