原理
- SIFT算法:使用128维描述符,由于浮点数故使用512个字节。
- SURF算法:使用64维描述符,使用256个字节。
- 在嵌入式等资源有限设备上,不适合使用这样耗费大量内存和时间的算法。
- 降维方法:PCA,LDA。用LSH(局部敏感哈希)将SIFT浮点数描述符转换为二进制字符串,再对字符串使用汉明距离匹配。
- 汉明距离计算:只需进行XOR位运算和位计数,适用于现代CPU上。哈希使用的前提是找到描述符,仍无法解决内存消耗问题。
- BRIEF算法:**直接找到二进制字符串而不计算描述符,使用已经平滑后的图像。 算法按照特定方式选取一组像素点对nd(x,y),在像素点对间进行灰度值对比。得到nd维的二进制字符串。**nd可取值128,256,512位.默认256.
- BRIEF是特征描述符,不提供查找特征的方法,必须使用其他的特征检测器(SIFT,SURF,CenSurE较快且兼容性关键点描述效果好)。BRIEF是一种对特征点描述符计算和匹配的快速方法,不出现平面内大旋转情况下可实现高识别率。
代码演示
下列代码使用CenSurE特征检测器(OpenCV中称为STAR检测器)和BRIEF描述符。
#coding=utf-8
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('./image2/mario.jpg',0)
star=cv2.FeatureDetector_create('STAR')#初始化STAR特征检测器
brief=cv2.DescriptorExtractor_create('BRIEF')#初始化BRIEF描述符
kp=star.detect(img,None) #找到STAR的关键点
kp,des=brief.compute(img,kp) #计算BRIEF描述符
print(brief.getInt('bytes'))
print(des.shape)