内容来自OpenCV-Python Tutorials 自己翻译整理
目标:
了解BRIEF算法的基本原理
原理:
在SIFT算法使用128维的描述符,因为使用float类型描述,所以需要512字节的内存。
在SURF算法中,以64维描述符来计算,至少需要256字节的内存。
在创建一个含有数千个特征的向量会消耗大量的内存,这种情况在资源的有限的设备上不实用,尤其是嵌入式设备。 此外,计算时间也非常漫长。
但是在实际的匹配过程中,不是所有的维数都需要。我们可以使用一些方法来对维数进行压缩,例如PCA(主成分分析)算法,和LDA(线性判别式分析)算法等等。甚至使用LSH(局部敏感哈希)算法,把SIFT的描述符从浮点数类型转化成二进制字符串,然后对这些字符串使用汉明距离来进行匹配。由于韩明距离的计算方法只需要使用亦或位运算和位计数,在带有SSE指令的现代的CPU上计算速度很快。
不过,在此我们需要先找到描述符,然后才能使用哈希,进而计算汉明距离。不过这样没解决内存过大的问题。
BRIEF算法由此产生,该算法提供了一个很简介的手段在不寻找描述符的情况下,去寻找二进制字符串。
大致过程如下
首先找到特征点,在特征点附近划定一个正方形区域,使用高斯平滑去掉噪声。接下来,使用一种算法,在正方形区域当中选定一对点(x,y) ( x , y ) ,例如x点的像素值是p,y点是q,如果p小于q,那么结果产生结果1,否则产生结果0,如下下来寻找n对点,就会得到n维的二进制字符串。
维度可以是128,256,512,默认值256。
在得到二进制字符串后,就可以使用汉明距离来匹配这些描述符了。
这里注意,BRIEF算法不提供特征点检测功能,所以需要使用其他的特征检测器来找到特征点,例如SIFT算法或者SURF算法等等。本文腿甲你使用CenSurE检测算法来寻找特征点,最重要的是CenSurE检测算法配合BRIEF算法效果要比使用SURF算法效果更好。
SURF算法在没有选择的图像当中,匹配效果非常好。而且速度快,使用资源低,在有选择的图像当中,效果很差。
关于BRIEF的原版论文和CenSurE检测器的论文
OpenCV中的BRIEF算法
在OpenCV中CenSurE检测器叫做STAR
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('1.jpg',0)
# 初始化STAR检测器
star = cv2.xfeatures2d.StarDetector_create()
# 初始化BRIEF特征提取器
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
# 使用STAR寻找特征点
kp = star.detect(img,None)
# 计算特征描述符
kp, des = brief.compute(img, kp)
img = cv2.drawKeypoints(img,kp,img,color=(255,0,0))
cv2.imshow('p',img)
cv2.waitKey(0)
print( brief.descriptorSize() )
print( des.shape )
STAR检测器文档
https://docs.opencv.org/master/dd/d39/classcv_1_1xfeatures2d_1_1StarDetector.html
BRIEF的文档
https://docs.opencv.org/master/d1/d93/classcv_1_1xfeatures2d_1_1BriefDescriptorExtractor.html