OpenCV-Python BRIEF(二进制鲁棒独立基本特征)

在这一章当中

  • 我们将看到 BRIEF 算法的基础知识

BRIEF 算法理论

我们知道 SIFT 使用 128 维向量作为描述子。由于它使用浮点数,因此需要 512 个字节。类似地,SURF 也至少需要 256 个字节(对于 64 维描述子)。为数千个特征点创建这样的向量需要大量的内存,这在资源有限的情况下是不可行的,特别是嵌入式系统。内存越大,匹配所需的时间越长。

但实际匹配时可能不需要所有的维度。我们可以使用 PCA,LDA 等几种方法对其进行压缩。甚至使用 LSH(Locality Sensitive Hashing,局部敏感哈希)等其他方法也可以将浮点数格式的这些 SIFT 描述子转换为二进制字符串。对这些二进制字符串使用汉明距离进行匹配。这样速度更快,因为计算汉明距离只需要进行异或和位计数,这在具有 SSE 指令的现代 CPU 中非常快。但是我们仍然需要先找到描述符,然后才能应用哈希方法,这并不能解决我们在内存上的初始问题。

这就需要 BRIEF 算法。它提供了直接查找二进制字符串而无需找到描述子的快捷方式。它采用平滑后的图像,并以特定的方式(在文中解释)选择一组n_d(x,y)位置对。然后在这些位置对上进行一些像素强度比较。例如,让第一个位置对为pq。如果I(p)\lt I(q),则其结果为 1,否则为 0。对所有n_d位置对进行对比以获得n_d维二进制字符串。

n_d可以是 128,256 或 512\。OpenCV 支持所有这些值,但默认情况下,它是 256(OpenCV 以字节表示它,所以这些值将对应 16,32 和 64)。获得这些二进制字符串后就可以使用汉明距离进行匹配。

重要的一点是,BRIEF 是一个特征点描述子,它没有提供任何方法来查找这些特征点。所以你必须使用任何其他特征检测器,如 SIFT,SURF 等。本文建议使用 CenSurE,这是一个快速检测器,而且 BREIF 算法对于 CenSurE 特征点的效果比 SURF 特征点稍微好。

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

OpenCV 中的 BRIEF

下面的代码展示了在 CenSurE 检测器的帮助下计算 BRIEF 描述子的方法。 (CenSurE 探测器在 OpenCV 中被称为 STAR 探测器)

请注意,您需要 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。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程